我正在从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的坐标。

10-08 07:41
查看更多