用于在线上反射点的算法

时间:2010-07-22 08:01:14

标签: algorithm geometry

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

请点击此处查看可视化 - http://www.analyzemath.com/Geometry/Reflection/Reflection.html

9 个答案:

答案 0 :(得分: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

答案 1 :(得分:19)

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

对于这些类型的问题,使用稍微冗余的线条表示更容易。我们不是y = m x + b,而是用线上的点p和线的方向上的向量d来表示线。我们将此点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,我们必须移动整个问题,以便线条通过从p中减去p1,使用上面的公式并将其移回原点来查看原点。然后,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获取最终值。

答案 2 :(得分:2)

参考图in here

我们希望找到点A(p,q)到行L1,eqn y = m*x + c的反映。说反射点是A'(p',q')

假设, 连接点A和A'的线是L2,其中eqn:y = m'* x + c' L1&amp; L2在M(a,b)处相交

找到该点反射的算法如下: 1)找到L2的斜率= -1 / m,因为L1和L2是垂直的 2)使用m'和A(x,y)使用L2的等式找到c' 3)找到L1 anSd L2的交点'M' 4)现在我们有A和M的坐标,因此可以使用关系[ A(p,q)+A'(p',q') ]/2 = M(a,b)

轻松获得A'的坐标

我没有检查以下代码,但FORTRAN中粗略的代码形式是

SUBROUTINE REFLECTION(R,p,q)

IMPLICIT NONE

REAL,INTENT(IN)     ::  p,q

REAL, INTENT(OUT)   ::  R(2)

REAL                ::  M1,M2,C1,C2,a,b

M2=-1./M1                       ! CALCULATE THE SLOPE OF THE LINE L2 

C2=S(3,1)-M2*S(3,2)             ! CALCULATE THE 'C' OF THE LINE L2  

q= (M2*C1-M1*C2)/(M2-M1)        ! CALCULATE THE MID POINT O

p= (q-C1)/M1

R(1)=2*a-p                      ! GIVE BACK THE REFLECTION POINTS COORDINATE

R(2)=2*b-q

END SUBROUTINE REFLECTION

答案 3 :(得分:2)

可以通过两个步骤找到反思。首先按b单位翻译(移位)所有内容,因此该点变为V=(x,y-b),该行变为y=mx。然后该行内的向量为L=(1,m)。现在通过原点计算线条的反射,

(x',y') = 2(V.L)/(L.L) * L - V

其中V.LL.L是点积,*是标量倍数。

最后,通过添加b来重新设置所有内容,最终答案为(x',y'+b)

作为仿射变换,您可以将上述操作编写为三个矩阵的合成(乘积),首先表示移位y => y-b,然后通过原点反射直线,然后移位{{1} }:

y => y+b

这种情况与仿射几何中的旋转矩阵非常相似。如果您已经有矩阵乘法例程可用,因为您也在进行旋转,例如,这可能是实现反射最可维护的方式。

答案 4 :(得分:1)

我有一种更简单,更简单的方法在c ++中实现

#include<graphics.h>
#include<iostream>
#include<conio.h>
using namespace std;

int main(){
cout<<"Enter the point";
float x,y;
int gm,gd=DETECT;
initgraph(&gd,&gm,"C:\\TC\\BGI");

cin>>x;
cin>>y;
putpixel(x,y,RED);
cout<<"Enter the line slop and intercept";
float a,c;
cin>>a;
cin>>c;
float x1,y1;
x1 = x-((2*a*x+2*c-y)/(1+a*a))*a;
y1=(2*a*x+2*c-y)/(1+a*a);
cout<<"x = "<<x1;
cout<<"y = "<<y1;

putpixel(x1,y1,BLUE);
getch();

}

答案 5 :(得分:0)

link包含的算法类似于您尝试执行的操作:

这反映了正常光线。

alt text http://local.wasp.uwa.edu.au/~pbourke/geometry/reflected/diagram.gif

答案 6 :(得分:0)

反映点在线 给定点P(x,y)和线L1然后P(X,Y)是线L1上的反射点 如果我们将点P连接到P'以获得L2,则L2的梯度= 1 / m1,其中m1是L1的梯度 L1和L2彼此垂直 得到L1和L2的交点说m(a,b) 由于m(a,b)是PP'的中点,即L2 M =
ie =从这里我们可以得到坐标 例 在行中的反射下找到点P(4,3)的图像 M1 = 1 M2将为-1 恶趣。带有点的L2,(4,3),(x,y)grad -1是

交叉点说,M(a,b)  注意,L1 = L2;   然后   这给出了M的点,即M(6,1)       然后;

$(document).on('click', '.PortletTableUseButton', function () { ... });

P'(x,y)= P'(8,-1)

答案 7 :(得分:0)

在线y = mx + c中反映点A(x,y)。
给定点P(x,y)和线L1 y = mx + c  然后P(X,Y)是线L1上的反射点 如果我们将点P连接到P'以获得L2,那么L2 = -1 / m1的梯度,其中m1是L1的梯度。

  L1 and L2 are perpendicular to each other.
        therefore,
    Get the point of intersection of L1 and L2 say m(a,b)
    Since m(a,b) is the midpoint of PP’ i.e. L2, then
    M= (A+A')/2 
    i.e. m(a,b)=(A(x,y)+ A^' (x^',y^' ))/2.
      from this we can get coordinates of  A^' (x^',y^' )

示例

Find the image of point P(4,3) under a reflection in the line  y=x-5
M1=1
M2 will be -1
Equ. L2 with points, (4,3) , (x ,y) grad -1 is
     y=-x+7
Point of intersection say, M(a ,b)
 Note that, L1 =L2 ;
  Then x-5=-x+7
  This gives the point for M that is M( 6,1)
      Then;
         M(6,1)=(P(4,3)+P^' (x^',y^' ))/2
          M(6,1)=[(4+x)/2  ,(3+y)/2]
              This gives x = 8 and y = -1 hence,
                  P^' (x^',y^' )=         P^' (8,-1)

答案 8 :(得分:0)

找到给定线的斜率。 说它是m。 因此,连接点及其镜像的线的斜率为-1 / m。 使用斜率点形式查找线的方程并找到它与给定线的相互作用。最后使用中点公式中的交点来获得所需的点。 问候, Shashank Deshpande