Le programme doit lire les valeurs de trois coordonnées
ainsi qu'une autre coordonnée P (x, y) et déterminer si ce point se trouve à l'intérieur d'un triangle formé à partir des 3 points ci-dessus.
La bonne façon de le faire est de calculer les coordonnées barycentriques du quatrième point étant donné les trois points de votre triangle. La formule pour les calculer est donnée à la fin de la section "Conversion en coordonnées barycentriques", mais j'espère fournir ici une explication moins intense en mathématiques.
Supposons, par souci de simplicité, que vous avez une structure, point
, qui a des valeurs x
et y
. Vous avez défini vos points comme:
point p1(x1, y1);
point p2(x2, y2);
point p3(x3, y3);
point p(x,y); // <-- You are checking if this point lies in the triangle.
Maintenant, les coordonnées barycentriques, généralement appelées alpha
, beta
et gamma
, sont calculées comme suit:
float alpha = ((p2.y - p3.y)*(p.x - p3.x) + (p3.x - p2.x)*(p.y - p3.y)) /
((p2.y - p3.y)*(p1.x - p3.x) + (p3.x - p2.x)*(p1.y - p3.y));
float beta = ((p3.y - p1.y)*(p.x - p3.x) + (p1.x - p3.x)*(p.y - p3.y)) /
((p2.y - p3.y)*(p1.x - p3.x) + (p3.x - p2.x)*(p1.y - p3.y));
float gamma = 1.0f - alpha - beta;
Si tous les alpha
, beta
et gamma
sont supérieurs à 0
, alors le point p
se trouve dans le triangle composé de points p1
, p2
, et p3
.
L'explication derrière cela est qu'un point à l'intérieur d'un triangle peut être décrit en utilisant les points du triangle et trois coefficients (un pour chaque point, dans la plage [0,1]):
p = (alpha)*p1 + (beta)*p2 + (gamma)*p3
Réorganiser cette fonction vous donne la formule pour calculer les coordonnées barycentriques, mais je pense que les étapes à suivre pourraient dépasser la portée de la question. Ils sont fournis sur la page Wikipédia que j'ai liée en haut.
Il s'ensuit que chaque coefficient doit être supérieur à 0 pour que le point p
se situe dans la zone décrite par les trois points.
Au lieu de P1, P2 et P3, supposons que les points sont A, B et C.
A(10,30)
/ \
/ \
/ \
/ P \ P'
/ \
B (0,0) ----------- C(20,0)
Algorithme:
1) Calculate area of the given triangle, i.e., area of the triangle ABC in the above diagram.
Area A = [ x1(y2 - y3) + x2(y3 - y1) + x3(y1-y2)]/2
2) Calculate area of the triangle PAB. We can use the same formula for this. Let this area be A1.
3) Calculate area of the triangle PBC. Let this area be A2.
4) Calculate area of the triangle PAC. Let this area be A3.
5) If P lies inside the triangle, then A1 + A2 + A3 must be equal to A.
Ci-dessous est un programme en C:
#include <stdio.h>
#include <stdlib.h>
/* A utility function to calculate area of triangle formed by (x1, y1),
(x2, y2) and (x3, y3) */
float area(int x1, int y1, int x2, int y2, int x3, int y3)
{
return abs((x1*(y2-y3) + x2*(y3-y1)+ x3*(y1-y2))/2.0);
}
/* A function to check whether point P(x, y) lies inside the triangle formed
by A(x1, y1), B(x2, y2) and C(x3, y3) */
bool isInside(int x1, int y1, int x2, int y2, int x3, int y3, int x, int y)
{
/* Calculate area of triangle ABC */
float A = area (x1, y1, x2, y2, x3, y3);
/* Calculate area of triangle PBC */
float A1 = area (x, y, x2, y2, x3, y3);
/* Calculate area of triangle PAC */
float A2 = area (x1, y1, x, y, x3, y3);
/* Calculate area of triangle PAB */
float A3 = area (x1, y1, x2, y2, x, y);
/* Check if sum of A1, A2 and A3 is same as A */
return (A == A1 + A2 + A3);
}
/* Driver program to test above function */
int main()
{
/* Let us check whether the point P(10, 15) lies inside the triangle
formed by A(0, 0), B(20, 0) and C(10, 30) */
if (isInside(0, 0, 20, 0, 10, 30, 10, 15))
printf ("Inside");
else
printf ("Not Inside");
return 0;
}
Heure: O (1)
Espace: O (1)
Prenez la moyenne des trois points donnés. Ce nouveau point P4 se trouvera toujours à l'intérieur du triangle.
Vérifiez maintenant si P et P4 se trouvent du même côté de chacune des trois lignes P1P2
P2P3
et P3P1
. Vous pouvez le faire en vérifiant les signes des produits croisés (P -> P1) x (P -> P2)
et (P4 -> P1) x (P4 -> P2)
(où P-> P1 est le vecteur de P à P1), puis les deux autres paires.