・ 直交するかどうかの判定
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) )