2

切断面を3D形状で表示する機能を備えたWPFのビジュアライザーに取り組んでいます。たとえば、次のような3Dジオメトリ:

フルジオメトリ

...平面でカットされます。切断後、アルゴリズムは切断面に沿ったすべての一意の輪郭を識別し、CWまたはCCWの巻き順で線分のリストを作成します。単純なポリゴンは、次のように、CuttingEarsアルゴリズムを使用して簡単に三角測量およびレンダリングできます。

切断面の画像 ここに画像の説明を入力してください

右側の三角形分割の入力と、左側の平面に表示される内側のポリラインが与えられた場合、三角形分割を再構成して、ポリラインによって輪郭が描かれた穴を構築できるアルゴリズムはありますか?

C#または別のCLR言語で既にロールされているアルゴリズムがある場合は、それらについて学びたいと思います。私はWPFによって要求されたPoint3Dリストを使用してMeshGeometry3D三角形メッシュを記述していますが、必要に応じてデータ構造を埋めたり、他の言語コードや擬似コードを調べて自分のクラスをスピンしたりできます。

編集:受け入れられた答えを参照してください。制約付きドロネー三角形分割であるPoly2TriのC#実装を利用しています。ただし、(画像は縮尺どおりではありません)Poly2Triアルゴリズム(中央)は780セグメントのポリラインで失敗しましたが、Cutting Ears(右)は、精度の入力を削除するまで、単精度値をdoubleではなくdoubleとして提供しました。 。これで、カッティングイヤーとは異なる三角形分割が生成されますが、外側のポリラインの境界が尊重されます。

ComplexPoly ComplexCDT ComplexEars

4

2 に答える 2

2

境界セグメントを制約として、制約付きドロネー三角形分割を計算します。内側の三角形を決定します。そこから国境に達するまでその地域を成長させます。プラスの副作用として、このような三角形分割はより良い形の三角形になります。

ゾーンの制約付きドロネー

于 2012-10-31T08:46:19.737 に答える
0

SketchUpと3DSMaxの間でエクスポート/インポートプラグインを作成するときに、まったく同じ問題を解決する必要がありました。Sketchupはコンセプトまたは外側と内側のループを使用しますが、3DSMaxは純粋なジオメトリです。

残念ながら、私はプラグインを持っていないので、できる限りそれを覚えようとします。

foreach point in outerLoop
{
    // Loop over all other point to find the nearest valid one
    foreach otherPoint in both outerLoop and all innerLoops where otherPoint is not point
    {
        if otherPoint is adjacent to point
            reject otherPoint 

        if distance between point and otherPoint is bigger than previous distance
            reject otherPoint 

        // Test is vector is point outside the geometry in case of convexe shapes
        if cross product of vector from (point - adjacent point) and (point - nearest point) is pointing away from cross product of vectors of (point - both adjacents point)
            reject otherPoint 

        nearestPoint = otherPoint
    }

    for the two adjacentPoint of nearestPoint
    {
        if adjacentPoint is also adjacent to point
            make triangle(point, adjacentPoint, nearestPoint)
        if cross product of vector from (point - adjacent point) and (point - nearest point) is pointing in the same direction as cross product of vectors of (point - both adjacents point)
            make triangle(point, adjacentPoint, nearestPoint)
    }
}

repeat the above for innerLoops point while only checking against other innerLoops

make triangle function should check if the triangle already exist from previous iteration.

それはとてもきれいではなく、ちょっと野蛮ですが、無制限の数の内部ループで動作し、常に可能な限り最高の三角形を作成します。

パフォーマンスを向上させる方法があると確信していますが、十分な時間を与えたことはありません。

于 2012-10-31T07:20:03.197 に答える