2009-07-02 30 views
4

我想修復一箇舊的應用程序:我有一個函數,需要一對角度並繪製一個爆炸的餅圖的3d切片。我還有一些函數需要採集數字,生成角度並重復調用切片繪製函數,直到繪製完整個餅圖。以正確的順序繪製一個三維餅圖的切片

對切片繪製函數的重複調用繪製了現有切片的頂部,並且順序從未完全正確。我的問題是,我怎樣才能保證最接近觀看者的部分將被最後繪製出來,因此這些部分重疊正確?

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

代碼?如果我們不知道它應該如何工作,我們怎麼能知道什麼工作不起作用 – Eric 2009-07-02 19:17:33

+0

無法發佈實際的代碼,因爲對工作中的合法性不確定 - 會嘗試更好地解釋它,並提出相當的僞代碼 – user4812 2009-07-02 19:20:43

回答

0

假設任何調用你的函數繪製,以便更接近項目後出現,並繪製切片有其某種列表的數據,那種名單持續。儘管如此,一些代碼或其他細節在幫助給你更好的答案方面會有很長的路要走。

2

也許你不得不把繪圖分成兩個相等的階段。兩者都從離觀察者最遠的角度開始並以相反的方式走向。

在將切片分成兩個階段後,將整個切片和位於50%邊界上的兩個切片的圓周中點的兩個部分分類到觀察者。

如果存在例如兩個切片,首先是80%,並且從離觀察者最遠的角度開始,然後將其分成兩個切片,第一個切片爲50%,然後繪製從頂部開始的20%切片,走向另一個方向,只有這樣你才能畫出第一片的剩餘30%。

對不起,這個錯綜複雜的解釋,我希望你明白了。 ;)

編輯: 爲了說明小切片重疊並重疊較大切片的情況。 但是請注意,這不是爆炸派,而且這個餅圖更容易繪製。

Example chart for a Stack Overflow question

+0

是的,我有點看到 - 很高興你至少明白了我的可憐的最初解釋!看到我的答案,因爲我認爲你給了我正確的想法,開始... – user4812 2009-07-02 20:11:00

+0

太棒了!樂意效勞! – macbirdie 2009-07-02 20:39:42

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 
0

也許你應該重構使用任何標準方法是在那裏從給定的角度繪製一個圓柱體,然後選擇顏色氣缸表面劃定片。

1

假定指向正對我們當角的值是270,簡單地從 這六點線計算切片中點的距離:

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

然後在此基礎上的片進行排序距離並按降序排列。