迭代地发现由三个点描述的弧上的点的算法

Algorithm to iteratively discover points on an arc described by three points

我正在编写一个图形应用程序,它需要计算和显示沿 曲线 弧的点列表,该弧由三个点描述。

假设我们有点 (1,1)、(2,4) 和 (5,2)。我需要一种算法,可以为落在插值弧上的每个 x 从 1 到 5 提供 y 值。

我相信这对你们这些数学高手来说是一项简单的任务,但对我来说这有点超出了我的数学能力范围。

提前致谢!

所以问题是如何计算由三个点P = (p1, p2)Q = (q1, q2)S = (s1, s2).给出的圆周的圆心C = (c1, c2)和半径r

这个想法很简单。它在于认识到,根据定义,中心到所有三个点 PQS.

的距离相同

现在,与 PQ 等距的所有点的集合是垂直于在中点 (P+Q)/2 处入射的线段 PQ。类似地,与 QS 等距的所有点的集合垂直于 QS 通过 (Q+S)/2. 所以,中心 C 必须是这两行。

让我们计算这两条直线的参数方程。

为此,我们将需要两个额外的函数,我将调用它们 dist(A,B),它计算点 AB 之间的距离,perp(A,B) 将向量 perp(A,B) 归一化=38=] 将它除以它的长度(或范数)并回答这个归一化向量的垂直向量(请记住垂直于 (a,b) 的是 (-b,a) 因为它们的内积是 0)

dist((a1,a2),(b1,b2))
    Return sqrt(square(b1-a1) + square(b2-a2))

perp((a1,a2),(b1,b2))
    dist := dist((a1,a2),(b1,b2)).
    a := (b1-a1)/dist.
    b := (b2-a2)/dist.
    Return (-b,a).

我们现在可以写出我们两条线的参数表达式

(P+Q)/2 + perp(P,Q)*t
(Q+S)/2 + perp(Q,S)*u

注意两个参数不同,因此引入两个变量tu

使这些参数表达式相等:

(P+Q)/2 + perp(P,Q)*t = (Q+S)/2 + perp(Q,S)*u

由两个线性方程组成,每个方程对应一个坐标,还有两个未知数 tu(见下文)。这个 2x2 系统的解给出了注入参数表达式的参数 tu 的值,给出了圆周的中心 C

一旦C已知,半径r可以计算为r := dist(P,C).


线性方程

(P+Q)/2 + perp(P,Q)*t = (Q+S)/2 + perp(Q,S)*u

第一个线性方程(坐标x)

(p1+q1)/2 + (p2-q2)/dist(P,Q)*t = (q1+s1)/2 + (q2-s2)/dist(Q,S)*u

二次方程(坐标y)

(p2+q2)/2 + (q1-p1)/dist(P,Q)*t = (q2+s2)/2 + (s1-q1)/dist(Q,S)*u

线性系统 (2x2)

(p2-q2)/dist(P,Q)*t + (s2-q2)/dist(Q,S)*u = (s1-p1)/2
(q1-p1)/dist(P,Q)*t + (q1-s1)/dist(Q,S)*u = (s2-p2)/2