如何计算螺旋线各点的坐标?
How do I calculate the coordinates of the points of an helix?
以下代码每 50 毫秒调用一次。
// Start point
private double x;
private double y;
private double z;
private double y1;
@Override
public void run() {
double x1 = Math.cos(y1);
double z1 = Math.sin(y1);
double y2 = 4D - y1;
double x2 = Math.sin(y2);
double z2 = Math.cos(y2);
// First new point
double pX1 = x + x1;
double pY1 = y + y1;
double pZ1 = z + z1;
// Second new point
double pX2 = x + x2;
double pY2 = y + y2;
double pZ2 = z + z2;
if (y1 > 4D) {
y1 = 0D;
} else {
y1 = y1 + 0.1D;
}
}
这是游戏中的输出。它产生两个螺旋。
我无法控制超过半径。
我正在寻找可以轻松自定义以满足我的喜好的代码。
如何控制以下几个方面?
- 螺旋上升的速度有多快。
- 螺旋开始的地方。
螺旋的一部分开始于:
(x, y, z) = (1.0, 0.0, 0.0)
另一个在:
(x, y, z) = (-0.8, 4.0, -0.7)
并且粒子以 0.1
的速率上升(从 y1 = y1 + 0.1D
)。
因此,要控制粒子上升的速度,只需更改此值即可。
要控制螺旋开始的位置,您需要更改角度。例如,为正弦和余弦添加一些值。像这样:
Math.cos(y1 + dy);
要在从地面重新开始之前进行更多旋转,您可以乘以角度。让它快两倍:
Math.cos(2 * y1);
螺旋线是圆形,'linear'平面运动
- 您使用平面 xz 作为螺旋底,y 轴作为高度
- 所以你需要:
r
- 半径
d
- 两个螺丝之间的距离(整圈后的y移动)
t
- 参数 <0,1>
确定螺旋 上的位置
h0,h1
- 螺旋的起点和终点高度(y 轴)
a0
- angular 起始位置 [rad]
现在如何获得螺旋上的点作为这些参数的函数
aa=fabs(h1-h0)*2.0*M_PI/d; // angular speed coefficient
// if you need opposite angular direction then add aa=-aa;
x=r*cos(a0+aa*t);
z=r*sin(a0+aa*t);
y=h0+((h1-h0)*t);
aa
可以预计算一次
- 现在如果
t=0.0
那么你得到螺旋的起点
- 如果
t=1.0
那么你得到了螺旋的终点
- 所以速度就是你在每个计时器周期的动画期间添加到
t
的速度
d
控制螺杆循环数
h1-h0
为螺旋高度
- 代码在 C++ 中(抱歉我不是 JAVA 编码员)
螺旋线为圆形,Y 值递增。
// Start point
private double x;
private double y;
private double z;
private double degree;
private double rY;
@Override
public void run() {
// We use the same formula that is used to find a point of a circumference
double rX = Math.cos(degree);
double rZ = Math.sin(degree);
// New point
double pX = x + rX;
double pY = y + rY;
double pZ = z + rZ;
if (degree > 2D * Math.PI) {
degree = 0D;
} else {
degree = degree + 0.2D;
}
if (pY > 2D) {
pY = 0D;
} else {
pY = pY + 0.02D;
}
}
以下代码每 50 毫秒调用一次。
// Start point
private double x;
private double y;
private double z;
private double y1;
@Override
public void run() {
double x1 = Math.cos(y1);
double z1 = Math.sin(y1);
double y2 = 4D - y1;
double x2 = Math.sin(y2);
double z2 = Math.cos(y2);
// First new point
double pX1 = x + x1;
double pY1 = y + y1;
double pZ1 = z + z1;
// Second new point
double pX2 = x + x2;
double pY2 = y + y2;
double pZ2 = z + z2;
if (y1 > 4D) {
y1 = 0D;
} else {
y1 = y1 + 0.1D;
}
}
这是游戏中的输出。它产生两个螺旋。 我无法控制超过半径。
我正在寻找可以轻松自定义以满足我的喜好的代码。 如何控制以下几个方面?
- 螺旋上升的速度有多快。
- 螺旋开始的地方。
螺旋的一部分开始于:
(x, y, z) = (1.0, 0.0, 0.0)
另一个在:
(x, y, z) = (-0.8, 4.0, -0.7)
并且粒子以 0.1
的速率上升(从 y1 = y1 + 0.1D
)。
因此,要控制粒子上升的速度,只需更改此值即可。
要控制螺旋开始的位置,您需要更改角度。例如,为正弦和余弦添加一些值。像这样:
Math.cos(y1 + dy);
要在从地面重新开始之前进行更多旋转,您可以乘以角度。让它快两倍:
Math.cos(2 * y1);
螺旋线是圆形,'linear'平面运动
- 您使用平面 xz 作为螺旋底,y 轴作为高度
- 所以你需要:
r
- 半径d
- 两个螺丝之间的距离(整圈后的y移动)t
- 参数<0,1>
确定螺旋 上的位置
h0,h1
- 螺旋的起点和终点高度(y 轴)a0
- angular 起始位置 [rad]
现在如何获得螺旋上的点作为这些参数的函数
aa=fabs(h1-h0)*2.0*M_PI/d; // angular speed coefficient
// if you need opposite angular direction then add aa=-aa;
x=r*cos(a0+aa*t);
z=r*sin(a0+aa*t);
y=h0+((h1-h0)*t);
aa
可以预计算一次- 现在如果
t=0.0
那么你得到螺旋的起点 - 如果
t=1.0
那么你得到了螺旋的终点 - 所以速度就是你在每个计时器周期的动画期间添加到
t
的速度 d
控制螺杆循环数h1-h0
为螺旋高度- 代码在 C++ 中(抱歉我不是 JAVA 编码员)
螺旋线为圆形,Y 值递增。
// Start point
private double x;
private double y;
private double z;
private double degree;
private double rY;
@Override
public void run() {
// We use the same formula that is used to find a point of a circumference
double rX = Math.cos(degree);
double rZ = Math.sin(degree);
// New point
double pX = x + rX;
double pY = y + rY;
double pZ = z + rZ;
if (degree > 2D * Math.PI) {
degree = 0D;
} else {
degree = degree + 0.2D;
}
if (pY > 2D) {
pY = 0D;
} else {
pY = pY + 0.02D;
}
}