lisp判断一点是否在圆弧上,计算圆上的点,lsp判断一点在夹角内外

  • A+
所属分类:未分类

今天用到一个功能想知道一点是否在圆弧上,本来想通过网上找一个现成的,结果这方便的太少了,没找着,这个伟大的功效还是由我来完成吧,

思路,大家到知道圆上有无数个点,但是圆上的每个点到圆的中心距离就是半径。 这个是第一个条件

要是判断整圆的话,这个添加就够了,要是圆弧的话,这个条件就不够了,必须还要知道圆弧的起始和终止角。这个可以直接读取圆弧的组码得到。这是第2个条件

有了这些条件,想要知道点是否在圆弧上面就简单多了。

例子,假设求A点是否在圆弧上

首先先判断A点到圆弧的中心的距离是否等于圆弧的半径,可以保留8左右位小数作为基础。等于说明在圆上,不等于就直接跳过下面的步骤,如果在就取A点到圆弧的中心的角度,是否在圆弧的夹角内。(圆弧的夹角来自于,圆弧的两个端点和圆弧的中心,连起就是一个夹角)

现成的代码,以下代码没写点是否在圆上,因为这个很简单就能得到,上面已经说的很清楚了,就不写了,直接判断这个点是否在夹角内把,cad圆弧默认为逆时针,所有这个适合逆时针计算,如果顺时针,自己在加个判断是顺时针还是逆时针即可。

(defun c:t5 (/ ss1 acrpt m0 m1 m2 m3 p0 p1 ss1 j360)

(setq ss1(entget (car (entsel))))

(setq m0 (cdr (assoc 10 ss1)))
(setq m1 (cdr (assoc 40 ss1)));r

(setq m2 (cdr (assoc 50 ss1)))
(setq m3 (cdr (assoc 51 ss1)))

(setq p0 (getpoint "\n请指定点1:"))

(setq p1(angle m0 p0))
(if(> m2 m3)
(progn
(if(> p1 m2)
(if(OR(< p1 (* pi 2))(< p1 m3))
(setq acrpt T)
(setq acrpt NIL)
);IF
(if(< p1 m3)
(setq acrpt T)
(setq acrpt NIL)
)
)
)
(progn
(if(and(> p1 m2)(< p1 m3))
(setq acrpt T)
(setq acrpt NIL)
)
)
);IF

(alert(vl-princ-to-string acrpt))

;(setq rr(DISTANCE m0 p0);等于半径就在圆上

(princ (list m2 m3))
;(setq pt3(angle p0 p1))

)

复制

 

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: