・ 平行かどうかの判定
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) )