void to_simple( Polygon& polygon ) {
size_t len = polygon.self_.coords_.size();
Point ss = polygon.self_.coords_[len-1];
for( size_t i = 0; i < len-2; ++i ) {
Point se = polygon.self_.coords_[i];
Point es = polygon.self_.coords_[i+1];
for( size_t j = i + 2; j < len; ++j ) {
Point ee = polygon.self_.coords_[j];
if( i != j ) {
if(
(ss.x() == es.x() && ss.y() == es.y() )
|| (ss.x() == ee.x() && ss.y() == ee.y() )
|| (se.x() == es.x() && se.y() == es.y() )
|| (se.x() == ee.x() && se.y() == ee.y() )
) {
} else {
double xx, yy;
if( k_4t_close( xx, yy, ss.x(), ss.y(), se.x(), se.y(), es.x(), es.y(), ee.x(), ee.y() ) ) {
se = Point( xx, yy );
ee = Point( xx, yy );
//if( i < j ) { // i < j は自明でしたねorz
polygon.self_.coords_.insert( polygon.self_.coords_.begin() + j, ee );
polygon.self_.coords_.insert( polygon.self_.coords_.begin() + i, se );
//} else {
// polygon.self_.coords_.insert( polygon.self_.coords_.begin() + i, se );
// polygon.self_.coords_.insert( polygon.self_.coords_.begin() + j, ee );
//}
len += 2;
}
}
}
es = ee;
}
ss = se;
}
}
2014年3月12日水曜日
boost::polygon self intersection problem 顛末
この前のポストの問題ですが、面白い事がわかったので、顛末を書きます。
OpenGLES では、描画が float 精度までで、データは double 精度で保持しておりました。
これを boost::polygon にて、trapezoid にかけて台形化処理するのですが、その時に double から float に static_cast で精度を落とします。そうすると、自己交差の無い simple な図形が精度変換の過程で自己交差を持つ図形に変身するケースがあると判明しました。
じゃあ事前に float 精度に落として 自己交差のある状態の図形は float 精度で自己交差を解消した simple な状態にしてから double に戻せば問題無いだろうと思って、やってみましたが、何故かうまく行かない。詳しく突っ込んで調べていないですが、もしかしたら CPU に依存する話なのかもしれません。
余計な事をすると遅くなるので、なんとかしたかったですが、アプリが落ちてしまっては、元も子もありません。もう少し無駄な計算は省こうという事で、こんな感じで落ち着きました。
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿