有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    第一种方法(基于边界框)是一个良好的开端。但现在只需要添加一个条件,检查边界框内的每个点是否也在圆中

    比如:

    for each (point p inside bounding-box) {
        if (p inside circle centred at k) {
            cutBlade(p);
        }
    }
    

    您可以通过注意边界框的每一行(或每一列)中,需要剪切的刀片集都是相邻的来改进这一点。如果你计算这个范围的终点,那么你不需要任何条件

    比如:

    for each (x inside bounding-box) {
        calculate y_first;
        calculate y_last;
        for (y = y_first; y < y_last; y++) {
            cutBlade(x,y);
        }
    }