Geometrie programmieren

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Geometrie programmieren

    Hallo,

    Stellt euch vor ihr habt eine Strecke und einen Punkt. Vielleicht als eigene Klassen.
    Jetzt wollt ihr schauen, ob der Punkt auf der Strecke liegt.

    Die Koordinaten von Punkten können natürlich nur mit endlicher Genauigkeit vorliegen. Die mathematische Formulierung einer Strecke ist hingegen exakt. Es ist also sehr wahrscheinlich sich mathematisch exakt einen Punkt auszurechnen, der auf der Strecke liegt, dessen Koordinaten aber aufgrund der Limitierung der Genauigkeit vom Programm nicht mehr der Strecke zugeordnet werden können.

    Man muss also eine gewisse Fehlertoleranz zulassen (von-bis lass ich gelten).
    Da wäre meine Frage programmiert ihr so eine Toleranz mathematisch korrekt (für 2D+ ist das schon gar nicht mehr so simpel) oder gibt es da ein paar schmutzige Tricks?

    Viele Grüße
    Spekulatius: Die Abweichung Soll-Y zu Ist-Y sollte max. 1 Pixel sein. Zumindest bei 2D.
    Mathematisch gäbe es ja die Möglichkeit, eine Mindest-Ist-Differenz zwischen Punkt und Strecke zu berechnen (2D, 3D, ggf. auch xD, aber mehr hatte ich damals vor 20 Jahren mit meinen anfänglichen 3D-Spiel-Programmierungsversuchen nicht gebraucht). Man hat also einen Punkt im Raum (Ist-Position) und eine Strecke, und dann kann man die (kleinste) Distanz zur Strecke berechnen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hm in dem Kontext, den ich hier gesehen hätte gibt es keine graphische Darstellung und daher wäre sowas wie ein Pixel auch eher irreführend. Als Stellvertreter für eine feste Abweichung, ok. (Sagen wir 0.01mm)
    Die Sache ist bei einer senkrecht verlaufenden Strecke ist jedes Y erlaubt das zwischen Start und Ende liegt.

    Mathematisch habe ich im Moment keine Distanz Strecke-Punkt. Ist aber was, was ich mir direkt mal überlege.

    Für eine Strecke würde ich mathematisch prüfen ob die x-y-Koordinaten des Punkts innerhalb der Bounds der Strecke liegt und ob eine Strecke2 vom Start der Strecke zum Punkt dieselbe Steigung hat wie die Strecke selbst.
    Das sähe ohne Toleranz so aus (px - x0) * (y1 - y0) = (py - y0) * (x1 - x0), mit Toleranzen hab ich mir bisher noch nicht die Mühe gemacht das mathematisch korrekt zu formulieren. Feste Toleranzwerte sind aber nicht korrekt, das weiß ich. Denn bei einer eher senkrechten Strecke müssen Toleranzen in x Richtung stärker gewichtet sein als bei einer eher waagerechten Strecke.
    Nix

    ErfinderDesRades schrieb:

    GraphicsPath
    .
    @Haudruferzappeltnoch Du nimmst Dir die Geradengleichung (2- oder 3-dimensional) und berechnest den senkrechten Abstand des Punktes zur Gerade, das ist eine Zahl.
    Diesen Abstand vergleichst Du mit der zulässigen Toleranz, die musst Du anhand des Kontexts vorgeben.
    de.wikipedia.org/wiki/Gerade
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Haudruferzappeltnoch schrieb:

    Und welche Methode würde dort eine Line auf enthalten eines Points prüfen?
    Das hättest du vlt. auch selbst rausfinden können:

    ObjectBrowser schrieb:

    Public Function IsVisible(point As System.Drawing.Point) As Boolean
    Member of System.Drawing.Drawing2D.GraphicsPath

    Summary:
    Indicates whether the specified point is contained within this System.Drawing.Drawing2D.GraphicsPath.

    Parameters:
    point: A System.Drawing.Point that represents the point to test.

    Returns:
    This method returns true if the specified point is contained within this System.Drawing.Drawing2D.GraphicsPath; otherwise, false.

    ErfinderDesRades schrieb:

    if the specified point is contained within this System.Drawing.Drawing2D.GraphicsPath
    Sieht mir eher danach aus, ob der Punkt im Polygon liegt oder nicht.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Glaubts mir - das geht damit.
    Man kann auch in ieiner Überladung einen Pen angeben, um die Strichbreite zu definieren. Dann matcht das, wenn der Punkt innerhalb gedachten soundso breiten Striches liegt.
    Ja, und es gibt auch was, um Punkte innerhalb eines Polygons zu finden: GB.Outlinevisible (oder wars nu grad annersrum? Outline für Treffer auf der Linie, und Visible für innerhalb des Polygons?

    Egal - für Geometrie empfehle ich den Drawing2D - Namespace - und nix selber rechnen.
    wie gesagt: Drawing2D, und zwar GraphicsPath und Matrix - mit den beiden Klassen kann man eine Unmenge geometrischer Probleme erschlagen.
    Jo - das ist alles auf Integer oder Single ausgerichtet - entsprechend den Structures Point und PointF.
    Und es geht um Drawing - also Zeichnen v.a. auf den Bildschirm, oder aber in einen Drucker.
    Und da hat MS wohl gedacht, single sei auf absehbare Zeit genau genug.
    Im Wpf ist man übrigens auf Double umgestiegen, und die entsprechenden Klassen ticken auch bisserl anders. Aber nur bisserl - die Mathematik ist ja dieselbe.