计算终止旋转圆。

3

我有一个圆,通过在循环中操作半径来实现生长和收缩。在生长和收缩的过程中,在该圆上绘制一个点。并且在同一个循环中,增加下一个点的角度。

设置如下:

let radius = 0;
let circleAngle = 0;
let radiusAngle = 0;

let speed = 0.02;
let radiusSpeed = 4;
let circleSpeed = 2;

在循环中:

radius = Math.cos(radiusAngle) * 100;

// creating new point for line  
let pointOnCircle = {
    x: midX + Math.cos(circleAngle) * radius,
    y: midY + Math.sin(circleAngle) * radius
};

circleAngle += speed * circleSpeed;
radiusAngle += speed * radiusSpeed;

这会产生一种花/图案进行绘制。 经过未知的旋转,绘图线连接到它开始的点,完美地关闭路径。

现在我想知道在线条回到起点之前必须进行多少次旋转。

可以在此处找到一个工作示例: http://codepen.io/anon/pen/RGKOjP

控制台记录了圆和线的当前旋转次数。


非常酷的东西,我可以通过调整圆形速度和角度速度获得各种精美的设计,比如这个。我们需要一些熟练掌握三角函数的专业人士来回答这个问题。 - Vinay
感谢 @Novice。我想知道结尾,这样我就可以关闭路径/停止动画并开始填充。 - Pimmol
1个回答

1
完整的循环是在半径和点都返回起始点时结束。因此,
speed * circleSpeed * K = 360 * N
speed * radiusSpeed * K = 360 * M

这里的K是未知的圈数,N和M是整数。
将第一个方程除以第二个方程。
circleSpeed / radiusSpeed  = N / M

如果速度值是整数,将它们除以LCM以获得最小有效的N和M值;如果它们是有理数,则将它们乘以整数比例。对于您的示例,最小整数N=1,M=2,因此我们可以得到:
K = 360 * 1 / (0.02 * 2) = 9000 loop turns

谢谢 @Mbo,但我恐怕不理解。当我记录 N=1 和 M=2 的圈数时,radiusAngle 的总旋转角度为 360 度(1 圈)。对于 circleAngle,它是 720 度(2 圈)。这如何转换为 9000? - Pimmol

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接