从任意角度的两个点计算等边三角形的第 3 个点,指向科赫雪花的 "correct" 方向
Calculate the 3rd point of an equilateral triangle from two points at any angle, pointing the "correct" way for a Koch Snowflake
也许问题标题需要一些改进。
就上下文而言,这是为了科赫雪花的目的(在 LabVIEW 的公式节点中使用 C-like 数学语法),因此三角形必须是正确的方式。 (给定 2 个点,等边三角形可能在两个方向之一。)
简要回顾一下算法:我有一个由 4 个预定义坐标组成的数组,这些坐标最初形成一个三角形,即分形的第一个 "generation"。要生成下一次迭代,必须为每条线(一对坐标)获取第 1/3 和 2/3 中点作为该面上新三角形的底,然后 计算新三角形的第 3 个点(本题的主题)。对所有当前面执行此操作,将生成的数组连接成一个新数组,形成下一代雪花。
坐标数组是顺时针排列的,例如围绕形状顺时针移动的每个顶点对应于数组中的下一项,对于第二代是这样的:
这意味着当要在脸上添加三角形时,例如在那个图像中,标记为 0 和 1 的顶点之间,你首先得到我称之为 "c" 和 "d" 的中点,你可以旋转 "d" anti -围绕 "c" 顺时针旋转 60 度以找到新三角形顶点的位置(标记为 e
)。
我相信对于雪花周围的任何地方,这应该成立(例如,将较晚的点绕较早的点逆时针旋转 60 度),但是目前我的数学似乎只适用于这种情况其中初始三角形有一条垂直边:[(0,0), (0,1)]。否则三角形会朝其他方向消失。
我相信我已经正确构建了我的循环,这样生成 VI 的三角形(虚拟仪器,实际上是书面语言中的 "function")将按顺序在每个线段上工作,但我的实际计算不起作用我不知道如何让它朝着正确的方向发展。下面是我目前用于从单个线段计算三角形点的数学,其中 a
和 b
是线段的原始顶点,c
和 d
形成新三角形与原始行 in-line 的基础, e
是突出的部分。我不想称它为 "top",因为从 upper-right 到 lower-left 的线段形成的三角形,"top" 会向下。
cx = ax + (bx - ax)/3;
dx = ax + 2*(bx - ax)/3;
cy = ay + (by - ay)/3;
dy = ay + 2*(by - ay)/3;
dX = dx - cx;
dY = dy - cy;
ex = (cos(1.0471975512) * dX + sin(1.0471975512) * dY) + cx;
ey = (sin(1.0471975512) * dX + cos(1.0471975512) * dY) + cy;
注意 1.0471975512
的弧度仅为 60 度。
目前第 2 代是这样的:(注意左边看似分离的三角形是由顶部和底部的 2 个三角形组成,它们的 e
顶点在中间相交,实际上不是独立三角形。)
我怀疑根据天气 ax
或 bx
等而使用略有不同的方程式的必要性更大,也许与 sin/cos 的周期性可能需要的方式有关占(关于球坐标中的象限的东西?),因为它看起来像错位的三角形是 60 度,只是角度在错误的线之间。然而,这是一个猜测,我无法想象如何以编程方式执行此操作,更不用说在纸上了。
谢天谢地,数学公式节点允许使用 if 和 else 语句来实现 if 情况确实如此,但如前所述,我不太熟悉调整什么我会天真地调用 "quadrants thing",并且不确定如何知道每种情况属于哪个象限。
这是一个冗长而杂乱无章的问题,不可避免地会让人胡说八道,所以如果您有任何需要澄清的问题,请发表评论,我会尽力解决 anything/everything。
感谢@JohanC 回答我自己的问题,毫不奇怪,这是一个进行了许多微小调整并在正确之前放弃的案例。
正确的公式是这样的:
ex = (cos(1.0471975512) * dX + sin(1.0471975512) * dY) + cx;
ey = (-sin(1.0471975512) * dX + cos(1.0471975512) * dY) + cy;
只是在第二个正弦函数上加上一个负号。请注意,如果一个人逆时针行进,那么一个人会想要顺时针旋转点,因此您取而代之的是第一个正弦函数取反,第二个正弦函数取正。
也许问题标题需要一些改进。
就上下文而言,这是为了科赫雪花的目的(在 LabVIEW 的公式节点中使用 C-like 数学语法),因此三角形必须是正确的方式。 (给定 2 个点,等边三角形可能在两个方向之一。)
简要回顾一下算法:我有一个由 4 个预定义坐标组成的数组,这些坐标最初形成一个三角形,即分形的第一个 "generation"。要生成下一次迭代,必须为每条线(一对坐标)获取第 1/3 和 2/3 中点作为该面上新三角形的底,然后 计算新三角形的第 3 个点(本题的主题)。对所有当前面执行此操作,将生成的数组连接成一个新数组,形成下一代雪花。
坐标数组是顺时针排列的,例如围绕形状顺时针移动的每个顶点对应于数组中的下一项,对于第二代是这样的:
这意味着当要在脸上添加三角形时,例如在那个图像中,标记为 0 和 1 的顶点之间,你首先得到我称之为 "c" 和 "d" 的中点,你可以旋转 "d" anti -围绕 "c" 顺时针旋转 60 度以找到新三角形顶点的位置(标记为 e
)。
我相信对于雪花周围的任何地方,这应该成立(例如,将较晚的点绕较早的点逆时针旋转 60 度),但是目前我的数学似乎只适用于这种情况其中初始三角形有一条垂直边:[(0,0), (0,1)]。否则三角形会朝其他方向消失。
我相信我已经正确构建了我的循环,这样生成 VI 的三角形(虚拟仪器,实际上是书面语言中的 "function")将按顺序在每个线段上工作,但我的实际计算不起作用我不知道如何让它朝着正确的方向发展。下面是我目前用于从单个线段计算三角形点的数学,其中 a
和 b
是线段的原始顶点,c
和 d
形成新三角形与原始行 in-line 的基础, e
是突出的部分。我不想称它为 "top",因为从 upper-right 到 lower-left 的线段形成的三角形,"top" 会向下。
cx = ax + (bx - ax)/3;
dx = ax + 2*(bx - ax)/3;
cy = ay + (by - ay)/3;
dy = ay + 2*(by - ay)/3;
dX = dx - cx;
dY = dy - cy;
ex = (cos(1.0471975512) * dX + sin(1.0471975512) * dY) + cx;
ey = (sin(1.0471975512) * dX + cos(1.0471975512) * dY) + cy;
注意 1.0471975512
的弧度仅为 60 度。
目前第 2 代是这样的:(注意左边看似分离的三角形是由顶部和底部的 2 个三角形组成,它们的 e
顶点在中间相交,实际上不是独立三角形。)
我怀疑根据天气 ax
或 bx
等而使用略有不同的方程式的必要性更大,也许与 sin/cos 的周期性可能需要的方式有关占(关于球坐标中的象限的东西?),因为它看起来像错位的三角形是 60 度,只是角度在错误的线之间。然而,这是一个猜测,我无法想象如何以编程方式执行此操作,更不用说在纸上了。
谢天谢地,数学公式节点允许使用 if 和 else 语句来实现 if 情况确实如此,但如前所述,我不太熟悉调整什么我会天真地调用 "quadrants thing",并且不确定如何知道每种情况属于哪个象限。
这是一个冗长而杂乱无章的问题,不可避免地会让人胡说八道,所以如果您有任何需要澄清的问题,请发表评论,我会尽力解决 anything/everything。
感谢@JohanC 回答我自己的问题,毫不奇怪,这是一个进行了许多微小调整并在正确之前放弃的案例。
正确的公式是这样的:
ex = (cos(1.0471975512) * dX + sin(1.0471975512) * dY) + cx;
ey = (-sin(1.0471975512) * dX + cos(1.0471975512) * dY) + cy;
只是在第二个正弦函数上加上一个负号。请注意,如果一个人逆时针行进,那么一个人会想要顺时针旋转点,因此您取而代之的是第一个正弦函数取反,第二个正弦函数取正。