塗りハッチング(パターン名=SOLID)の話。
ハッチングの境界図形が閉じていないことがある。
境界図形とは、ポリラインや線、円弧、楕円、スプラインなどのこと。
ポリラインの場合は、閉じていないということはまずありえない。
ポリラインの場合は、図形が一つだけで境界図形となるため、
それ自体が閉じてさえいればよいからだ。
問題はポリラインでない場合。
複数の線で構成されている場合なら。
例えば、3本の線の場合だと、1本目の線の始点から始まって終点がきて、
2本目の始点が1本目の終点と同一で、2本目の終点が3本目の始点と同一で、
3本目の終点が1本目の始点と同一となる。
この同一というのが曲者。
誤差なしでピッタリと一致している場合もあるが、少し一致していない場合もある。
その少し加減が、トラブルを生む。
AutoCADの基準では、10のマイナス6乗。
つまり、2点間距離が 0.000001 未満なら、同一点と判断される。
それを超えると、境界図形が閉じていないと判断されて塗りハッチングが書けない。
ほかのトラブル例を挙げてみる。
・1本の線や円弧で境界図形が構成されている。
閉じようがなく、おはなしにならず。
・2本の線で境界図形が構成されていて、1本目の始点と2本目の終点が同じ。
1本目の終点と2本目の始点が同じ。
閉じていると言えば閉じているが、面積0の領域になってハッチングとしては無効。
・2本の円弧で構成されていて、中心点と半径と開始角と終了角が同じで、
回り方が逆なだけ。やはり面積0の領域になる。
・境界図形の中に、始点と終点が非常に近い線が含まれる。
AutoCADでは、始点と終点が全く同一の線が許されているが、
ハッチングの境界図形としては問題ありあり。
一般的なトラブルの話ではない。
DWGdirect の仕様変更によって発生したトラブル。
DWGをWriteするとき。
1.13 までは、境界図形が閉じていないハッチングをWriteしても問題なかった。
1.14 からは、例外エラーが発生するようになった。
塗りハッチングだけの話で、線のパターンが描かれるハッチングでは関係ない。
このトラブルに遭遇して、調査の結果、仕様変更されていることを知ったときは愕然とした。
いかに、閉じていないハッチングが多いかを思い知らされた。
かなりの比率で閉じていないハッチングが存在していた。
例外エラーを出さないための対策は、一つだけ。
ハッチングの境界図形を一つずつ追っていって、
閉じていなければ、閉じるように座標値を変更して無理やり閉じること。
線だけなら、大した労力ではなかった。
始点や終点の座標値を変更するだけで済むから。
そこに円弧が絡むとややこしい。
例えば、円弧と円弧を無理やりつなげる場合の話。
開始角、終了角を制御して、つなげるのは得策ではない。
なぜなら、2つの円弧に交点があるとは限らないから。
弧をどこまでのばしても、つながらないときはつながらない。
中心点と半径も考慮に入れた、変形をする必要がある。
と考えると、とても難解になりそうだがそうでもない。
3点の座標が決まれば、円弧は確定することを利用すればよい。
補正する側の円弧上の2点の座標と、補正しない側の円弧の1点とで
円弧を確定させて、そこから中心点、半径、開始角、終了角を逆算すればよい。
かずかずのトラブル事例から、上記の回避策を編み出し、
この回避策だけで、けっこうなステップ数を稼ぐにいたっている。
少々複雑な処理になってきているので、一度整理する必要性を感じている。
一方、楕円弧やスプラインの場合は、本当に難解なことになるだろう。
今のところ、こんなデータには遭遇していないので、
実質的な対策はしていないが、時間の問題という気もしている。
そのときはそのときで、また考えればよいだろう。