2

CGAL でまっすぐなスケルトンを描画しようとすると、奇妙な結果が得られます (対称ポリゴン上の非対称スケルトン)。

カーネルでの結果:

  • Exact_predicates_inexact_constructions_kernel
  • Exact_predicates_exact_constructions_kernel

こちらです。

カーネルの使用

  • デカルト

ここにあります(これはより良いですが、ポリゴンの定義でポイントを周期的にシフトすると壊れます)。

私はこのコードを使用しています:

#include <vector>

#include <boost/shared_ptr.hpp>

// #include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
// typedef CGAL::Exact_predicates_inexact_constructions_kernel K ;

// #include <CGAL/Exact_predicates_exact_constructions_kernel.h>
// typedef CGAL::Exact_predicates_exact_constructions_kernel K ;

#include <CGAL/Cartesian.h>
typedef CGAL::Cartesian<float> K;

#include <CGAL/Polygon_2.h>
#include <CGAL/create_straight_skeleton_2.h>

typedef K::Point_2 Point_2;
typedef CGAL::Straight_skeleton_2<K> Ss;
typedef boost::shared_ptr<Ss> SsPtr;

int main() {
    Point_2 pts[] = {
        Point_2(0,  -1385),//top
        Point_2(500, 0),//right half:
        Point_2(300, 0),
        Point_2(400, 173),
        Point_2(200, 173),
        Point_2(100, 0),
        Point_2(-100, 0),//left half:
        Point_2(-200, 173),
        Point_2(-400, 173),
        Point_2(-300, 0),
        Point_2(-500, 0),
    } ;
    std::vector<Point_2> poly(pts,pts+11);

    SsPtr iss = CGAL::create_interior_straight_skeleton_2(poly.begin(), poly.end(), K());

    //printing for debugging
    for ( Ss::Halfedge_const_iterator i = (*iss).halfedges_begin(); i != (*iss).halfedges_end(); ++i )  {
        if ( i->is_bisector()){
            std::cout<<"i ";
        }
        else {
            std::cout<<"c ";
        }
        CGAL::Point_2<K> pa= i->opposite()->vertex()->point();
        CGAL::Point_2<K> pb= i->vertex()->point();
        std::cout << pa.x() << " " << pa.y() << " " << pb.x() << " " << pb.y() << std::endl;
    }
    return 0;
}

問題は、縮退 (1 点で交わる 4 つの線) が正確に計算されていないことです。

カーネルを不適切に使用していませんか? この結果を得るにはどのように使用すればよいですか: http://i.imgur.com/3ggYocV.png

回避策として、ポリゴンを 100 倍に拡大してから CGAL を呼び出し、結果を再度縮小します。


ノート:

結果表示用スクリプト(デバッグ用): https://gist.github.com/anonymous/5497523

4

1 に答える 1

4

けっこうだ。答えは、カーネルを適切に使用しているということです。これはあなたのコードの問題ではなく、修正が必要な CGAL のバグです。ジリ(OP)、プライベートで私に連絡してください(Gmailのフェルナンド・ドット・カッチョラ)。これについてフォローアップできます。

于 2013-05-09T14:28:54.957 に答える