icc*_*cco 8 math geometry trigonometry processing.js
嘿那些人,我正在学习processing.js,而且我遇到了一个数学问题,我似乎无法通过有限的几何和三角知识或维基百科的帮助解决这个问题.
我需要绘制一个矩形.要绘制这个矩形,我需要知道每个角的坐标点.我所知道的是盒子顶部和底部中点的x和y,以及所有四个边的长度.
无法保证盒子的方向.
有帮助吗?这看起来应该很容易,但它确实让我感到难过.
如果这个四边形是一个矩形(所有四个角都是90度),那么就可以解决它.(如果它可能是任何四边形,那么它是不可解决的)
如果点是(x1,y1)和(x2,y2),并且如果两个点不是完全垂直(x1 = x2)或水平(y1 = y2),那么矩形的一个边的斜率是
m1 = (y2-y1) / (x2-x1)
Run Code Online (Sandbox Code Playgroud)
而另一边的斜率是:
m2 = - 1 / m1
Run Code Online (Sandbox Code Playgroud)
如果您知道边的长度以及两个相对边的中点,则可以通过将dx,dy添加到中点来轻松确定corrner点:(如果L是中点所在的边的长度)
dx = Sqrt( L^2 / (1 + m2^2) ) / 2
Run Code Online (Sandbox Code Playgroud)
和
dy = m2 * dx
Run Code Online (Sandbox Code Playgroud)
注意:如果这些点垂直或水平对齐,这种技术将不起作用,尽管这些退化情况的明显解决方案要简单得多.
如果你知道你的四边形是一个矩形,那么你可以使用一些简单的矢量数学来找到角的坐标.知识是:
(x1,y1) - 顶行中点的坐标(x2,y2) - 底线中点的坐标l1 - 顶部和底部线的长度l2 - 其他两条线的长度首先,我们找到两个已知点之间的向量.此向量与边线平行:
(vx, vy) = (x2 - x1, y2 - y1)
我们需要对这个向量进行标准化(即使其长度为1),以便我们以后可以使用它作为查找坐标的基础.
vlen = sqrt(vx*vx + vy*vy)
(v1x, v1y) = (vx / vlen, vy / vlen)
接下来,我们将此向量逆时针旋转90度.旋转的矢量将与顶部和底部线平行.90度旋转结果只是交换坐标并否定其中一个.你可以通过在纸上试一试来看到这一点.或者看看2D旋转的方程式并以90度替换.
(u1x, u1y) = (-v1y, v1x)
现在我们有足够的信息来找到"左上角".我们只是从我们的观点开始,(x1, y1)沿着那边向后移动一半的边长:
(p1x, p1y) = (x1 - u1x * l1 / 2, y1 - u1y * l1 / 2)
从这里我们可以通过添加适当的基础向量的多个来找到剩余的点.实现这一点时,你可以通过一次只计算每个唯一的乘法来加速它:
(p2x, p2y) = (p1x + u1x * l1, p1y + u1y * l1)
(p3x, p3y) = (p1x + v1x * l2, p1y + v1y * l2)
(p4x, p4y) = (p3x + u1x * l1, p3y + u1y * l1)