- UID
- 3825
- 积分
- 2760
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2002-4-14
- 最后登录
- 1970-1-1
|
发表于 2004-6-11 00:50:48
|
显示全部楼层
每次中点来回,应该有把中点给跨过去了.
比如前一个中点距离为2,下一个中点为3,那么两个点之间的就不求了.
你可以画一个圆弧和一直线试试.
其实就圆弧和直线的情况,一直用"垂线最短",设个精度就可以.
复杂实体,其实也是直线和圆弧的情况.
下面求直线或圆(弧)的最近点.
[php]
(defun c:tt( / dis dis-min e1 e2 fuzz pt pt-e1 pt-e2 yes)
(princ "\n选直线或圆弧: ")
(setq e1(car(entsel))
e2(car(entsel))
)
(setq pt-e1(vlax-curve-getstartpoint e1))
(setq pt-e2 (vlax-curve-getClosestPointTo e2 pt-e1 )
dis-min(distance pt-e1 pt-e2)
yes t
fuzz 1e-6
)
(while yes
(setq pt(vlax-curve-getClosestPointTo e1 pt-e2))
(if(or(> (setq dis(distance pt pt-e2))dis-min)(equal dis dis-min fuzz))
(setq yes nil)
(setq pt-e1 pt dis-min dis)
)
(setq pt(vlax-curve-getClosestPointTo e2 pt-e1))
(if(or(> (setq dis(distance pt pt-e1))dis-min)(equal dis dis-min fuzz))
(setq yes nil)
(setq pt-e2 pt dis-min dis )
)
)
(command "line" pt-e1 pt-e2 "")
)
[/php]
上面是距离小到不能再小,就是最近距离
下面是如果线1上的一点,和经过线2,反射回线1的点,两点"在一起"了,反射点和这一点就是最近点.(如果有交点就是求交点)
[php]
(defun c:tt( / dis dis-min e1 e2 fuzz pt pt-e1 pt-e2 yes)
(princ "\n选直线或圆弧: ")
(setq e1(car(entsel))
e2(car(entsel))
)
(setq pt-e1(vlax-curve-getstartpoint e1))
(setq pt-e2 (vlax-curve-getClosestPointTo e2 pt-e1)
fuzz 1e-4
)
(while(not(equal (setq pt(vlax-curve-getClosestPointTo e1 pt-e2))pt-e1 fuzz))
(setq pt-e1 pt
pt-e2(vlax-curve-getClosestPointTo e2 pt-e1)
)
)
(command "line" pt-e1 pt-e2 "")
)
[/php]
上面这对于凸线和直线应该都对,这理论我自创^_^,有不同意见的画个图出来.
acad的复杂实体的每一片断,应该都是凸线,或直线.
对于两个反向的弧,可能还要从endpoint重求一次.(起点就求出最近的情况(反射一次或两次就求出来)) |
|