・ 直交するかどうかの判定
2つのベクトルが直交する場合、そのベクトルの内積は0となります。
ただし、線分の判定の場合には、交点を持つことも直交の必要条件となります。
(defun Jo_chk_orth ( / lst_pt uv1 uv2 )
(defun Jof_chk_orth(;ベクトルが直交するかどうか判定 直交:T / 違う:nil ;
v1;ベクトル;
v2;ベクトル;
/ uv1 uv2 fuz Jof_v_inp)
(defun Jof_v_inp (;ベクトルの内積;
v1;ベクトル;
v2;ベクトル;]
/ )
(apply '+ (mapcar '* v1 v2))
)
(setq fuz 1e-6)
(equal (Jof_v_inp v1 v2) 0 fuz)
)
(defun Jof_lst_pt(;線分を選択して始点・終点のリストを返す;
/ ed lst_pt)
(while (not ed)
(setq ed (entget (car (entsel "\n線分を選択"))))
(if (= "LINE" (cdr (assoc 0 ed)))
(setq lst_pt (list (cdr (assoc 10 ed)) (cdr (assoc 11 ed))))
(progn (setq ed nil) (princ "\n選択したオブジェクトは線分ではありません"))
)
)
lst_pt
)
;メインルーチン;
(setq lst_pt1 (Jof_lst_pt))
(setq v1 (mapcar '- (cadr lst_pt1) (car lst_pt1)))
(setq lst_pt2 (Jof_lst_pt))
(setq v2 (mapcar '- (cadr lst_pt2) (car lst_pt2)))
(if (and (Jof_chk_orth v1 v2) (inters (cadr lst_pt1) (car lst_pt1) (cadr lst_pt2) (car lst_pt2) nil))
(princ "\n直交します");ベクトルの内積が0で、かつ交点が存在する場合;
(princ "\n直交しません")
)
(princ)
)