问题似乎很简单,但我无法找到一个优雅的解决方案。
我有一个由{/ 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
种可能性(startAngle
和endAngle
中的每一种sweepAngle
(由{{1}}计算)可以是4种中的任何一种象限)。
但我认为应该有一个优雅的简单解决方案。我似乎无法找到它。
感谢。
编辑:
我刚才想到的一个算法是:
1.从startAngle开始,我向sweepAngle迭代并继续检查是否遇到任何象限边界(mod(theta)= 0,90,180,270,360)。
2.相应地更新弧线列表。
还有什么更好的吗?
答案 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)。