我知道线段的端点和我想创建的垂直端盖的距离/大小,但我需要计算垂直线的端点。我一直在使用 45-45-90 三角形和点积将我的头撞到墙上,但我似乎无法将它们组合在一起。
我知道蓝色点和到红色点的距离,我需要找到红色点。
在标记为重复之前,我尝试了这个问题中发布的答案,但它导致端盖始终是垂直的。
http://rauros.net/files/caps.png http://rauros.net/files/caps.png
我知道线段的端点和我想创建的垂直端盖的距离/大小,但我需要计算垂直线的端点。我一直在使用 45-45-90 三角形和点积将我的头撞到墙上,但我似乎无法将它们组合在一起。
我知道蓝色点和到红色点的距离,我需要找到红色点。
在标记为重复之前,我尝试了这个问题中发布的答案,但它导致端盖始终是垂直的。
http://rauros.net/files/caps.png http://rauros.net/files/caps.png
如果 B1 是两个红点之间的蓝点,而 B2 是另一个蓝点,那么这样做的方法是:
以上所有内容都相当简单——最棘手的一点是弄清楚如何用文本写出来!
不过,这可能会有所帮助 - 矩阵旋转 90 度:
[ 0 -1 ]
[ 1 0 ]
解决这个问题的简单方法不是考虑斜率 m,而是考虑 x 和 y 的变化,我称之为 dx, dy(来自微积分符号)。原因是一方面,处理一条垂直线的斜率是无限的,而且无论如何,你不需要使用三角函数,这段代码会更快更简单。
dx = x2 - x1;
dy = y2 - y1;
我在这里假设点 2 是所需线的交点。
好的,所以垂直线的斜率是第一条的负倒数。有两种方法可以做到这一点:
dx2 = -dy
dy2 = dx
或者
dx2 = dy
dy2 = -dx
这对应于两个方向,一个右转,另一个左转。
但是,dx 和 dy 被缩放到原始线段的长度。你的垂线有不同的长度。
这是两点之间的长度:
double length(double x1, double y1, double x2, double y2) {
return sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1));
}
做你想做的,去一侧或另一侧,是:
double scale = length(whatever length you want to go)/sqrt(dx*dx+dy*dy);
double dx2 = -dy * scale;
double dy2 = dx * scale
然后另一边也一样。我刚刚意识到我的示例有点 C++,因为我使用了 sqrt,但差异是微不足道的。请注意,您可以更有效地编写代码,结合平方根。
你知道蓝线的斜率,我们称之为m
。并且垂直于蓝线的线将具有斜率-1/m
。
要找到 x 坐标,您需要一些三角函数 ,sine \theta = d / delta_x
其中 \theta 是 x 轴的蓝线的角度,d 是从蓝点到红点之一的距离。然后添加/减去delta_x
您希望线垂直的蓝色点的 x 坐标。现在您可以使用点斜率公式计算 y 坐标。