Draw Venn Diagram Demo
Below is a image showing the generation of a Venn Diagram using an arbitrary number of classes.
Source code
The source code used for generating the above figure is given below.
/* file : DrawVennDiagram.java
*
* Project : Euclide
*
* ===========================================
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 2.1 of the License, or (at
* your option) any later version.
*
* This library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE.
*
* See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library. if not, write to :
* The Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307, USA.
*
* Created on 1 avr. 2007
*
*/
import java.awt.*;
import javax.swing.*;
import math.geom2d.Box2D;
import math.geom2d.Point2D;
import math.geom2d.Vector2D;
import math.geom2d.conic.Circle2D;
import math.geom2d.conic.CircleArc2D;
import math.geom2d.curve.PolyCurve2D;
import math.geom2d.line.StraightLine2D;
public class DrawVennDiagram extends JPanel{
private static final long serialVersionUID = 7331324136801936514L;
double x0 = 300;
double y0 = 200;
double r0 = 100;
public DrawVennDiagram() {
super();
}
public void paintComponent(Graphics g){
// origin
Point2D origin = new Point2D(x0, y0);
// Orthogonal lines
StraightLine2D lineX = new StraightLine2D(origin, new Vector2D(1, 0));
StraightLine2D lineY = new StraightLine2D(origin, new Vector2D(0, 1));
// center circle
Circle2D c0 = new Circle2D(x0, y0, r0);
// intersection points of main circle with diagonals
double tc0 = Math.PI/4;
double tc1 = Math.PI/2+Math.PI/4;
double tc2 = Math.PI+Math.PI/4;
double tc3 = 3*Math.PI/2+Math.PI/4;
Point2D pc0 = c0.getPoint(tc0);
Point2D pc1 = c0.getPoint(tc1);
Point2D pc2 = c0.getPoint(tc2);
Point2D pc3 = c0.getPoint(tc3);
// compute right circle
StraightLine2D tangentC0 = new StraightLine2D(pc0, c0.getTangent(tc0));
StraightLine2D tangentC1 = new StraightLine2D(pc1, c0.getTangent(tc1));
StraightLine2D tangentC2 = new StraightLine2D(pc2, c0.getTangent(tc2));
StraightLine2D tangentC3 = new StraightLine2D(pc3, c0.getTangent(tc3));
// center of first circle of curve number 'd'
Point2D pcd0 = tangentC0.getIntersection(tangentC3);
Point2D pcd1 = tangentC1.getIntersection(tangentC0);
Point2D pcd2 = tangentC2.getIntersection(tangentC1);
Point2D pcd3 = tangentC3.getIntersection(tangentC2);
// circles of curve D
Circle2D cd0 = new Circle2D(pcd0, pcd0.getDistance(pc0));
Circle2D cd1 = new Circle2D(pcd1, pcd1.getDistance(pc1));
Circle2D cd2 = new Circle2D(pcd2, pcd2.getDistance(pc2));
Circle2D cd3 = new Circle2D(pcd3, pcd3.getDistance(pc3));
// circle arcs
CircleArc2D cad0 = new CircleArc2D(cd0,
cd0.getPosition(pc3), cd0.getPosition(pc0), true);
CircleArc2D cad1 = new CircleArc2D(cd1,
cd1.getPosition(pc0), cd1.getPosition(pc1), false);
CircleArc2D cad2 = new CircleArc2D(cd2,
cd2.getPosition(pc1), cd2.getPosition(pc2), true);
CircleArc2D cad3 = new CircleArc2D(cd3,
cd3.getPosition(pc2), cd3.getPosition(pc3), false);
// Create curve d
PolyCurve2D cd = new PolyCurve2D(
new CircleArc2D[]{cad0, cad1, cad2, cad3});
Graphics2D g2 = (Graphics2D) g;
Box2D box = new Box2D(10, 590, 10, 390);
g2.setColor(Color.BLUE);
g2.setStroke(new BasicStroke(1.0f));
g2.setRenderingHint(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
lineX.clip(box).draw(g2);
lineY.clip(box).draw(g2);
c0.draw(g2);
cd.draw(g2);
PolyCurve2D ce = this.createVennCurve(4);
ce.draw(g2);
PolyCurve2D cf = this.createVennCurve(5);
cf.draw(g2);
PolyCurve2D cg = this.createVennCurve(6);
cg.draw(g2);
// g2.draw(cad0);
// g2.draw(cad1);
// g2.draw(cad2);
// g2.draw(cad3);
}
private PolyCurve2D createVennCurve(int level){
// center circle
Circle2D c0 = new Circle2D(x0, y0, r0);
// number of points, and circle arcs
int n = (int) Math.pow(2, level-1);
// Compute intersection points, and circle tangents
double[] positions = new double[n];
Point2D[] points = new Point2D[n];
StraightLine2D[] tangents = new StraightLine2D[n];
for(int i=0; i result = new PolyCurve2D(arcs);
return result;
}
public final static void main(String[] args){
JPanel panel = new DrawVennDiagram();
panel.setPreferredSize(new Dimension(600, 500));
JFrame frame = new JFrame("Draw Venn Diagram demo");
frame.setContentPane(panel);
frame.pack();
frame.setVisible(true);
}
}
back to demos page