2009-07-02 23 views
4

私は古いアプリケーションを修正しようとしています。角度のペアをとり、分解された円グラフの3Dスライスを描画する関数があります。また、数値のコレクションを取り、角度を生成し、パイ全体が描画されるまでスライス描画関数を繰り返し呼び出す関数もあります。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

+0

実際のコードを投稿することができない職場での合法性についてはわかりません - それをよりよく説明し、同等の疑似コードを入れようとします – user4812

答えて

0

近い項目が後に表示され、描画されるように、そのリストを並べ替えます最終。

しかし、いくつかのコードやその他の詳細は、あなたに良い答えを与えるのに役立ちます。

2

スライスを2つの等しい段階に分ける必要があるかもしれません。両方とも、視聴者から最も遠い角度から始まり、反対方向に進む。

スライスを2段階で分割した後、全体のスライスと50%境界にあるスライスの両方の部分を円周上の中間点でビューアに並べ替えます。

2つのスライスは、最初は80%で、ビューアから最も遠い角度から開始します。スライスを2つのスライスに分割し、最初のステージで50%を描画し、次に先頭から20%のスライスを描画します。もう一方の方向に進み、最初のスライスの残りの30%を描画します。

ひどい説明のため申し訳ありませんが、私はあなたが考えを得ることを願っています。 ;)

編集: 小さなスライスが重なって大きなスライスに重なる場合を説明します。 しかし、これは分解されたパイではなく、これは描画する方がはるかに簡単です。

Example chart for a Stack Overflow question

+0

はい、 - あなたが私の不十分な最初の説明を少なくとも理解してうれしい!私があなたに私に正しいアイデアを与えてくれたと思うので、私の答えを見てください... – user4812

+0

素晴らしい!助けてうれしい! – macbirdie

1

EDIT:

mbeckish権利である - これはそれを修正する必要があります。 「漫画競争法」で2つのリストを構築します。つまり、リストの合計角度が他のリストを超過するまでリストに追加し続け、リストを変更し続けます。それが終わったら、まず「小さい」ものを描きます。これは最大でも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 
+1

180度線を横切るスライス(つまり、画面に最も近いスライス)が最後に描画されていることを確認する必要があります。 あなたの現在の擬似コードでは時計回りになることがありますが、スライスは本当に大きくて反時計回りの側に回り込むことがあります。次に、次の反時計回りの部分を描くと、問題が発生します。 – mbeckish

0

(それはかなりありません)。

1

この6時のラインからスライスの中点の距離を計算単に 、角度の値が直線米国を指すが270である場合と仮定すると:そしてこれに基づいてスライスをソート

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

距離を降順で描画します。

+0

+1ありがとう、これは基本的に正しい答えです。それはどんな半分のまともな言語でも動作しますが、この特定のアプリケーションでは、高低の並べ替え以外のものは実際には実現可能ではありません。私はおそらくもっと長い時間を要する解決策を使用する必要があります – user4812

+0

単純な数式は機能しません。 – macbirdie

+0

@macbirdie:そうです、私はあなたの答えをupvotedしました。 –

関連する問題