==================================================発行部数986======
     AutoCADカスタマイズ入門講座              No.24 1999/11/08
===================================================================
 AutoCADカスタマイズ入門講座のご購読ありがとうございます。
朝晩はすっかり寒くなってきましたが(北海道はもうすっかり冬で、沖縄の
ほうはまだまだ暖かいのでしょうね?)、みなさん体調は万全ですか?。
今回から数回に別けて、直線をマージするプログラムを作成してみたいと思
います。線が重なっているのに気づかず、プロッタに出力したら重なってい
る部分の線が濃くなってしまった...なんて事はありませんか(最近のプ
ロッタは高機能化し、その様な事はないのでしょうか?)。

--------------------------------------------------------------------
 1.仕様を考えよう
--------------------------------------------------------------------
 久しぶりにプログラムの仕様を考えてみましょう。今回のプログラムの目
的は重なっている直線(円や円弧は今回は割愛します)を1本の直線にする事
です。行う事はすごく簡単ですが、こういう簡単なものほどプログラムを作
るのはすごく大変という事は良くありますので気を引き締めて...。
まず、線が重なっているというのはどういう状態を指すのでしょうか。一つ
はそれぞれの直線の作図角度が同一な事、つまりそれぞれの直線を無限大の
長さにしても交わらない事。これはすぐ分かりますね。もう一つは、それら
2つの直線に垂直となる1本の線を引いた時(この時の2直線の長さは無限
大と考えます)、それぞれの直線の垂線との交点の距離が0である事です。は
じめはこれだけの条件で大丈夫かな?と思っていたらだめでした。上記の条
件では、例えば破線は一本の直線になってしまいますね。分かりましたか?
。後は本当に片方の直線の始点または終点がもう片方の直線上にある必要が
あります。

もう一度整理すると、
1.2直線の作図角度は同一
2.2直線間の距離は0
3.片方の直線上にもう片方の直線の始点、終点が(少なくとも一つは)存在

というような感じでしょうか?。数学的にもっときれいに書けるのかもしれ
ませんが、数学って苦手なので...(^_^;)。おい、おい、それでも理系?

--------------------------------------------------------------------
 2.理屈道理には動きません
--------------------------------------------------------------------
 さて、もう少し続きを考えてみましょう。以前お話したかもしれませんが
、コンピュータ上で実数(小数点付きの数値)を扱う場合には必ず誤差を気に
留めておかないといけません。計算などを行っていると、知らぬ間に桁落ち
誤差や丸め誤差などと呼ばれる誤差が計算結果に紛れ込んできます。例えば
、ある計算結果が50.0000...0001だった時、人間ならば値は限りなく50.0等
しい事が分かり、この値を50.0とみなす事が出来ますが、コンピュータは2
つの値を全く別の値として認識します。つまり、理論上ある計算が50.0にな
るはずなのに計算結果は50.0000...0001になる可能性があり、その為にプロ
グラムがうまく動かなくなる可能性があるという事です。例えば変数aが
1.00000000001の場合以下のプログラムは"False"を表示します。当然ですね
、値が違うのですから。この様にして書くと当たり前じゃん...って思う
のですが、プログラムを作っている最中は勘違いしてしまう事があります。
プログラムを作っている人にとっては、「1.00000000001位なら気をまわし
て勝手に1.0にしてくれよ...」って思われると思いますがコンピュータ
ってかなり頭が固いんですよね。

(if (= a 1.0)
   (print "True")
   (print "False")
)


 この様な事から1で考えた条件にも許容値が必要になります。
例えば、2つの直線の角度の差が0.001度なら同じ角度とみなすという感じで
す。

上の例をプログラムにすると以下の様になります。
(if (< abs(- a b) 0.001)
   (print "等しい")
   (print "等しくない")
)
 
(abs)関数は絶対値を求める関数です。絶対値というのは符号を考えずに数
そのものの大きさ考えます。(abs -100)も(abs 100)も絶対値は100になりま
す。なぜ、上記のプログラムで許容値を取る事が必要かというと、2つの直
線の角度の差が0.00001だとしてもa<bの場合とa>bの場合があるからです。
1で考えた条件の許容値については、今後プログラム実行時にユーザに入力
させる様にしたいと思います(でも、デフォルト値を用意するとユーザにや
さしいですね)。

--------------------------------------------------------------------
 3.最後にUIを考える
--------------------------------------------------------------------
 今回はファーストステップとして、2つの直線を選択し、重なっていれば1
つの直線にするというプログラムにしたいと思います(最終的には図面全体
を検索し、重複した直線を1つの直線にするプログラムにしたいと思います
。またGUIも加えたいと思います)。この様なわけで、ユーザインタフェース
は次の様にしたいと思います。

コマンド:最初の直線を選択して下さい:
     2本目の直線を選択して下さい:

UIは上に示すように非常に簡単にします。許容値についても今回は固定値と
します。

--------------------------------------------------------------------
 4.まとめ
--------------------------------------------------------------------
 次回は今回考えた仕様に従い、プログラムを作成していきます。お楽しみに。


●バックナンバーは下記のURLで参照する事が出来ます。
http://www2u.biglobe.ne.jp/~Saturn5/alisp.htm
====================================================================
■登録/解除の方法
http://www2u.biglobe.ne.jp/~Saturn5/alisp.htm
「AutoCADカスタマイズ入門講座」は、上記URLよりいつでも
登録/解除可能です。
====================================================================
●広告の問い合わせ
広告のお問い合わせは以下のメールアドレスへお願いします。
wankichi@mba.nifty.ne.jp
====================================================================
■「AutoCADカスタマイズ入門講座」No.24
発行責任者 :わんきち(wankichi@mba.nifty.ne.jp)
発行システム:インターネットの本屋さん『まぐまぐ』
              http://www.mag2.com/
              マガジンID:0000011579
====================================================================