Java 如何优化这段代码,使一组圆的轮廓显示出来?

Java 如何优化这段代码,使一组圆的轮廓显示出来?,java,for-loop,optimization,Java,For Loop,Optimization,我有一个单位对象数组,单位对象有中心cx、cy和半径cr。我只想显示圆的轮廓(想象一个没有重叠位的维恩图)。我设法做到了,但由于它是一个嵌套的for循环,所以速度非常慢。代码如下: (这是一种循环所有单元的方法) ArrayList validangles=new ArrayList(); public void getValidAngles(ArrayList单位){//获取所有不重叠的角度 ArrayList invalidAngles=新的ArrayList(); 对于(int i=0;i

我有一个单位对象数组,单位对象有中心cx、cy和半径cr。我只想显示圆的轮廓(想象一个没有重叠位的维恩图)。我设法做到了,但由于它是一个嵌套的for循环,所以速度非常慢。代码如下:

(这是一种循环所有单元的方法)

ArrayList validangles=new ArrayList();
public void getValidAngles(ArrayList单位){//获取所有不重叠的角度
ArrayList invalidAngles=新的ArrayList();
对于(int i=0;i

问题是,如果我有超过几百个单位,这将是常见的,它会减慢程序一吨,因为嵌套一个forloop的单位在另一个forloop的单位

可以使用Area类组合椭圆(每个椭圆表示单位形状)。例如

然后您可以使用总和区域作为轮廓。参见工作示例

  ArrayList<Integer> validangles = new ArrayList<Integer>();

  public void getValidAngles(ArrayList<Unit> units) { //get all the angles that aren't overlapping
    ArrayList<Integer> invalidAngles = new ArrayList<Integer>();
    for (int i = 0; i < units.size(); i++) { //cycle through all other units
        Unit c2 = units.get(i);
        if (this != c2) { //make sure it is not the same unit
            for (int ia = 0; ia < 360; ia += 10) { //cycle through the angles
                double ca = Math.toRadians(ia);
                Point p = new Point( //point on the circle
                        (int) Math.round((c2.getCx() + (cr * Math.cos(ca)))),
                        (int) Math.round((c2.getCy() + (cr * Math.sin(ca)))));
                if (overlapping(p)) {
                    invalidAngles.add(ia-180); //this angle should not be shown
                }
            }
        }

    }
    validangles.clear();
    for (int i = 0; i < 360; i += 10) {
        if (!invalidAngles.contains(i-180)) {
            validangles.add(i-180);
        }

    }
}

public void drawValidAngles(Graphics g2) {

    for(int i : validangles) {
        int x = (int)Math.round(cx+cr*Math.cos(Math.toRadians(i)));
        int y = (int)Math.round(cy+cr*Math.sin(Math.toRadians(i)));
        g2.drawLine(x, y, x, y);
    }
}
    Shape s=new Ellipse2D.Float(10,10,200,100);
    Area a=new Area(new Ellipse2D.Float(150,20,100,200));
    a.add(new Area(s));