・ 平行かどうかの判定
2つのベクトルが平行であるなら、その単位方向ベクトルは同じか、180°反対向きである。
図面上では、ある程度の誤差を許容しなくてはならないので、(equal)
の fuzz オプションを適当に設定しましょう。
(defun Jo_chk_para ( / lst_pt uv1 uv2 )
(defun Jof_chk_para(;ベクトルが平行かどうか判定 平行:T / 違う:nil ;
v1;ベクトル;
v2;ベクトル;
/ uv1 uv2 fuz Jof_uv)
(defun Jof_uv (;ベクトルから単位方向ベクトルを取得;
v;ベクトル;
/ dist)
(setq dist (sqrt (apply '+ (mapcar '(lambda (x) (expt x 2)) v))));ベクトル長さ;
(mapcar '/ v (list dist dist dist))
)
(setq fuz 1e-6)
(setq uv1 (Jof_uv v1))
(setq uv2 (Jof_uv v2))
(or
(equal uv1 uv2 fuz)
(equal uv1 (mapcar '* uv2 (list -1.0 -1.0 -1.0) ) fuz);反対向きも平行なので;
)
)
(defun Jof_v_sept(;線分を選択して始点・終点のベクトルを返す;
/ ed v)
(while (not ed)
(setq ed (entget (car (entsel "\n線分を選択"))))
(if (= "LINE" (cdr (assoc 0 ed)))
(setq v (mapcar '- (cdr (assoc 11 ed)) (cdr (assoc 10 ed))))
(progn (setq ed nil) (princ "\n選択したオブジェクトは線分ではありません"))
)
)
v
)
;メインルーチン;
(setq v1 (Jof_v_sept))
(setq v2 (Jof_v_sept))
(if (Jof_chk_para v1 v2)
(princ "\n平行です")
(princ "\n平行ではありません")
)
(princ)
)