Frage

Ich habe eine Frage sehr ähnlich wie diese:

  

Wie kann man wissen, ob eine Zeile eine Ebene in C # schneidet?

ich für ein Verfahren bin auf der Suche (in C #), die, wenn eine Zeile sagt, einen willkürlichen Polygon schneidet.

ich glaube, der Algorithmus, der von Chris Marasti-Georg war sehr hilfreich, aber die wichtigste Methode fehlt, dh Linie Linie Kreuzung.

Kennt jemand eine Linie Schnittverfahren abzuschließen Chris Marasti-Georgs-Code oder haben etwas ähnliches?

Sie haben einen integrierten Code für diese in C #?

Diese Methode ist für die Verwendung mit dem Algorithmus Bing Maps mit einem verbotenen Bereich Feature erweitert. Der resultierende Pfad darf nicht durch den verbotenen Bereich passiert (die willkürliche Polygon).

War es hilfreich?

Lösung

Es gibt keinen eingebauten Code für die Kantenerkennung in den .NET-Framework aufgebaut.

Hier Code (portiert C #) das tut, was man braucht (der tatsächliche Algorithmus bei comp.graphics.algorithms auf Google-Gruppen gefunden wird):

public static PointF FindLineIntersection(PointF start1, PointF end1, PointF start2, PointF end2)
{
    float denom = ((end1.X - start1.X) * (end2.Y - start2.Y)) - ((end1.Y - start1.Y) * (end2.X - start2.X));

    //  AB & CD are parallel 
    if (denom == 0)
        return PointF.Empty;

    float numer = ((start1.Y - start2.Y) * (end2.X - start2.X)) - ((start1.X - start2.X) * (end2.Y - start2.Y));

    float r = numer / denom;

    float numer2 = ((start1.Y - start2.Y) * (end1.X - start1.X)) - ((start1.X - start2.X) * (end1.Y - start1.Y));

    float s = numer2 / denom;

    if ((r < 0 || r > 1) || (s < 0 || s > 1))
        return PointF.Empty;

    // Find intersection point
    PointF result = new PointF();
    result.X = start1.X + (r * (end1.X - start1.X));
    result.Y = start1.Y + (r * (end1.Y - start1.Y));

    return result;
 }

Andere Tipps

Ein wenig off topic, aber wenn die Zeile unendlich Ich denke, es gibt eine viel einfachere Lösung:

Die Linie geht nicht durch das Polygon, wenn alle der Punkt auf der gleichen Seite der Zeile.

Mit Hilfe von diesen beiden:

Ich habe dieses kleine Juwel:

  public class PointsAndLines
  {
    public static bool IsOutside(Point lineP1, Point lineP2, IEnumerable<Point> region)
    {
      if (region == null || !region.Any()) return true;
      var side = GetSide(lineP1, lineP2, region.First());
      return
        side == 0
        ? false
        : region.All(x => GetSide(lineP1, lineP2, x) == side);
    }

    public static int GetSide(Point lineP1, Point lineP2, Point queryP)
    {
      return Math.Sign((lineP2.X - lineP1.X) * (queryP.Y - lineP1.Y) - (lineP2.Y - lineP1.Y) * (queryP.X - lineP1.X));
    }
  }

Um Kollisionen zwischen den Polygonen in unserem Silverlight-Kartenprojekt zu ermitteln, verwenden wir Klipper Bibliothek:

Frei für kommerzielle Nutzung, geringe Größe, hohe Leistung und sehr einfach zu bedienen.

Clipper Webseite

Dieser Artikel sieht aus wie es wird helfen,

http://www.codeproject.com/KB/recipes/2dpolyclip.aspx

Dieser Code ist ein zweidimensionaler Polygon-Clipping-Algorithmus, der genau bestimmt, wo eine Linie mit einer Polygon Grenze schneidet. Dieser Code funktioniert sowohl für konkave und konvexe Polygone vollständig beliebiger Form und ist in der Lage jede Linie Orientierung zu behandeln.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top