我正在从dxf中读取cad文件,我需要能够在两个任意点之间以凸出值绘制圆弧。我正在使用THREE.Line绘制弧段。
This page用Lisp描述了一些必要的计算,但是没有很好地解释中心点计算。我也不知道示例代码中的angle
函数是做什么的(也许两点之间的角度以0,0为原点?)。这里是代码:
;; Bulge to Arc - Lee Mac
;; p1 - start vertex
;; p2 - end vertex
;; b - bulge
;; Returns: (<center> <start angle> <end angle> <radius>)
(defun LM:Bulge->Arc ( p1 p2 b / a c r )
(setq a (* 2 (atan b))
r (/ (distance p1 p2) 2 (sin a))
c (polar p1 (+ (- (/ pi 2) a) (angle p1 p2)) r)
)
(if (minusp b)
(list c (angle c p2) (angle c p1) (abs r))
(list c (angle c p1) (angle c p2) (abs r))
)
)
我了解
a
(即theta)和r
(半径)的计算方式,但是我不了解中心点计算,因此(我认为)需要它来计算弧段。谁能帮助解释数学和/或提供一些JavaScript代码? 最佳答案
一位同事能够弄清楚该怎么办:
在Lisp代码中,角度a
(又名theta)只是简化为了2atan(b)
,而不是4atan(b)
,因为以后我们只需要一半角度即可对中心点c
和半径r
进行一些计算。 ,而不是整个角度。
lisp angle
函数查找矢量的角度(在本例中为p1 -> p2
),其中0为正x轴,pi / 2
为正y轴,依此类推。该弦的那个角度,加上绳索和矢量p1 -> c
之间的角度,即(pi - pi/2 - a)
,足以让我们进行极坐标计算以找到中心点c
的坐标。