|
Delphiで円を作図するには、TImage や TPaintBox の Canvas プロパティで、Ellipse メソッドを実行します。円弧を作図するには、同様に、Arc メソッドを実行します。Ellipse や Arc のパラメータ(引数)には、円・円弧の外接する長方形の開始点・終了点を指定する必要がある、というのは既に、「いろんな図形の作図(1)」で述べた通りです。この引数は整数値 -32768〜32767の値で指定する事になっていますが、CADでは、ほとんど無限大のような拡大機能がありますので(拡大の制限は大抵ついていますが)、こんな整数値範囲では簡単にオーバーフロー(桁あふれ)してしまいます。6桁しか計算出来ない計算機で8桁の計算は出来ないのと同じ事です。
そのため、これまでは、クリッピング対象になるような円は、円に内接する多角形(72分割の72角形)で表現していました。短い線分にしてしまえば、線分のクリッピング処理を行う事が出来るからです。しかし、円を拡大していけば、単純な72角形だと、どんどん目についてしまいます。特に、円と線の交点、というような状況下、拡大すると円と、円上にあるはずの交点が離れて見えてしまいます。
やはり、簡易CADとはいえ、拡大しても図は正確に表示されて欲しい、と誰もが思うでしょう。EllipseやArcは使えません。線分で描かなければならないのは同じなのですが、円をクリッピング処理する事により、画面で表示される円弧を線分で分割して作図しましょう。
円のクリッピングについては、「数学とCAD 円のクリッピング」にて記述してあります。
UnitClip.pasに、
0°〜 90°間のクリッピングを行う関数 ClipArc1()
90°〜180°間のクリッピングを行う関数 ClipArc2()
180°〜270°間のクリッピングを行う関数 ClipArc3()
270°〜360°間のクリッピングを行う関数 ClipArc4()
を用意します。
円を作図する前にクリッピング処理を行い、ビューエリア内に表示すべき部分だけ、1/4円弧を4回、作図します。クリッピング処理のために表示速度は低下するかもしれません。しかし、ビューエリア外の余計な部分の作図は行わなくなるのでその分、表示速度が格段に遅くなる、という事にはならないと思われます。
円弧のクリッピングも同様です。開始角度・終了角度が、まずどの象限にあるのかを確認し、同じ象限にあって、開始角度<終了角度の場合には、その象限だけのクリッピング処理を行い、同じ象限にあって開始角度>終了角度となる場合には、最大5個の円弧を作図する事になります。
各象限毎に、クリッピング処理 ClipArc1() 〜 ClipArc4() を行い、それぞれを作図するようにします。
各象限でクリッピング処理を行った後は、ビューエリア内での角度を返しますので、それを元に、18分割した補間線分(72÷4=18)を作図するようにしています。これにより、どんな円弧状態になっても線分1、2本だけで表示される事はありませんので、交点が離れて見えてしまう、という事にもならなくなります。
但し、注意点が1つあります。
詳細表示をして、線種を表現する際、クリッピング処理後の円弧部分を線種表現しようとしますので、実際には空白部である部分を拡大していくと、線分が表示されてしまう事になります。
丁寧に時間を掛けて線種ピッチの補正を行うようにすれば、正確に表示させることも出来るでしょう。しかしここでは行っておりませんので、注意して下さい。
それではここまでのプログラムです。
【サンプルプログラムのソース】
|
|
CAD装置(1)
CAD装置(2)
メディア
AutoCADの
DIESELマクロ
CSV
DXF
PCES
IGES
STEP
数学とCAD
CAD作ろ!
▲PREV
▼NEXT
|