我正在读取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代码吗?
答案 0 :(得分:1)
一位同事能够弄明白该做什么:
在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
的坐标