Algorithme de réflexion, un point sur une ligne
Donné un point (x1, y1) et une équation d'une droite (y=mx+c), j'ai besoin de quelques pseudo-code pour déterminer le point (x2, y2) qui est un reflet du premier point de la ligne. Passé environ une heure à essayer de comprendre, il à pas de chance!
Voir ici pour une visualisation http://www.analyzemath.com/Geometry/Reflection/Reflection.html
- Eh bien, pas vraiment un algorithme, mais j'ai écrit quelques explications: martin-thoma.com/reflecting-a-point-over-a-line
- merci pour l'article @orignal. Un exemple aurait été encore mieux
Vous devez vous connecter pour publier un commentaire.
Ok, je vais vous donner un livre de méthode pour ce faire. Si vous êtes intéressé par la façon dont j'ai tiré, dites-moi et je vais vous l'expliquer.
Donné
(x1, y1)
et une ligney = mx + c
nous voulons le point(x2, y2)
reflétée sur la ligne.Ensemble
d:= (x1 + (y1 - c)*m)/(1 + m^2)
Puis
x2 = 2*d - x1
et
y2 = 2*d*m - y1 + 2*c
y
comme point de coordonner et de formule pour décrire la ligne.C'est une explication simple de l'Il-Bhima de la solution. L'astuce est d'avis que ce que vous voulez, c'est le projet ce point orthogonalement sur la ligne, le déplacer par beaucoup, et puis de le déplacer une fois de plus, dans la même direction.
Pour ces types de problèmes, il est plus facile de travailler avec un peu plus de représentation redondante pour une ligne. Au lieu de
y = m x + b
, nous allons représenter la ligne par un pointp
qui est sur la ligne et un vecteurd
dans la ligne de la direction. Appelons ce pointp = (0, b)
, le vecteurd = (1, m)
, et votre point d'entrée serap1
. La projection du point sur la ligne serapl
et de votre point de sortiep2
, alors, estp1 + 2 * (pl - p1) = 2 * pl - p1
La formule que vous avez besoin ici, c'est la projection d'un vecteur
v
sur une ligne qui passe par l'origine dans la directiond
. Elle est donnée pard * <v, d> /<d, d>
où<a, b>
est le produit scalaire entre deux vecteurs.Pour trouver
pl
, nous devons nous déplacer l'ensemble du problème, de sorte que la droite passe par l'origine, par soustraction dep
dep1
, à l'aide de la formule ci-dessus, et en le déplaçant. Ensuite,pl = p + (d * <p - p1, d> /<d, d>)
, doncpl_x = p_x + (b * p1_x) /(1 + m * m)
,pl_y = p_y + (m * p1_x) /(1 + m * m)
, et ensuite utiliserp2 = 2 * pl - p1
pour obtenir les valeurs finales.En référence à la fig ici.
Nous voulons trouver le symétrique du point
A(p,q)
à la ligne L1,eqny = m*x + c
. Dire que reflète le point estA'(p',q')
Supposons que,
La ligne joignant les points A et A' est de la L2 avec eqn: y= m*x + c'
L1 & L2 se coupent en M(a,b)
L'algorithme pour trouver le symétrique du point est comme suit:
1) Trouver la pente de la L2 = -1/m , en tant que L1 et L2 sont perpendiculaires
2) à l'Aide de la m' et A(x,y) trouver c " à l'aide d'eqn de L2
3) Trouver le point d'intersection de " M " L1 L2 anSd
4) maintenant, nous avons les coordonnées de A et M afin de coordonner d'Une " peuvent être facilement obtenus à l'aide de la relation
[ A(p,q)+A'(p',q') ]/2 = M(a,b)
Je n'ai pas vérifié le code suivant, mais la forme grossière de code en FORTRAN est
Réflexion peut être trouvé dans les deux étapes. D'abord traduire (maj) tout en
b
unités, de sorte que le point devientV=(x,y-b)
et la ligne devienty=mx
. Alors un vecteur à l'intérieur de la ligne estL=(1,m)
. Calculons maintenant la réflexion de la droite passant par l'origine,où
V.L
etL.L
sont point des produits et*
est scalaire multiples.Enfin, la touche maj tout en ajoutant
b
, et la réponse finale est(x',y'+b)
.Comme une transformation affine, vous pouvez écrire l'opération ci-dessus que la composition du produit de trois matrices, premier représentant la maj
y => y-b
, puis la réflexion par la droite passant par l'origine, alors la majy => y+b
:La situation est très similaire à la rotation des matrices de la géométrie affine. Si vous avez déjà multiplication de matrice de routines disponibles, parce que vous êtes aussi de faire des rotations par exemple, ce pourrait être la plus facile à gérer la mise en oeuvre de réflexions.
J'ai un moyen plus simple et un moyen facile à mettre en œuvre en c++
}
Ce lien contient un algorithme qui est similaire à ce que vous essayez de faire:
Qui est de refléter les rayons off normal.
le texte d'alt http://local.wasp.uwa.edu.au/~pbourke/geometry/reflected/diagram.gif
Réflexion de point à la ligne
Étant donné un point P(x,y) et une ligne L1 Alors P(X,Y) est l'expression de la virgule sur la ligne L1
Si nous nous joignons le point P à P’ pour obtenir L2 puis gradient de L2=1/m1 où m1 est dégradé de L1
L1 et L2 sont perpendiculaires les uns aux autres
Obtenir le point d'intersection de la L1 et de la L2 dire que m(a,b)
Depuis que m(a,b) est le milieu de PP’ c'est à dire L2, puis
M=
c'est à dire = à partir de ce que nous pouvons avoir les coordonnées de
Exemple
Trouver l'image du point P(4,3) en vertu d'un reflet dans la ligne
M1=1
M2 seront -1
Equ. L2 avec des points, (4,3) , (x ,y) grad -1 est
Point d'intersection dire, M(a ,b)
Notez que, L1 =L2 ;
Alors
Cela donne le point M soit M( 6,1)
Ensuite;
P'(x,y) = P'(8,-1)
Réflexion d'Un point(x,y) de la droite y=mx+c.
Étant donné un point P(x,y) et une ligne L1 y=mx+c.
Alors P(X,Y) est l'expression de la virgule sur la ligne L1.
Si nous nous joignons le point P à P’ pour obtenir L2 puis gradient de L2=-1/m1 où m1 est dégradé de L1.
Exemple
Trouver la pente de la droite.
Dire que c'est m.
De sorte que la pente de la ligne joignant le point et son image dans un miroir est -1/m.
L'utilisation de la pente forme de point pour trouver l'équation de la ligne et de trouver sa interaection avec ligne. Enfin, utiliser le point d'intersection dans le milieu de formule pour obtenir le nombre de points requis.
En ce qui concerne,
Shashank Deshpande