我正在尝试修复一个旧的应用程序:我有一个带有一对角度的函数,并绘制一个爆炸饼图的三维切片。我还有一些函数,它们采用数字集合,生成角度并重复调用切片绘图函数,直到绘制完整个饼图。
重复调用切片绘图功能会在现有切片的顶部绘制,顺序永远不会正确。我的问题是如何保证最靠近观察者的碎片最后被绘制,以使碎片正确重叠?
function drawSlice(startAngle, endAngle)
// draws a slice as shown in picture
function drawPie(list of angles to make up pie)
for each angle in angles
drawSlice(angle)
// example usage
drawPie([30,15,40,10,5])
切片看起来像: alt text http://img233.imageshack.us/img233/2627/slice.png
答案 0 :(得分:2)
也许你必须将切片分成两个相等的阶段。两者都从距离观众最远的角度开始,并以相反的方式前进。
将切片分成两个阶段后,将整个切片和50%边界上的切片的两个部分按圆周上的中点对着观察者进行排序。
如果有例如两个切片,首先是80%并且以距离观察者最远的角度开始,你将它分成两个切片,在第一个阶段绘制50%,然后你绘制从顶部开始的20%切片向另一个方向前进,然后你将绘制第一个切片的剩余30%。
对于复杂的解释感到抱歉,我希望你能得到这个想法。 ;)
编辑: 为了说明小切片重叠并重叠较大切片的情况。 但请注意,这不是一个爆炸饼,这个更容易绘制。
答案 1 :(得分:1)
编辑:
mbeckish是对的 - 这应该解决它。使用'卡通竞赛方法'构建两个列表 - 即继续添加到列表,直到其总角度内容超过其他列表,然后更改列表并继续。完成后,首先绘制“较小”的一个。因为它将包含最多180度,它永远不会越过危险点。如果他们是平等的,那就没关系了。 (它不漂亮)
define clockwiseAngles[], antiClockwiseAngles[]
define totalClockwiseAngles, totalAntiClockwiseAngles
for each angle in angles
if totalClockwiseAngles > totalAntiClockwiseAngles
totalAntiClockwiseAngles += angle
AntiClockwiseAngles.push(angle)
else
totalClockwiseAngles += angle
clockwiseAngles.push(angle)
if totalClockwiseAngles > totalAntiClockwiseAngles
// draw all anticlockwise angles
// draw all clockwise angles
else
// draw all clockwise angles
// draw all anticlockwise angles
答案 2 :(得分:1)
假设直接指向我们时的角度值是270,简单地说 计算切片中点距离这个六点线的距离:
Math.abs(270 - (startAngle + endAngle) / 2)
然后根据此距离对切片进行排序,并按降序绘制。
答案 3 :(得分:0)
假设无论调用绘制切片的函数是否在某种列表中都有其数据,请对该列表进行排序,以便较晚的项目在以后出现并最后绘制。
但是,有些代码或其他细节可以帮助您找到更好的答案。
答案 4 :(得分:0)
也许你应该重构使用任何标准方法从给定的角度绘制圆柱体,然后着色圆柱体的表面来描绘切片。