Comment trouver si une ligne interceptée dans un polygoneintersection Ligne
Répondre
Vous avez besoin des points du polygone sur un graphique de coordonnées et la pente et x et l'ordonnée y de la ligne pour trouver cette information. De là, c'est un calcul simple.
La question est un peu ambigu, mais nous allons quand même essayer:
On suppose les points (x, y) sur la ligne sont définis par l'équation Ax + By + C = 0. Ensuite, nous pouvons évidemment déterminer si un point (x, y) est sur la ligne en évaluant Ax + By + C. Si le point n'est pas sur la ligne alors le signe de Ax + By + C nous indique de quel côté de la ligne le point est. Par conséquent, en inspectant les signes de l'expression Ax + By + C pour chaque sommet (x, y) du polygone, nous pouvons déterminer si tous les points du polygone sont du même côté de la ligne ou non.
(Un problème légèrement différent serait de déterminer si un polygone croise un segment de droite.)
Selon ce que vous voulez exactement (je suppose un segment de ligne que je viens d'écrire ce code cette semaine) vous peut l'obtenir en deux parties:
d'abord tout ce que je vous suggère codant pour des lignes comme
a*X + b*Y - c = 0
parce que la forme n'a pas d'angle pour des cas comme des lignes X=5
, Y=4
ou X=3*Y
.
- test si la ligne croise un côté quelconque du polygone
- test si les extrémités des deux lignes sont sur des côtés opposés de l'autre ligne. La forme proposée rend ce facile en train de vérifier la polarité de la LHS
- test si un point sur la ligne est à l'intérieur du polygone
- test si une ligne d'un point sur votre ligne d'entrée à l'extérieur du polygone recoupe le polygone à un nombre impair de points. Soyez averti que vous devrez vérifier le même point d'apparition à partir de plusieurs endroits et à cause des erreurs de FP, cela ne peut pas être fait avec un test de correspondance exacte.
Vous pouvez lire une réponse raisonnable de cette mise en œuvre dans une page web trouvé
Point * intersection2(Point * _line1, Point * _line2) {
Point p1,p2,p3,p4;
p1=_line1[0]; p3=_line2[0];
p2=_line1[1]; p4=_line2[1];
// Store the values for fast access and easy
// equations-to-code conversion
double x1 = p1.x, x2 = p2.x, x3 = p3.x, x4 = p4.x;
double y1 = p1.y, y2 = p2.y, y3 = p3.y, y4 = p4.y;
double A1 = y2-y1;
double B1 = x1-x2;
double C1 = (A1*x1)+(B1*y1);
double A2 = y4-y3;
double B2 = x3-x4;
double C2 = A2*x3+B2*y3;
double det = A1*B2 - A2*B1;
if (det==0){
return NULL;
}else{
// Return the point of intersection
Point * ret = new CvPoint2D64f();
ret->x = (B2*C1 - B1*C2)/det;
ret->y = (A1*C2 - A2*C1)/det;
return ret;
}
}
Référence. C++ Exemple: Concepts de géométrie ligne d'intersection et de ses applications, 2D dessin par lbackstrom à partir du site ucancode
S'il vous plaît fournir plus d'informations –
S'il vous plaît clarifier la question un peu. Voulez-vous dire une ligne 2D coupant un polygone 2D? Une ligne 3D passant par le plan d'un polygone 2D et le point d'intersection de la ligne et le plan est également à l'intérieur du polygone? Est-ce un polygone général ou pouvons-nous supposer qu'il est convexe? –
Y a-t-il un langage de programmation dans lequel vous faites cela? Beaucoup ont construit dans les bibliothèques pour cela. –