本帖最后由 llsheng_73 于 2014-12-26 16:11 编辑
ysq101 发表于 2014-12-25 21:18
我明白大师你的意思了。。谢谢指点
当选到条样线的时候你不知道哪个起点哪个终点呀
像下图(其实不管什 ...
一个最简单的办法是如果中间那个点不在生成出来的ARC上,说明三个点的顺序需要反过来也就是起止角要反过来,当然,实际上是需要事先判断三个点的顺时针方向还是逆时针方向。。。这样经过事先判断后就可以确定起点、止点应该是哪一个。。。
- (defun Pldir(pts)
- (<(apply'+(mapcar'(lambda(x y)(-(*(car x)(cadr y))(*(car y)(cadr x))))(cons(last pts)pts)pts))0))
- (defun 3pcen(p1 p2 p3);;根据给定3点求圆心,如果三点共直线返回nil,否则返回一个二维点
- (setq p1(list(/(+(car p1)(car p2))2)(/(+(cadr p1)(cadr p2))2))
- p3(list(/(+(car p2)(car p3))2)(/(+(cadr p2)(cadr p3))2))
- p3(inters p1(polar p1(+(/ pi 2)(angle p1 p2))1)
- p3(polar p3(+(/ pi 2)(angle p3 p2))1)nil))
- )
- (defun 3parc(p1 p2 p3 / p f);;根据不共直线的三个点绘制ARC返回图元名,如果p1 p2 p3共直线返回nil
- (if(setq f(pldir(list p1 p2 p3))p(3pcen p1 p2 p3))
- (entmakex(list'(0 . "ARC")(cons 10 p)(cons 40(distance p p1))(cons 50 (angle p(if f p3 p1)))(cons 51 (angle p(if f p1 p3)))))
- )
- )
- (defun c:tt()
- (3parc(getpoint)(getpoint)(getpoint)))
上边的3parc里边就根据了p1 p2 p3这三个点的方向来决定应该用哪一个点计算起始角度,相应的用另一个点计算终止角
|