java计算圆中的每个笛卡尔点
我有一个数组:int[]lawn=new int[980][1280]
wich存储草坪中叶片高度的值
在我的模拟中,我有一个机器人,它绕着草坪走,切割刀片
我的机器人是一个直径(直径)的圆。 坐标系是双精度的,我的草坪是整数
我开发了两种“算法”,允许机器人修剪草坪,但我不满意,因为我的算法精度不够高,性能也不够好
我的问题是,除了我已经想到的想法之外,还有其他方法可以做到这一点吗
还是我需要改变草坪的实施方式以获得更好的效果
如果我不够清楚,请随时提问
这是我的两个算法的代码(k代表机器人),centerPosition返回我的机器人的中心(所以是圆的中心)
approach with square
int bottomLeftCornerX = (int) (k.getCenterPosition().getX() - simulParams.getKDiameter() / 2);
int bottomLeftCornerY = (int) (k.getCenterPosition().getY() - simulParams.getKDiameter() / 2);
for (int i = bottomLeftCornerX; i < bottomLeftCornerX + simulParams.getKDiameter(); i++) {
for (int j = bottomLeftCornerY; j < bottomLeftCornerY + simulParams.getKDiameter(); j++) {
((LawnArea) lawn.getBladeHeight()).cutBladeInArea(j, i);
}
}
这里有一个循环方法(基本上是维基百科中的循环引用公式…):
for (int r = 0; r < simulParams.getKDiameter() / 2; r++) {
for (double t = 0; t < 2 * Math.PI; t = t + 0.1) {
Point2D p = circumference(k.getCenterPosition().getX(), k.getCenterPosition().getY(), t, r);
int intX = (int) Math.ceil(p.getX());
int intY = (int) Math.ceil(p.getY());
((LawnArea) lawn.getBladeHeight()).cutBladeInArea(intY, intX);
}
}
}
# 1 楼答案
第一种方法(基于边界框)是一个良好的开端。但现在只需要添加一个条件,检查边界框内的每个点是否也在圆中
比如:
您可以通过注意边界框的每一行(或每一列)中,需要剪切的刀片集都是相邻的来改进这一点。如果你计算这个范围的终点,那么你不需要任何条件
比如: