・ 任意の1点より1線分へ垂線をひく
ベクトルの内積を利用
p2 から p3 に垂線をひくには、ベクトルv3が判ればいいわけです。
このベクトルv3のことを、v2のv1への正射影ベクトルと呼ぶらしい。
さて、その求め方ですが、公式に頼ってますのであしからず。・・・ ^_^;
;**********************************************************; ;任意の1点より線分に垂線を引く ; ;ベクトルの内積を利用 ; ;**********************************************************; (defun Jo_line_orth( / ed p0 p1 p2 p3 v1 v2 v3) (defun Jof_v_inp (;ベクトルの内積(inner product); v1;ベクトル; v2;ベクトル; ) (apply '+ (mapcar '* v1 v2 )) ) (defun Jof_v_len (;ベクトルの長さ; v;ベクトル; ) (sqrt (apply '+ (mapcar '(lambda(x) (expt x 2)) v))) ) (defun Jof_orth_v(;v2のv1への正射影ベクトルを取得; v1 v2 / v3 ) (setq v3 (/ (Jof_v_inp v1 v2) (expt (Jof_v_len v1) 2))) (mapcar '(lambda (x) (* v3 x)) v1) ) (setq ed (entget (car (entsel "\n線分を選択")))) (setq p2 (getpoint "\n点を指示")) (setq p0 (cdr (assoc 10 ed))) (setq p1 (cdr (assoc 11 ed))) (setq v1 (mapcar '- p1 p0)) (setq v2 (mapcar '- (trans p2 1 0) p0)) (setq v3 (Jof_orth_v v1 v2));正射影ベクトル; (setq v3 (trans v3 0 1 t));正射影ベクトルの変位をUCSに変換; (setq p3 (mapcar '+ (trans p0 0 1) v3));p0をUCSに変換し変位を加える; (command "._LINE" p2 p3 "") )
任意の軸アルゴリズムの利用
p0:線分の始点
p1:線分の終点
p2:任意の点
p3:p2より線分p0-p1に降ろした垂線の交点p0-p1をz軸方向とする座標系において、p2のz座標値は、p3のz座標値と同じです。
また、p0-p1の線分上の点は、すべてx座標値・y座標値は同一となります。
よって、p0-p1をz軸方向とする座標系において、
p3(x , y , z)=(p0x , p0y , p2z)
これを、現在のUCSに変換すればいいわけです。;****************************************************************; ;任意の1点より線分に垂線を引く ; ;任意の軸アルゴリズムの利用 ; ;****************************************************************; (defun Jo_line_orth_z () (defun Jof_uv (;2点より単位方向ベクトルを取得; p0;始点; p1;終点; / dist) (setq dist (distance p0 p1)) (mapcar '/ (mapcar '- p1 p0) (list dist dist dist)) ) (defun Jof_orth_pt (;垂直に降ろした点の座標を取得; uv;線分の単位方向ベクトル; p0;線分の始点; pt;任意の点; ) (setq pt (trans pt 0 uv));任意の点を線分の始点→終点をZ方向とする座標系に変換; (setq pt_z (caddr pt));そのZ座標値; (setq p0 (trans p0 0 uv));始点→終点をZ方向とする座標系で線分の始点の座標; (list (car p0) (cadr p0) pt_z);始点→終点をZ方向とする座標系で垂直に降ろした点の座標; ) (if (and (setq ed (entget (car (entsel "\n線分を選んでね")))) (= "LINE" (cdr (assoc 0 ed))) ) (progn (setq p0 (cdr (assoc 10 ed)));線分の始点; (setq p1 (cdr (assoc 11 ed)));線分の終点; ) (princ "\n線分を選んでね") ) (if (and p0 p1 (setq p2 (getpoint "\n点を指示"))) (progn (setq uv1 (Jof_uv p0 p1)) (setq p3 (Jof_orth_pt uv1 p0 (trans p2 1 0))) ) ) (if p3 (progn (setq p3 (trans p3 uv1 1));交点を始点→終点をZ方向とする座標系からUCSに変換; (princ "\n垂直に降ろした点は") (princ p3) (command "._LINE" "none" p2 "none" p3 "") ) ) (princ) )