问题是这样的:利用两个圆来实现集合里面的文氏图,1.现两个圆相交后如何获取相交区域,然后对其进行不同颜色的填充? 2,另外两个圆不相交的区域是否也能获取。  各位给个思路,在下想了很久都没想到~~谢谢了!

解决方案 »

  1.   

    圆A(Xa,Ya,Ra),圆B(Xb,Yb,Rb),相交的充要条件是,(Xa-Xb)^2+(Ya-Yb)^2≤(Ra+Rb)^2,等于时相切。
    先画圆,相交时,你取中点((Xa+Xb)/2,(Ya+Yb)/2)去填充,应该就ok了。
      

  2.   

    构造一个圆对象,java.awt.geom.Ellipse2D
    再用它构造
    java.awt.geom.Area
    这个类中有计算几何图形交集,差集的的方法,得到的是Area对象
    在用Graphics2D的fill(Shape s)方法分别填充不就行了
      

  3.   

    我也正在训练这个CAD画图功能的项目,刚开始 ,还没考虑相交的情况呢~~ 关注~~·
      

  4.   

    看一下 api里的
    java.awt.geom
    类 Areajava.lang.Object
       - java.awt.geom.Area想知道怎么实现看 java代码吧
      

  5.   

    import java.awt.BorderLayout;
    import java.awt.Canvas;
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.geom.Area;
    import java.awt.geom.Ellipse2D;
    import javax.swing.JFrame;
    class Viewer extends Canvas { private static final long serialVersionUID = -6628619675269538157L; private Color cep;
    private Color ce1;
    private Color ce2;
    private Area a1;
    private Area a2;
    private Area ap; public Viewer(Ellipse2D e1, Ellipse2D e2) {
    if (e1 == null) throw new NullPointerException("e1 is null");
    if (e2 == null) throw new NullPointerException("e2 is null");
    this.a1 = new Area(e1);
    this.a2 = new Area(e2);
    Area t1 = (Area) a1.clone();
    Area t2 = (Area) a2.clone();
    this.a1.subtract(t2);
    this.a2.subtract(t1);
    t1.intersect(t2);
    this.ap = t1;
    this.cep = Color.MAGENTA;
    this.ce1 = Color.RED;
    this.ce2 = Color.BLUE;
    } public void paint(Graphics g) {
    super.paint(g);
    if (this.a1 == null || this.a2 == null || this.ap == null) return;
    Graphics2D g2d = (Graphics2D) g;
    g2d.setColor(this.ce1);
    g2d.fill(this.a1);
    g2d.setColor(this.ce2);
    g2d.fill(this.a2);
    g2d.setColor(this.cep);
    g2d.fill(this.ap);
    } public void update(Graphics g) {
    paint(g);
    }}
    public class Test { public static void main(String[] args) {
    JFrame frm = new JFrame("Test");
    Ellipse2D e1 = new Ellipse2D.Double(10.0, 10.0, 160.0, 160.0);
    Ellipse2D e2 = new Ellipse2D.Double(110.0, 60.0, 190.0, 190.0);
    Viewer vwr = new Viewer(e1, e2);
    frm.getContentPane().add(vwr, BorderLayout.CENTER);
    frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frm.setBounds(60, 60, 320, 290);
    frm.setVisible(true);
    }}