・ 直交するかどうかの判定

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)
  )