13

円をできるだけ滑らかに見せるために必要な頂点の数を決定する方法を見つけようとしています。

以下は、24 個の頂点を持つ 2 つの円の例です。 ここに画像の説明を入力

ご覧のとおり、円が大きくなればなるほど、直線を隠すために必要な頂点が増えます。

最初は、エッジの 1 ラインの最小の長さは 6px にすべきだと考えていましたが、円のサイズを大きくすると、そのアプローチは失敗しました。頂点が多すぎます。角度を計算することも考えましたが、角度が異なるサイズの円で変わらないことにすぐに気付きました。私もこの答えをチェックしましたが、それをコードに変換する方法がわかりません(そして、そこにある奇妙なもの:th自分自身を計算するために自分自身を使用します)。 1 つのスライスから円の中心までの角度。円が大きくなっても変化しません。

次に、次のように、エッジの 2 つの頂点間の角度を確認することで解決できる可能性があることに気付きました。

ここに画像の説明を入力

ご覧のとおり、頂点が少ないほど、それらの三角形の長さが大きくなります。これが答えでなければなりません。この情報を使用して頂点の数を計算する方法がわかりません。

4

4 に答える 4

13

リンク先の回答は、質問の最後に提案したアイデアを実際に実装しています。

その答えから必要な決定的な式は次のとおりです。

th = arccos(2 * (1 - e / r)^2 - 1)

これは、2 つの頂点の間の角度を示します。ここrで、 は円の半径であり、eは許容できる最大誤差、つまり円からのポリゴンの最大偏差です。これは図に示されている誤差です。たとえば、e0.5 ピクセルに設定することを選択できます。

thはラジアンで測定され、360 度 (完全な円) はラジアンに等しいため、2*pi必要な頂点の数は

num_vertices = ceil(2*pi/th)
于 2012-08-02T09:18:59.867 に答える
2

円の中心から多角形の三角形を描画する場合、必要な辺の数の式は次のとおりです。

sides = PI / arccos(1 - error / radius)

ここerrorで、円からのポリゴンの最大偏差 (ピクセル単位) であり、ピクセル単位radiusでも表されます。

エラー0.33は、理想的な円と見分けがつかない結果を生み出すようです。エラー0.5で描かれた円は、詳細な検査では、特に小さな円で目に見える、辺の間に微妙に見える角度をまだ示しています。

半径がエラーよりもはるかに小さい場合、この関数は明らかに機能しなくなり、NaN値が生成される可能性があります。この状況では、特殊なケース (たとえば、3 つの面を描く) を使用することができます。

以下のグラフは、関数から取得された辺の数を示しています。エラーは に設定されてい0.33ます。

于 2020-01-02T19:17:24.800 に答える
1

まず、OpenGL や DirectX を使用している場合は、三角ファン構造を使用することで頂点の数を大幅に減らすことができます。

頂点の数の問題については、滑らかな円が円周に合わせてスケーリングするために必要な頂点の数を想像します。これは r に比例するため、次のAような適切な係数を見つけることをお勧めします。

#vertices = A * r

于 2012-08-02T08:58:49.530 に答える
0

24 頂点の 2 つの場合の角度は同じです。

しかし、円が大きいほど、人間の目は個々の直線をよりよく見ることができます。

したがって、考慮に入れるヒューリスティックが必要です

  • 曲線内の 2 つの連続する線分の間の角度、および

  • サイズ、そしておそらく

  • 表示のスケーリング。

3 番目のポイントは、グラフィックが表示されるサイズがわからないため、難しい問題です。たとえば、SVG 形式の画像は任意のサイズで表示できます。最も一般的な解決策は、レンダラーでさまざまな図形 (ベジエ線、円など) を直接サポートし、ポイントのシーケンスとしてではなく、いくつかのパラメーターを使用して図形を定義することだと思います。または、レンダラーがサポートする図形の観点から定義します。たとえば、接続されたベジエ曲線のシーケンスとして定義します。そうすれば、レンダラーは必要な数のポイントを追加して、滑らかで見栄えのするものにすることができます。

ただし、レンダラーを作成していないと思うので、おそらく上記の最初の 2 つの点だけが関連しています。

于 2012-08-02T09:01:38.867 に答える