web-dev-qa-db-fra.com

Algorithme de réflexion d'un point sur une ligne

Étant donné un point (x1, y1) et une équation pour une ligne (y = mx + c), j'ai besoin d'un pseudocode pour déterminer le point (x2, y2) qui est le reflet du premier point à travers la ligne. J'ai passé environ une heure à essayer de le comprendre sans succès!

Voir ici pour une visualisation - http://www.analyzemath.com/Geometry/Reflection/Reflection.html

21
McGin

Ok, je vais vous donner une méthode de livre de recettes pour ce faire. Si vous êtes intéressé par la façon dont je l'ai dérivé, dites-le moi et je vous l'expliquerai.

Étant donné (x1, y1) Et une ligne y = mx + c Nous voulons que le point (x2, y2) Soit reflété sur la ligne.

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

Alors x2 = 2*d - x1

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

35
Il-Bhima

Ceci est une explication simple de la solution d'Il-Bhima. L'astuce consiste à remarquer que ce que vous voulez, c'est de projeter ce point orthogonalement sur la ligne, de le déplacer d'autant, puis de le déplacer à nouveau, dans la même direction.

Pour ces types de problèmes, il est plus facile de travailler avec une représentation légèrement plus redondante pour une ligne. Au lieu de y = m x + b, Représentons la ligne par un point p qui est sur la ligne et un vecteur d dans la direction de la ligne. Appelons ce point p = (0, b), le vecteur d = (1, m), et votre point d'entrée sera p1. Le point projeté sur la ligne sera pl et votre point de sortie p2 Sera alors p1 + 2 * (pl - p1) = 2 * pl - p1

La formule dont vous avez besoin ici est la projection d'un vecteur v sur une ligne qui passe par l'origine dans la direction d. Il est donné par d * <v, d> / <d, d><a, b> Est le produit scalaire entre deux vecteurs.

Pour trouver pl, nous devons déplacer tout le problème afin que la ligne passe par l'origine en soustrayant p de p1, En utilisant la formule ci-dessus et en la reculant. Ensuite, pl = p + (d * <p - p1, d> / <d, d>), donc pl_x = p_x + (b * p1_x) / (1 + m * m), pl_y = p_y + (m * p1_x) / (1 + m * m), puis utilisez p2 = 2 * pl - p1 Pour obtenir les valeurs finales.

20
Carlos Scheidegger

La réflexion peut être trouvée en deux étapes. Tout d'abord traduire (décaler) tout vers le bas par b unités, donc le point devient V=(x,y-b) et la ligne devient y=mx. Ensuite, un vecteur à l'intérieur de la ligne est L=(1,m). Maintenant, calculez la réflexion par la ligne passant par l'origine,

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

V.L et L.L sont des produits scalaires et * est un multiple scalaire.

Enfin, remettez tout en place en ajoutant b, et la réponse finale est (x',y'+b).

En tant que transformation affine, vous pouvez écrire l'opération ci-dessus comme la composition (produit) de trois matrices, représentant d'abord le décalage y => y-b, Puis la réflexion à travers la ligne passant par l'origine, puis le décalage y => y+b :

[ 1 0 0] [(1-m^2)/(1+m^2)      2m/(1+m^2) 0] [ 1 0  0] [x]
[ 0 1 b] [     2m/(1+m^2) (m^2-1)/(1+m^2) 0] [ 0 1 -b] [y]
[ 0 0 1] [             0               0  1] [ 0 0  1] [1]

La situation est très similaire aux matrices de rotation en géométrie affine. Si vous avez déjà des routines de multiplication matricielles disponibles, car vous effectuez également des rotations par exemple, cela pourrait être la manière la plus maintenable d'implémenter des réflexions.

2
Edward Doolittle

En référence à la fig ici .

Nous voulons trouver le reflet du point A(p,q) sur la ligne L1, eqn y = m*x + c. Dire que le point réfléchi est A'(p',q')

Supposons que la ligne joignant les points A et A 'soit L2 avec eqn: y = m' * x + c 'L1 & L2 se coupent en M (a, b)

L'algorithme pour trouver la réflexion du point est le suivant: 1) Trouver la pente de L2 est = -1/m, car L1 et L2 sont perpendiculaires 2) En utilisant m 'et A (x, y) trouver c' en utilisant eqn de L2 3) Trouver le point d'intersection 'M' de L1 et L2 4) Comme nous avons maintenant la coordonnée de A et M, la coordonnée de A 'peut être facilement obtenue en utilisant la relation [ A(p,q)+A'(p',q') ]/2 = M(a,b)

Je n'ai pas vérifié le code suivant mais la forme brute de code dans le FORTRAN est

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
2
Yugal_kishore

J'ai un moyen plus simple et facile à implémenter en 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();

}

1
akash mahajan

Réflexion du point A (x, y) sur la ligne y = mx + c.
Étant donné le point P (x, y) et une droite L1 y = mx + c.
Alors P (X, Y) est le point réfléchi sur la ligne L1.
Si nous joignons le point P à P ’pour obtenir L2, alors gradient de L2 = -1/m1 où m1 est gradient de 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^' )

Exemple

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)
0
zadock Masakhwi

Réflexion du point dans la ligne Étant donné le point P (x, y) et une ligne L1 Alors P (X, Y) est le point réfléchi sur la ligne L1 Si nous joignons le point P à P 'pour obtenir L2 alors gradient de L2 = 1/m1 où m1 est un gradient de L1 L1 et L2 sont perpendiculaires l'un à l'autre Obtenez le point d'intersection de L1 et L2 disons m (a, b) Puisque m (a, b) est le milieu de PP 'c'est-à-dire L2, puis M =
c'est à dire. = à partir de cela, nous pouvons obtenir les coordonnées de l'exemple Trouver l'image du point P (4,3) sous une réflexion dans la ligne
M1 = 1 M2 sera -1 Equ. L2 avec points, (4,3), (x, y) grad -1 est

Point d'intersection disons, M (a, b) Notez que, L1 = L2; Alors Ceci donne le point pour M qui est M (6,1) Then;

          This gives x = 8 and y = -1 hence,

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

0
demasakhwi

Ce lien contient un algorithme similaire à ce que vous essayez de faire:

C'est refléter un rayon hors d'une normale.

alt text

0
C Johnson

Trouvez la pente de la ligne donnée. Dis que c'est m. Ainsi, la pente de la ligne joignant le point et son image miroir est de -1/m. Utilisez la forme du point de pente pour trouver l'équation de la ligne et trouver son intersection avec la ligne donnée. Enfin, utilisez le point d'intersection dans la formule du milieu pour obtenir le point requis. Cordialement, Shashank Deshpande

0
Shanky