以正确的顺序绘制3D饼图的切片

时间:2009-07-02 19:15:37

标签: graphics geometry graph

我正在尝试修复一个旧的应用程序:我有一个带有一对角度的函数,并绘制一个爆炸饼图的三维切片。我还有一些函数,它们采用数字集合,生成角度并重复调用切片绘图函数,直到绘制完整个饼图。

重复调用切片绘图功能会在现有切片的顶部绘制,顺序永远不会正确。我的问题是如何保证最靠近观察者的碎片最后被绘制,以使碎片正确重叠?

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

5 个答案:

答案 0 :(得分:2)

也许你必须将切片分成两个相等的阶段。两者都从距离观众最远的角度开始,并以相反的方式前进。

将切片分成两个阶段后,将整个切片和50%边界上的切片的两个部分按圆周上的中点对着观察者进行排序。

如果有例如两个切片,首先是80%并且以距离观察者最远的角度开始,你将它分成两个切片,在第一个阶段绘制50%,然后你绘制从顶部开始的20%切片向另一个方向前进,然后你将绘制第一个切片的剩余30%。

对于复杂的解释感到抱歉,我希望你能得到这个想法。 ;)

编辑: 为了说明小切片重叠并重叠较大切片的情况。 但请注意,这不是一个爆炸饼,这个更容易绘制。

Example chart for a Stack Overflow question

答案 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)

也许你应该重构使用任何标准方法从给定的角度绘制圆柱体,然后着色圆柱体的表面来描绘切片。