代碼中使用 circle() 函數繪製圓形,需改為繪製彈簧形狀。
彈簧由兩種曲率相反的圓弧交替組成。可用 arc() 函數繪製圓弧段:
// arc(x, y, start_angle, end_angle, radius)
arc(cx, cy, 0, 180, R); // 上半圓弧
arc(cx, cy, 180, 360, r); // 下半圓弧 (半徑較小)
void drawSpring(int cx, int cy, int turns, int R, int r, int pitch) {
double angle = 0;
for (int i = 0; i < turns; i++) {
// 上彎
arc(cx, cy + i * pitch, 0, 180, R);
// 下彎
arc(cx, cy + (i + 0.5) * pitch, 180, 360, r);
}
}
// 螺旋線參數方程
x = (R + r * cos(n * t)) * cos(t)
y = (R + r * cos(n * t)) * sin(t)
z = pitch * t / (2 * PI)
// 2D 投影繪製
for (t = 0; t < 2*PI*turns; t += 0.01) {
x = (R + r * cos(turns * t)) * cos(t);
y = pitch * t / (2 * PI) + r * sin(turns * t) * sin(t);
lineTo(x + cx, y + cy);
}