用于在线上反射点的算法

McG*_*Gin 21 algorithm geometry

给定一个点(x1,y1)和一个线的方程(y = mx + c),我需要一些伪代码来确定点(x2,y2),它是整个线上第一个点的反射.花了大约一个小时试图找出它没有运气!

请参阅此处以获取可视化 - http://www.analyzemath.com/Geometry/Reflection/Reflection.html

Il-*_*ima 35

好的,我打算给你一个食谱方法来做到这一点.如果你对我如何得出它感兴趣,请告诉我,我会解释它.

给定(x1, y1)和一条线y = mx + c我们想要在线上(x2, y2)反映的点.

d:= (x1 + (y1 - c)*m)/(1 + m^2)

然后 x2 = 2*d - x1

y2 = 2*d*m - y1 + 2*c

  • 垂直线没有定义斜率(斜率计算中除以零),因此您可能需要单独处理这种情况。 (2认同)

Car*_*ger 20

这是Il-Bhima解决方案的简单解释.诀窍是要注意你想要的是在线上正交投影该点,将其移动那么多,然后再次向同一方向移动它.

对于这些类型的问题,使用稍微冗余的线表示更容易.而不是y = m x + b,让我们通过线上的点pd线的方向上的矢量来表示线.让我们称这一点p = (0, b),向量d = (1, m),你的输入点将是p1.上线的投影点会pl和你的输出点p2,那么,是p1 + 2 * (pl - p1) = 2 * pl - p1

这里你需要的公式是向量v投影到一条线上,该线穿过方向的原点d.它由下式给出d * <v, d> / <d, d>其中<a, b>的两个向量的内积.

要了解pl,我们有那么该行通过减去经过原点移动整个问题pp1,使用上面的公式,并移回.然后,pl = p + (d * <p - p1, d> / <d, d>)那么pl_x = p_x + (b * p1_x) / (1 + m * m),pl_y = p_y + (m * p1_x) / (1 + m * m)然后p2 = 2 * pl - p1用来获取最终值.