如何优化此代码以仅显示圆形数组的轮廓?

Posted

技术标签:

【中文标题】如何优化此代码以仅显示圆形数组的轮廓?【英文标题】:How to optimize this code to make just the outline of an array of circles show? 【发布时间】:2015-06-22 07:23:45 【问题描述】:

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

(这都是一个循环遍历所有单元的方法)

  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);
    

问题是,如果我有几百个以上的单元,这很常见,由于将一个单元的 forloop 嵌套在另一个单元的 forloop 中,它会减慢程序的速度。

【问题讨论】:

【参考方案1】:

您可以使用 Area 类来组合椭圆(每个椭圆代表 Unit 形状)。例如

    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));

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

【讨论】:

以上是关于如何优化此代码以仅显示圆形数组的轮廓?的主要内容,如果未能解决你的问题,请参考以下文章

IOS Spritekit:圆形轮廓未显示

Google Material 图标、轮廓、圆形、双色调、锐利集不起作用

OpenCV 轮廓周围绘制矩形框和圆形框

设置UIBarButtonItem为圆形图像轮廓。

如何裁剪轮廓的内部区域?

Plotly:如何以 Root 样式绘制直方图,仅显示直方图的轮廓?