gpt4 book ai didi

java - 连续旋转一个三角形

转载 作者:行者123 更新时间:2023-11-30 07:08:08 27 4
gpt4 key购买 nike

我有一个 float[] newCoords 变量,它的大小为 9。前 3 个条目代表一个顶点,接下来的 3 个代表第二个顶点,最后 3 个代表最后一个顶点。

我有一些代码可以在输入坐标时在空间中的任何位置旋转三角形。它看起来像这样:

float s = (float) Math.sin(0.5);
float c = (float) Math.cos(0.5);

float[] centroid = getCentroid(newCoords);

newCoords[0] -= centroid[0];
newCoords[1] -= centroid[1];
newCoords[3] -= centroid[0];
newCoords[4] -= centroid[1];
newCoords[6] -= centroid[0];
newCoords[7] -= centroid[1];

newCoords[0] = (newCoords[0] * c) - (newCoords[1] * s);
newCoords[1] = (newCoords[0] * s) + (newCoords[1] * c);

newCoords[3] = (newCoords[3] * c) - (newCoords[4] * s);
newCoords[4] = (newCoords[3] * s) + (newCoords[4] * c);

newCoords[6] = (newCoords[6] * c) - (newCoords[7] * s);
newCoords[7] = (newCoords[6] * s) + (newCoords[7] * c);

newCoords[0] += centroid[0];
newCoords[1] += centroid[1];
newCoords[3] += centroid[0];
newCoords[4] += centroid[1];
newCoords[6] += centroid[0];
newCoords[7] += centroid[1];

问题是,它没有正确旋转,三角形在旋转并且越来越小,直到由于某种原因消失,有人能看出为什么会这样吗?

编辑:糟糕,差点忘了,这是我的 getCentroid() 方法。

private float[] getCentroid(float[] p1) {
float[] newCoords = new float[] {(p1[0] + p1[3] + p1[6]) / 3.0f,
(p1[1] + p1[4] + p1[7]) / 3.0f, 0};
return newCoords;
}

最佳答案

我发现您的代码有两个问题。两者都已修复,稍作更改。

  1. 您尝试应用旋转操作,将 X 和 Y 坐标作为输入,并将新的 X 和 Y 作为输出。对于您旋转的每个顶点,您有两行代码:第一行计算 X,第二行计算 Y 坐标。但是在计算 Y 坐标时,您使用的是已经旋转的 X 坐标!这是错误的。

  2. 还有一道数值题。您一次又一次地重复使用旧值,导致轮换计算链一个值虽然如此,但数字错误加起来了。永远不要依赖这样的计算来按预期工作。相反,您应该使用原始 值并增加每一帧的角度。这可确保每个值仅参与单次旋转计算

为了解决这两个问题,请将原始坐标保留在代码中的某个位置,我称它们为 coords,然后重写代码以将该数组作为输入(保留 newCoords 作为输出)。增加每一帧的旋转角度,实现旋转动画。

这解决了这两个问题,因为您摆脱了该链,并且在旋转函数中有不同的输入和输出数组。

伪代码:

// initial:
angle = 0.0;
coords = (initial coordinates)

// per frame:
angle += 0.5;
newCoords = rotate(coords, angle);
draw(newCoords);

此外,请注意,如果您想逐帧旋转该角度,则 0.5 是一个大角度。数学函数需要以弧度(而不是度数)为单位的角度,因此您可能希望使用较低的值,具体取决于您特别想要可视化的内容。

你可能想知道为什么我在每一帧都重复使用旧角度,因为根据上面提到的问题2.,它应该引入数值问题,因为它也是一个计算链。这不是旋转角度的问题,因为简单的求和不会显示您在应用旋转时遇到的如此糟糕的数值错误。然而它有一些问题,但它们只会在角度达到数十亿时出现在非常长的运行时间。这样的总和一般来说还不错的原因是因为您在每一帧中沿相同方向更改变量,并且用户不会注意到稍微偏离的旋转角度。

关于java - 连续旋转一个三角形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24244405/

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