Maison >développement back-end >C++ >Comment déterminer si un point se trouve dans un polygone en C# ?

Comment déterminer si un point se trouve dans un polygone en C# ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-04 09:56:39729parcourir

How to Determine if a Point Lies Within a Polygon in C#?

Point C# dans un polygone : déterminer si un point se trouve dans un polygone

Considérez le scénario dans lequel vous souhaitez déterminer si un point existe dans les limites d'un polygone. Pour accomplir cette tâche en C# à l'aide de WinForms, suivez ces étapes :

  1. Calculer les limites du polygone : établissez le cadre de délimitation du polygone en identifiant les coordonnées X et Y minimales et maximales parmi ses sommets.
  2. Déterminer si le point est dans les limites : Vérifiez si le point donné se trouve dans le cadre de délimitation du polygone. Sinon, le point est définitivement à l'extérieur du polygone.
  3. Vérifiez l'inclusion du point dans le polygone : Pour déterminer si le point est réellement dans la forme du polygone, utilisez le Point-in- Technique d'algorithme Polygon.

L'un de ces algorithmes est la méthode Ray Crossing, qui implique les étapes suivantes :

a. Imaginez dessiner des rayons horizontaux du point donné jusqu'à l'infini.

b. Comptez le nombre de fois que le rayon coupe les bords du polygone.

c. Si le décompte est impair, le point est à l’intérieur du polygone ; s'il est pair, il est à l'extérieur du polygone.

Voici un exemple d'implémentation de l'algorithme Ray Crossing en C# :

using System;
using System.Collections.Generic;
using System.Drawing;

public class Polygon
{
    List<PointF> vertices = new List<PointF>();

    public bool Contains(PointF point)
    {
        if (IsOutsideBoundingBox(point)) return false;

        int intersectionCount = 0;
        for (int i = 0; i < vertices.Count; i++)
        {
            int j = (i + 1) % vertices.Count;
            PointF a = vertices[i], b = vertices[j];
            if ((a.Y > point.Y && b.Y <= point.Y)
                || (a.Y <= point.Y && b.Y > point.Y))
            {
                double slope = (double)(b.Y - a.Y) / (b.X - a.X);
                if (point.X < a.X + (point.Y - a.Y) / slope)
                    intersectionCount++;
            }
        }

        return intersectionCount % 2 == 1;
    }

    private bool IsOutsideBoundingBox(PointF point)
    {
        return point.X < Xmin || point.X > Xmax || point.Y < Ymin || point.Y > Ymax;
    }
}

Cette implémentation garantit précision et efficacité tout en déterminant si un point est à l'intérieur un polygone.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn