Graphics 以正确的顺序绘制三维饼图的切片

Graphics 以正确的顺序绘制三维饼图的切片,graphics,geometry,graph,Graphics,Geometry,Graph,我正在尝试修复一个旧的应用程序:我有一个函数,它采用一对角度并绘制一个分解饼图的3d切片。我还有一些函数,它们获取一组数字,生成角度,并反复调用切片绘制函数,直到绘制出整个饼图 对slice drawing函数的重复调用会在现有切片的顶部绘制,并且顺序永远不会完全正确。我的问题是,我如何保证距离观看者最近的片段将最后绘制,以便片段正确重叠 function drawSlice(startAngle, endAngle) // draws a slice as shown in picture

我正在尝试修复一个旧的应用程序:我有一个函数,它采用一对角度并绘制一个分解饼图的3d切片。我还有一些函数,它们获取一组数字,生成角度,并反复调用切片绘制函数,直到绘制出整个饼图

对slice drawing函数的重复调用会在现有切片的顶部绘制,并且顺序永远不会完全正确。我的问题是,我如何保证距离观看者最近的片段将最后绘制,以便片段正确重叠

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])
切片看起来像:

假设任何调用函数绘制切片的函数都有某种列表中的数据,请对该列表进行排序,以便更接近的项显示在后面,并最后绘制


不过,一些代码或其他细节将大大有助于给出更好的答案。

也许您必须将绘制切片分为两个相等的阶段。两者都从距离观看者最远的角度开始,并以相反的方式进行

将切片分为两个阶段后,将整个切片和位于50%边界上的切片的两个部分按圆周上的中点向观察者排序

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

对不起,解释得太复杂了,我希望你能理解

编辑: 以说明小切片与大切片重叠的情况。 但是请注意,这不是一个分解的饼图,这个饼图更容易绘制

编辑:

姆贝基什是对的——这应该可以解决它。用“卡通竞赛法”建立两个列表——即不断添加到列表中,直到其总角度内容超过另一个列表,然后更改列表并继续。完成后,先画“小”一个。由于这将包含最多180度的角度,因此它无法穿过危险点。如果他们平等,那没关系。(不好看)


也许你应该重构,使用现有的标准方法从给定的角度绘制圆柱体,然后对圆柱体表面上色以描绘切片。

假设直接指向我们时的角度值为270,很简单 计算切片中点与该六点钟线的距离:

 Math.abs(270 - (startAngle + endAngle) / 2)

然后根据此距离对切片进行排序,并按降序绘制。

代码?如果我们不知道什么不起作用,我们怎么知道什么不起作用呢?如果我们不知道它应该如何起作用,我们怎么知道什么不起作用呢?我们无法发布实际代码,因为我们对工作中的合法性不确定-我们将尝试更好地解释它,并提供等效的伪代码。是的,我有点明白了-很高兴你至少理解了我糟糕的初始解释!请看我的答案,因为我认为您给了我一个正确的想法开始…您需要确保最后绘制穿过180度线的切片(即最接近屏幕的切片)。在您当前的伪代码中,它可能是顺时针方向的,但切片可能非常大,并绕到逆时针方向。然后,当你逆时针画下一块时,你会有问题。+1谢谢,这基本上是正确的答案。它在任何半正式的语言中都可以工作,但是在这个特定的应用程序中,除了sort high->low之外的任何东西都不是真正可行的,我可能必须使用我的更冗长的解决方案,请参阅我编辑的答案,以了解简单公式不起作用的情况。
 Math.abs(270 - (startAngle + endAngle) / 2)