对不起我的语言,因为英语是我的第二语言。
我正试图将直线转换成分形,即科赫曲线。这条直线的两个点是已知的然后我需要画出科赫曲线我把这条线分成三段然后让第二段成为等边三角形。参见http://www.tgmdev.be/curvevonkoch.php。
到目前为止,我们将直线转换为4个相等的段,我需要计算出Koch曲线的所有坐标。
我想到了一条直线,当两点的y坐标相同时,我得到了一条水平线。如果是这样,我就可以求出等边三角形的3个点,方法是将第二段除以一半,然后求直角三角形的cos(60)在这里:http://www.themathpage.com/atrig/30 - 60 - 90 - triangle.htm
我的问题是如何找到所有的坐标时,直线是对角线,例如a(200,100), b(400,600)或a(400,500), b(100,500)。
如果你的基段是AB,有A(Ax,Ay)和B(Bx,By),那么这4个子段将是AP, PQ, QR, RB定义如下
首先定义两个相同长度的正交向量:
U(Bx-Ax,By-Ay) and
V(Ay-By,Bx-Ax)
然后点:
P=A+(1/3)*U
Q=A+(1/2)*U+(sqrt(3)/6)*V
R=A+(2/3)*U
点+向量=点表示法类似于平移。
A(100,100)和B(400,100)的示例:
U(300,0)
V(0,300)
P = (100,100) + (1/3)*(300,0) = (200,100)
Q = (100,100) + (1/2)*(300,0) + (sqrt(3)/6)*(0,300) = (250,186)
R = (100,100) + (2/3)*(300,0) = (300,100)
下面是一个基于Eric算法的javascript函数。
export function getChildLinePoints (points, depth = 0) {
if (depth === 0) {
const Ax = points[0]
const Ay = points[1]
const Bx = points[2]
const By = points[3]
const Ux = Bx - Ax
const Uy = By - Ay
const Vx = Ay - By
const Vy = Bx - Ax
const Px = Ax + ((1 / 3) * Ux)
const Py = Ay + ((1 / 3) * Uy)
const Qx = Ax + ((1 / 2) * Ux) + ((Math.sqrt(3) / 6) * Vx)
const Qy = Ay + ((1 / 2) * Uy) + ((Math.sqrt(3) / 6) * Vy)
const Rx = Ax + ((2 / 3) * Ux)
const Ry = Ay + ((2 / 3) * Uy)
return [[
Ax, Ay,
Px, Py
], [
Px, Py,
Qx, Qy
], [
Qx, Qy,
Rx, Ry
], [
Rx, Ry,
Bx, By
]]
} else {
const xpoints = [...getChildLinePoints(points, depth - 1)]
return xpoints.reduce((acc, point) => [...acc, ...getChildLinePoints(point)], [])
}
}