我几乎完成了获得对角圆的坐标。
这是我到目前为止所拥有的。
// Center point
double centerX;
double centerY;
double centerZ;
for (double degree = 0D; degree < 360D; degree = degree + 8D) {
double angle = degree * Math.PI / 180D;
// Difference from the center
double x = 1.5D * Math.cos(angle);
double y;
if (degree >= 0D && degree < 90D) {
y = degree / 90D;
} else if (degree >= 90D && degree < 180D) {
y = 1D - ((degree - 90D) / 90D);
} else if (degree >= 180D && degree < 270D) {
y = -1D * ((degree - 180D) / 90D);
} else {
y = -1D * (1D - ((degree - 270D) / 90D));
}
double z = 1.5D * Math.sin(angle);
// New point
double pointX = centerX + x;
double pointY = centerY + y;
double pointZ = centerZ + z;
}
这是游戏中的输出。 它并不完美,因为它会产生一些边缘,对我来说看起来效率低下。
我该如何纠正? 有更好的方法吗?
答案 0 :(得分:2)
这应该与您已经看到的相似,但它更简单,更顺畅:
double y = 1.0D * Math.sin(angle);
现在,使用这些尺寸,结果不是一个圆圈,而是一个拉伸的椭圆。如果你想要一个圆圈,确保余弦和正弦上的系数服从Pythagorean Theorem。例如:
double x = 1.5D * Math.cos(angle);
double y = 0.9D * Math.sin(angle);
double z = 1.2D * Math.sin(angle);
这些系数将确保x ^ 2 + y ^ 2 + z ^ 2对于每个角度都是常数。鉴于标识cos ^ 2 + sin ^ 2 = 1,您可以验证这是真的。(表示斜边的系数应该附加到使用与其他两个不同的触发函数的坐标。)
对于最易维护的代码,您可能会发现分配(x,y,z)=(cos,sin,0)然后将一个旋转矩阵或一系列旋转矩阵应用于向量(x)会更好,y,z)。如果你想稍后微调旋转量,这将更容易阅读,更难搞乱。