1

这更像是一个有趣的实验而不是一个问题,我更好奇是什么原因造成的。

我正在生成 2D 点,存储为浮点数,以便在模式中绘制一组线条。生成新点时,我复制最后一个点,并根据航向 (x += cos(heading), y += sin(heading)) 将其移动到某个方向。航向也存储为浮点数。我以给定的速率(例如 90 度)更改航向,这意味着每个新点要么与最后一个点平行,要么与之成直角。

这是可行的,但经过多次(1000 次)迭代后,图案的外边缘开始变得稍厚,然后新绘制的点开始在稍微歪斜(但一致)的位置移动。然后整个图案开始旋转。

我很好奇的是不应该打破的东西如何打破。我最好的猜测是标题(一个不断减小的浮点数)在达到一定大小时会失去定义。

本质上,代码(用于生成下面的确切模式)看起来像这样

float distance = 25;
int theta = 90;
float heading = 0;

    public static void main(String[] args) {
    turnLeft();
    func();
    turnRight();
    func();
    turnRight();
    turnRight();
    func();
}

public void func() {
    drawForward();
    turnRight();
    drawForward();
    turnRight();
    turnRight();
    drawForward();
    turnRight();
    drawForward();
    drawForward();
}

    public void turnLeft() {
    heading += degToRad(theta);
}

public void turnRight() {
    heading -= degToRad(theta);
}

public float degToRad(float degrees) {
    return (float) (degrees * (Math.PI / 180.0));
}

public void drawForward() {
    FPoint newFp = new FPoint(array[array.length - 1]); //copy last point

    movePoint(newFp, (float) (distance * Math.cos(heading)),
            (float) (distance * Math.sin(heading)));

    appendPoint(newFp); //add point to end of array

}

public void movePoint(FPoint fp, float x, float y) {
    fp.x += x;
    fp.y += y;
}

对此事的任何想法将不胜感激!

4

1 回答 1

1

当你向前和向后移动时,看看你是否在完全相同的地方。如果您不在同一位置,则从每次向前移动中减去一半的差异。

这可能与计算的数值稳定性精度有关。http://en.wikipedia.org/wiki/Numerical_stability

由于您没有后退,您只需使用 forward + right + forward +right .... 直到到达起始位置,然后减去如果它与起始值不同。然后将其用作偏移误差值来减去(但首先将误差除以移动次数)(当然会像 "FRFRFRFECC" )

这称为BFECC来回纠错补偿。如果是关于不可避免的错误,则大大减少错误。

我看到有人在 Zalesak 的 Turning Disk 上测试 BFECC,以查看磁盘在数千次旋转迭代后是否损坏。

于 2012-08-29T19:02:55.473 回答