请教一下如何确定一个点相对于选定物件的方向
<p>请教一下各位,我想编写一个程序,可完成以下动作:</p><p> 在CAD图中有一个物件,比如说一条线段,我想在这个线段的上面(或下,左,右)特定位置画一个圆。设想的操作是这样的:选中线段,再点在我想要的方向(上下左右,就像OFFSET一样)上,程序自动完成画圆的动作。</p><p>请教一下我怎么来让程序知道这个点相对于线段的方向?</p> 从别人那里拷过来,希望对你有帮助(defun c:ABCD()
(setq PA(getpoint "\n 第一点:")
PB(getpoint PA "\n 第二点:")
PC(getpoint PB "\n 方向:")
an1 (angle PA PB)
an2 (angle PC PB)
an3 (abs (- an1 an2))
)
(if (< an1 an2)
(setq keyang (- (* pi 2) an3))
(setq keyang an3)
)
(if (< keyang pi)
(setq finalang (+ an1 (/ pi 2)))
(setq finalang (- an1 (/ pi 2)))
)
(setq pe (polar PA finalang 600)
pf (polar PB finalang 600)
)
(command "pline" PA PB pf pe "C")
(prin1)
)
要有具体实例 画了个图大概示意了一下 本帖最后由 作者 于 2009-4-12 19:34:42 编辑 <br /><br /> <p>我自己想的应该可以:(不是很规范,但应该容易看懂)</p><p>取得线段两端点为:p1,p2</p><p>求得其中点 mp = (mid p1 p2) </p><p>p1 对于 mp 的角度 ag1 = (angle mp p1)</p><p>p2 对于 mp 的角度 ag2 = (angle mp p2)</p><p>比较ag1与ag2取得其中的小角 agmin = (min ag1 ag2)</p><p> 大角 agmax = (max ag1 ag2)</p><p>获得输入点(确定方向的点) p = (getpoint)</p><p>取得 p 对于 mp 的角度 ag = (angle mp p)</p><p>如果agmin < p < agmax 那么 我需要的方向(即角度) myag = (+ agmin agmax)*0.5</p><p> 否则 我需要的方向(即角度) myag = (+ agmin agmax)*0.5+pi </p><p>可以通过polar函数(极轴方式)取得圆心 O = (polar mp myag dist) 注:dist 为圆心到该直线距离</p><p></p><p>..</p><p>没测试过如果有不当之处还请见量....</p><p></p> <p>我寫了個功能類似的,請見下圖。但是這個只能畫出上方和右方的,在鼠標點向下方或是左方是都還是只能畫在上方和右方</p><p></p> 回去學習一下。謝謝了 本帖最后由 作者 于 2009-4-14 11:36:14 编辑
(defun c:15 ()
(setvar "cmdecho" 1)
;;;
(setq en (car (entsel "\n 请选取直线:")))
(while (or (null en)
(/= (cdr (assoc 0 (entget en))) "LINE")
)
(setq en (car (entsel "\n 请选取直线:")))
)
;;;
(setq pt1 (cdr (assoc 10 (entget en)))
pt2 (cdr (assoc 11 (entget en)))
mpt (midpoint pt1 pt2)
ag1 (angle mpt pt1)
ag2 (angle mpt pt2)
agmax (max ag1 ag2)
agmin (min ag1 ag2)
)
;;;
(setq ptx (Getpoint "\n 指定要在那一側偏移複製的點:")
agx (angle mpt ptx)
)
;;;
(if (and (< agmin agx) (< agx agmax))
(setq myag (* 0.5 (+ agmax agmin)))
(setq myag (+ (* 0.5 (+ agmax agmin)) pi))
)
;;;
(setq dist (getreal "\n请输入距离:")
pt3 (polar pt1 myag dist)
pt4 (polar pt2 myag dist)
)
;;;
(vl-cmdf ".pline" "non" pt1 "non" pt3 "non" pt4 "non" pt2 "")
(setvar "cmdecho" 1)
(princ)
)
(defun midpoint (pt1 pt2 / x1 y1 x2 y2 xm ym mpt)
(setq x1 (car pt1)
y1 (cadr pt1)
x2 (car pt2)
y2 (cadr pt2)
)
(setq xm(* 0.5 (+ x1 x2))
ym(* 0.5 (+ y1 y2))
mpt (list xm ym)
)
)以上是类似偏移方式,向直线垂直方偏移
如果楼主要的只是向 上 下左 右 偏移的话,可以这样判断
我们把直线看做一个点(其中点mpt),如果输入点ptx在此点的上方,那么就向上偏移,同理下方向下,左方向左,右方向右。
但是我们怎么用数学语言来描述输入点ptx在mpt的 上 下 左 右 方位呢?
可以用角度
比如说:
如果 1/4pi<(angle mpt ptx)< 3/4pi 的话,那么 ptx在直线上方
如果 3/4pi<(angle mpt ptx)< 5/4pi 的话,那么 ptx在直线左方
如果 5/4pi<(angle mpt ptx)< 7/4pi 的话,那么 ptx在直线下方
如果 7/4pi<(angle mpt ptx)< 2pi 或 0 <=(angle mpt ptx)< 1/4pi 的话,那么 ptx在直线右方
然后确定偏移方式:向上,向左,向下,向右
<p>完全听不懂~~</p> <p><strong><font face="Verdana" color="#61b713">luojie454870,我試了一下你的這個程序,好像沒有反應。</font></strong></p><p><strong><font face="Verdana" color="#61b713">另,在這種類型的程序中,我想只要能判別相對於物件的方向,剩下的應該只是繪圖問題。但在我前面寫的程序中,我查不出為什麼只會畫右方和上方的。</font></strong></p> 本帖最后由 作者 于 2009-4-14 15:55:54 编辑
你程序这里有问题
(> (- (cadr ptx) (cadr pt2)))
应该是(> (cadr ptx) (cadr pt2))
还有我那个程序我这里可以用
如果不能用那把名字改以下,
"(defun c:15() "改成 "(defun c:of ()"试试 .
以下为使直线向正上 下 左 右 方偏移(defun c:of ()
(setvar "cmdecho" 1)
;;;
(setq en (car (entsel "\n 请选取直线:")))
(while (or (null en)
(/= (cdr (assoc 0 (entget en))) "LINE")
)
(setq en (car (entsel "\n 请选取直线:")))
)
;;;
(setq pt1 (cdr (assoc 10 (entget en)))
pt2 (cdr (assoc 11 (entget en)))
mpt (midpoint pt1 pt2)
)
;;;
(setq ptx (Getpoint "\n 指定要在那一側偏移複製的點:")
agx (angle mpt ptx)
)
;;;
(cond
((and (< (* 0.25 pi) agx) (< agx (* 0.75 pi))) (setq myag (* 0.5 pi)))
((and (< (* 0.75 pi) agx) (< agx (* 1.25 pi))) (setq myag pi))
((and (< (* 1.25 pi) agx) (< agx (* 1.75 pi))) (setq myag (* 1.5 pi)))
((or
(and (< (* 1.75 pi) agx) (< agx (* 2 pi)))
(and (<= 0 agx) (< agx (* 0.25 pi)))
)
(setq myag 0)
)
)
;;;
(setq dist (getreal "\n请输入距离:")
pt3(polar pt1 myag dist)
pt4(polar pt2 myag dist)
)
;;;
(vl-cmdf ".pline" "non" pt1 "non" pt3 "non" pt4 "non" pt2 "")
(setvar "cmdecho" 1)
(princ)
)
(defun midpoint (pt1 pt2 / x1 y1 x2 y2 xm ym mpt)
(setq x1 (car pt1)
y1 (cadr pt1)
x2 (car pt2)
y2 (cadr pt2)
)
(setq xm(* 0.5 (+ x1 x2))
ym(* 0.5 (+ y1 y2))
mpt (list xm ym)
)
)
页:
[1]
2