根据该部分所在的象限将弧分成几部分

时间:2014-01-20 07:36:21

标签: algorithm math

问题似乎很简单,但我无法找到一个优雅的解决方案。

我有一个由{/ p>定义的arc

startAngle ( -360 <= startAngle <= 360 ), 
sweepAngle ( -360 <= sweepAngle <= 360 ) 
and a radius (not important here).

我想将此弧分成(startAngle1, sweepAngle1), ...对,以便四个象限中的每一个都有不同的对。

Eg. If startAngle = 45, sweepAngle = 90, then there shall be two pairs (45,45) and (90,45).

蛮力方式是检查所有4^2种可能性(startAngleendAngle中的每一种sweepAngle(由{{1}}计算)可以是4种中的任何一种象限)。

但我认为应该有一个优雅的简单解决方案。我似乎无法找到它。

感谢。

编辑: 我刚才想到的一个算法是:
1.从startAngle开始,我向sweepAngle迭代并继续检查是否遇到任何象限边界(mod(theta)= 0,90,180,270,360)。
2.相应地更新弧线列表。

还有什么更好的吗?

1 个答案:

答案 0 :(得分:1)

我将从90-startAngle%90开始,模运算符会为您提供当前象限中startAngle的部分。 90减去该值是startAngle必须在此象限中运行的部分。那么,这是你的第一个扫掠角度。现在,您可以将90添加到下一个扫掠角度。您执行此操作直到计算出的当前sweepAngle大于输入sweepAngle。然后你知道你在最后一个象限。在伪代码中,out打印一对新的角度:

currentPosition=startAngle
currentSweep = 90-startAngle%90
totalAngle=0
while (currentSweep < sweepAngle)
    out (currentPosition, currentSweep)
    currentPosition += currentSweep
    totalAngle += currentSweep
    currentSweep += 90;
out (currentPosition, sweepAngle-totalAngle)

可能你必须更仔细地研究角落情况,当startAngle正好是90时会发生什么,例如但基本上这应该是具有合理运行时间的算法(和优雅,imo)。