1

对不起我的语言,因为英语是我的第二语言。

我正在尝试将直线转换为称为科赫曲线的分形。给定直线的 2 个点,然后我需要创建科赫曲线,将线分为 3 段,然后将第二段设为等边三角形。见http://www.tgmdev.be/curvevonkoch.php

到目前为止,我们将直线转换为 4 个等分线段,我需要计算出科赫曲线的所有坐标。

当 2 点的 y 坐标相同时,我想到了一条直线,这给了我水平线。如果是这样,我可以通过将第二段分成两半并取直角三角形的 cos(60) 来计算等边三角形的 3 个点。在这里: http ://www.themathpage.com/atrig/30-60-90-triangle.htm

我的问题是当直线是对角线时如何找到所有坐标,例如a(200,100),b(400,600)或a(400,500),b(100,500)。

4

2 回答 2

7

如果您的基本段是 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

point+vector=point 符号类似于平移。

以 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)
于 2013-03-12T17:28:10.830 回答
0

这是一个基于 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)], [])
  }
}
于 2018-04-26T21:05:23.613 回答