Dans l'avion 2D, j'ai un point et une ligne. Comment obtenir le point de miroir le long de cette ligne? P>
8 Réponses :
calculer le point le plus proche de la ligne au point de question. Ensuite, inverser la direction du vecteur entre ces points et l'ajoutez au point le plus proche de la ligne. Voilà, vous avez trouvé le point de miroir. P>
Avec maths: paulbourke.net/geometry/pointeline ou essayez Google: Google.com/...
Supposons que l'équation de la ligne soit La deuxième partie est, pour trouver un point sur la deuxième ligne qui est équidistant comme premier point de la première ligne. Pour cela, vous pouvez trouver l'intersection des deux lignes. Calculez les différences dans AX + BY + C = 0 code>. Maintenant, imaginez une ligne perpendiculaire à celle-ci, qui peut être représentée par -bx + ay + d = 0 code> (produit des pentes de deux lignes perpendiculaires est -1). Maintenant, le problème est de trouver d code>. Placez la coordonnée du point sur la deuxième ligne et vous obtiendrez la valeur de d code> facilement. P>
x code> et y code> du point donné et du point d'intersection. Ajoutez maintenant ceux aux x code> et y code> du point d'intersection. Cela donne le point dont vous avez besoin (vous devrez peut-être nier les différences - c'est à l'ordre de la soustraction que vous utilisez). P>
Lorsque des choses comme celle-ci sont effectuées dans des programmes informatiques, l'une des questions que vous pourriez avoir à traiter est d'effectuer ces calculs à l'aide de l'arithmétique entier uniquement (ou autant que possible), en supposant que l'entrée est en entiers. Faire cela dans les entiers autant que possible est un problème distinct que je ne couvrirai pas ici.
Ce qui suit est une solution «mathématique», qui, si elle sera réalisée littéralement nécessitera des calculs à virgule flottante. Je ne sais pas si cela est acceptable dans votre cas. Vous pouvez l'optimiser à votre goût vous-même. P>
(1) strong> représente votre ligne équation. Notez que le vecteur Par exemple, si la ligne est définie par deux points (2) strong> normaliser l'équation en divisant Tous les coefficients par la longueur du vecteur puis calculez les valeurs p> l'équation p> est toujours une équation équivalente de votre ligne Ce sera Donnez-vous la Signée em> distance Le panneau indique que côté em> de la ligne (4) strong> afin de trouver votre point de miroir "à travers la ligne" signifie vraiment que si le point Ceci peut simplement être exprimé comme en déplaçant le point la distance de Cela signifie que P> l code> par p> (a, b) code> est le vecteur normal de cette ligne. P> x1 (x1, y1) code> et x2 (x2, y2) code>, puis p> (a, b) code>. C'est à dire. Calculez la longueur p> l code> sauf que maintenant le vecteur normal (a ', b') code> est un vecteur d'unité. P> p (px, py) code> et calculez la valeur p> d code> à partir de votre point p code> à votre ligne l code>. En d'autres termes, il s'agit de la distance entre p code> au point le plus proche du l code> (nous ne nous soucions pas vraiment du point le plus proche lui-même, nous avons juste besoin de la distance). p> l code> le point p code> est sur. Si p code> est sur le même côté, le vecteur (a ', b') code> est pointé vers ("positif"), la distance est positive. Si p code> est de l'autre côté (côté "négatif"), la distance est négative. P> p '(px', py ') code> Vous devez déplacer votre point p code> par la distance absolue | 2 * d | code> à travers la ligne l code> de l'autre côté. p> p code> était allongé sur le côté "positif" de l code>, alors nous devons le déplacer contre La direction du vecteur (a ', b') code> au côté "négatif". Et vice versa, si le point p code> était couché sur le côté "négatif" de l code>, nous devons le déplacer dans la direction du vecteur (a ', B ') code> au côté "positif". P> -2 * d code> (notez le moins) dans la direction du vecteur (a ', b') code>. p> px' = nx + (nx - px)
py' = ny + (ny - py)
Beaucoup de réponses de programmation mieux que le chèque marqué un à mon avis.
Je suis d'accord avec @badweasel. Celui-ci devrait être marqué comme la bonne réponse.
@XFX et BADWEASEL: C'est un problème avec le général. À tout le moins, le tri des votes doit trier par vote! Je me suis plaint de la méta-canal à ce sujet, mais ils ne s'en soucient pas et refusent de réparer le bogue. Les mods communautaires ne se soucient pas non plus, et ils sont en fait assez obstinés à ce sujet, même s'ils sont (manifestement) factuellement incorrect. Mauvaise gestion ... ¯ \ _ (ツ) _ / ¯
Je suppose que vous avez l'emplacement du point et une équation pour votre ligne, c'est-à-dire premier, le boîtier évident où a = 0 (ligne parallèle à l'axe x) Conspose p> pour le cas plus général, p> Obtenez l'équation générique pour une ligne orthogonale à la vôtre: Y = CX + D, avec AC = -1 P>
==> c = -1 / a p> li>
Déterminez B de sorte que p appartient à la ligne orthogonale: Y1 = -X1 / A + D P>
==> D = Y1 + X1 / A P> LI>
Obtenez l'intersection entre les deux lignes: Y = -X / A + Y1 + X1 / A = AX + B P>
==> x = (Y1 + x1 / a -b) / (A + 1 / a), Y = A (Y1 + X1 / A -B) / (A + 1 / A) + B p> li>
Obtenez le vecteur entre l'intersection et votre point P, ajoutez-le au point d'intersection pour obtenir le point de miroir P '. P>
==> p '(x2, y2), avec
x2 = x1 + 2 ((Y1 + x1 / a -b) / (A + 1 / A) - x1)
Y2 = Y1 + 2 (A (Y1 + X1 / A -B) / (A + 1 / A) + B - Y1) P> LI>
ol> Certaines étapes peuvent être simplifiées mais c'est l'idée générale. J'ai fait l'algèbre en tapant, alors il pourrait y avoir des erreurs. Si vous en trouvez un, s'il vous plaît laissez-moi savoir. P> p>
Cela ne va pas fonctionner pour une ligne verticale ( x = constante code>) et il va avoir des problèmes pour des lignes presque verticales. Vous devez commencer par une équation implicite ( AX + BY + C = 0 code>).
@Dhopp: À droite, cette solution n'est pas assez générale.
J'ai fait exactement cela pour un autre système que j'ai construit .. Il y en a beaucoup plus que cela dans mon code; donc j'espère avoir extrait tous les bits nécessaires ... L'algorithme est basé sur l'idée que la pente d'un La ligne perpindiculaire à une ligne donnée est la réciproque multiplicative négative de la pente de la ligne donnée. I.e., si une ligne a une pente m, l'autre ligne a une pente -1 / m. Donc, tout ce que vous avez à faire est de former une ligne à travers le point avec une pente égale à -1 / m et trouvez l'intersection de cette ligne avec la ligne d'origine. P> line.closestpoint (point PT) code> est la méthode que vous voulez ... public class Line
{
protected const double epsilon = 1.0e-8;
public Point Anchor { get; set; }
public double Slope { get; set; }
public virtual Point ClosestPoint(Point pt)
{ return Intersection(Make(pt, -1 / Slope)); }
protected Line(Point anchor, double slope)
{
Anchor = anchor;
Slope = slope;
}
public static Line Make(Point anchor, double slope)
{ return new Line(anchor, slope); }
public virtual Point Intersection(Line line)
{
if (lib.Within(line.Slope, Slope, epsilon))
if( lib.Within(line.YIntcpt, YIntcpt, epsilon))
// code for NoInterceptException not included
throw new NoInterceptException(
"The two lines overlap.");
else return Point.NullPoint;
// ----------------------------------------
double tm = Slope, om = line.Slope,
tx = Anchor.X, ty = Anchor.Y,
ox = line.Anchor.X, oy = line.Anchor.Y;
var x = double.IsInfinity(tm) ? tx :
double.IsInfinity(om) ? ox :
(tm * tx - om * ox + oy - ty) /
(tm - om);
var y = double.IsInfinity(tm) ?
om * (x - ox) + oy :
tm * (x - tx) + ty;
return Point.Make(x, y);
}
}
public struct Point
{
const double epsilon = 1.0e-12;
private readonly bool isDef;
private readonly double y;
private readonly double x;
public bool HasValue { get { return isDef; } }
public bool IsNull { get { return !isDef; } }
private Point(double xValue, double yValue)
{ x = xValue; y = yValue; isDef = true; }
public static Point Make(double x, double y)
{ return new Point(x, y); }
public double X
{
get
{
// code for AlgebraicException not included
if (IsNull) throw new AlgebraicException("Null Point Object");
return x;
}
}
public double Y
{
get
{
// code for AlgebraicException not included
if (IsNull) throw new AlgebraicException("Null Point Object");
return y;
}
}
public static Point NullPoint { get { return new Point();}}
// Other functionality
}
Les détails dépendent de la manière dont votre ligne est représentée. Si vous le représentez comme un point arbitraire q strong> '= q fort> + 2 (i - nn strong> t sup>) ( p fort> - (Ici, je suis la matrice d'identité 2x2, Il n'est pas difficile de convertir d'autres représentations de ligne en une représentation de vecteur point / unitaire. P>
Vous pouvez utiliser une formule simple pour la trouver. Vous devez d'abord écrire la formule de la ligne à l'aide de
3 - 2 x -1 x -1/2 = 3-1 = 2 2 - 2 x +1 x -1/2 = 2+1 = 3
Je développe un code JS qui calculez la formule de réponse Ted hop : q strong> '= q strong> + 2 (i - nn fort> t sup>) ( p fort> - où colonne vecteur p>
d = 1 / sqrt (VX * VX + VY * VY) code> est une longueur inverse de v fort>. Parce que nous utilisons d 2 sup> (= r en code), nous pouvons optimiser les calculs par omace sqrt code> p> // 2D Points P=[x,y] and R are points on line,
// Q is point for which we want to find reflection
function mirror(Q,[P,R]) {
let [vx,vy]= [ R[0]-P[0], R[1]-P[1] ];
let [x,y] = [ P[0]-Q[0], P[1]-Q[1] ];
let r= 1/(vx*vx+vy*vy);
return [ Q[0] +2*(x -x*vx*vx*r -y*vx*vy*r),
Q[1] +2*(y -y*vy*vy*r -x*vx*vy*r) ];
}
console.log( mirror([3,2], [[2,4],[4,5]]) )
Je crois que c'est le mauvais site pour cette question, puisqu'il ne traite pas directement de la programmation. Il y a un autre site pour cela: math.stackexchange.com
Comment votre ligne est-elle définie? (Je suppose que votre point est défini avec ses coordonnées X, Y.)
La ligne est définie en utilisant deux points ou en utilisant 1 point et 1 vecteur.
Wiki a-t-il la réponse à cette question?
@Adam Lee: Comment la ligne est-elle représentée par "1 point et 1 vecteur"? Quel vecteur est-ce? Collinear Vector of the Line? Ou vecteur normal de la ligne?
Voir aussi: Stackoverflow.com/q/3306838/562769