迭代地发现由三个点描述的弧上的点的算法
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
这个想法很简单。它在于认识到,根据定义,中心到所有三个点 P
、Q
和 S.
的距离相同
现在,与 P
和 Q
等距的所有点的集合是垂直于在中点 (P+Q)/2
处入射的线段 PQ
。类似地,与 Q
和 S
等距的所有点的集合垂直于 QS
通过 (Q+S)/2.
所以,中心 C
必须是这两行。
让我们计算这两条直线的参数方程。
为此,我们将需要两个额外的函数,我将调用它们 dist(A,B)
,它计算点 A
和 B
之间的距离,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
注意两个参数不同,因此引入两个变量t
和u
。
使这些参数表达式相等:
(P+Q)/2 + perp(P,Q)*t = (Q+S)/2 + perp(Q,S)*u
由两个线性方程组成,每个方程对应一个坐标,还有两个未知数 t
和 u
(见下文)。这个 2x2 系统的解给出了注入参数表达式的参数 t
和 u
的值,给出了圆周的中心 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
我正在编写一个图形应用程序,它需要计算和显示沿 曲线 弧的点列表,该弧由三个点描述。
假设我们有点 (1,1)、(2,4) 和 (5,2)。我需要一种算法,可以为落在插值弧上的每个 x 从 1 到 5 提供 y 值。
我相信这对你们这些数学高手来说是一项简单的任务,但对我来说这有点超出了我的数学能力范围。
提前致谢!
所以问题是如何计算由三个点P = (p1, p2)
、Q = (q1, q2)
和S = (s1, s2).
给出的圆周的圆心C = (c1, c2)
和半径r
这个想法很简单。它在于认识到,根据定义,中心到所有三个点 P
、Q
和 S.
现在,与 P
和 Q
等距的所有点的集合是垂直于在中点 (P+Q)/2
处入射的线段 PQ
。类似地,与 Q
和 S
等距的所有点的集合垂直于 QS
通过 (Q+S)/2.
所以,中心 C
必须是这两行。
让我们计算这两条直线的参数方程。
为此,我们将需要两个额外的函数,我将调用它们 dist(A,B)
,它计算点 A
和 B
之间的距离,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
注意两个参数不同,因此引入两个变量t
和u
。
使这些参数表达式相等:
(P+Q)/2 + perp(P,Q)*t = (Q+S)/2 + perp(Q,S)*u
由两个线性方程组成,每个方程对应一个坐标,还有两个未知数 t
和 u
(见下文)。这个 2x2 系统的解给出了注入参数表达式的参数 t
和 u
的值,给出了圆周的中心 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