gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 00:56:02 25 4
gpt4 key购买 nike

我有一个单位对象数组,单位对象的中心为 cx、cy 和半径为 cr。我只想显示圆圈的轮廓(想想没有重叠位的文图)。我设法做到了,但是由于它是一个嵌套的 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 单元。

最佳答案

您可以使用 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

关于java - 如何优化此代码以仅显示圆圈数组的轮廓?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29665376/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com