给定一个点(x1,y1)和一个线的方程(y = mx + c),我需要一些伪代码来确定点(x2,y2),它是整个线上第一个点的反射。花了大约一个小时试图弄清楚没有运气!
请点击此处查看可视化 - http://www.analyzemath.com/Geometry/Reflection/Reflection.html
答案 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)
我没有检查以下代码,但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.L
和L.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