AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Delphi-PRAXiS - Lounge Klatsch und Tratsch Mathematik: Konturen (Punkte-Array) vergleichen
Thema durchsuchen
Ansicht
Themen-Optionen

Mathematik: Konturen (Punkte-Array) vergleichen

Ein Thema von Matze · begonnen am 21. Nov 2018 · letzter Beitrag vom 17. Dez 2018
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#1

AW: Mathematik: Konturen (Punkte-Array) vergleichen

  Alt 21. Nov 2018, 07:35
Hallo TigerLilly ,

vielen Dank für deine Antwort!

Ich hatte gerade noch einen anderen Ansatz, der auch funktionieren könnte, aber mit O(n²) laufzeitkritisch ist.
Bei geschätzt max. 10000 Punkten müsste ich die Laufzeit aber mal messen.

Pseudo-Code:
Code:
foreach refPoint in refContour
{
    foreach (contPoint in contour)
    {
        if (contPointIndex > 0)
        {
            // Gerade aus den 2 Kontour-Punkten berechnen (aktueller + voriger Punkt)
            // Abstand refPoint zur Gerade berechnen
            // Wenn Abstand eines Punkts <= Toleranz: Ref-Punkt OK       }
}
Grüße
Matze

Geändert von Matze (21. Nov 2018 um 07:46 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von TigerLilly
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.241 Beiträge
 
Delphi 12 Athens
 
#2

AW: Mathematik: Konturen (Punkte-Array) vergleichen

  Alt 21. Nov 2018, 07:40
Naja, du hast mit Ähnlichkeiten zu tun, das heißt du brauchst kein entweder/oder sondern ein Maß.

Wenn deine Konturen bis auf 1 Punkt weitab deckungsgleich sind, würde dein Verfahren auf "ungleich" plädieren. Das möchtest du doch nicht, oder?
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#3

AW: Mathematik: Konturen (Punkte-Array) vergleichen

  Alt 21. Nov 2018, 07:49
Wenn deine Konturen bis auf 1 Punkt weitab deckungsgleich sind, würde dein Verfahren auf "ungleich" plädieren. Das möchtest du doch nicht, oder?
Ich hatte noch einen Denkfehler drinnen und gerade oben korrigiert:
Wenn die Schleife beendet wird, sobald der Abstand zu groß ist, werden die Konturen nie übereinstimmen, da für alle Punkte der Abstand berechnet wird (und somit ein Rechteckpunkt oben links mit einem unten rechts verglichen wird, was die Toleranz überschreitet).

D.h. man muss die innere Schleife abbrechen, wenn der Abstand <= der Toleranz ist und mit der Info entsprechend weiter arbeiten.
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.688 Beiträge
 
Delphi 2007 Enterprise
 
#4

AW: Mathematik: Konturen (Punkte-Array) vergleichen

  Alt 21. Nov 2018, 08:22
Pseudo-Code:
Code:
foreach refPoint in refContour
{
    foreach (contPoint in contour)
    {
        if (contPointIndex > 0)
        {
            // Gerade aus den 2 Kontour-Punkten berechnen (aktueller + voriger Punkt)
            // Abstand refPoint zur Gerade berechnen
            // Wenn Abstand eines Punkts <= Toleranz: Ref-Punkt OK       }
}
Grüße
Matze
Ich hatte für meine Abschlussarbeit mal ein Vektor-basiertes Kompressionsverfahren gebaut, welches ziemlich genau dieses Problem aufwarf: Nach der Kantenerkennung wollte ich die entstandenen Pfade zu Catmull-Rom-Splines mit möglichst wenigen Kontrollpunkten umwandeln. Dazu habe ich (rech verschwenderisch, aber darum ging es nicht) erstmal immer gesagt: Pfad = Splinepunkte, und dann einen Punkt im Spline entfernt, die Splines mit fixer Auflösung in eine temporäre Kurve überführt, und mit genau deiner Methode eine Metrik für Ähnlichkeit Kurve:Ursprungspfad gestrickt. Das ganze iterativ für alle Möglichkeiten durchgespielt (es war sicherlich NICHT schnell!), und den Punkt letztlich aus der Kurve gelöscht, durch den der geringste "Fehler" entstanden war. Das alles dann etliche Male wiederholt, bis eine empirisch ermittelte Fehlergrenze nicht mehr unterschreitbar war.

Die Ergebnisse waren wirklich gut, auch wenn der Ansatz nicht die optimale Lösung garantieren dürfte; es war aber mehr als gut genug und hat in nur wenigen Extremfällen Murks produziert. Was meiner Meinung nach aber Grundvoraussetzung für diesen Ansatz ist, ist eine bereits recht gute Ähnlichkeit der verglichenen Pfade von Anfang an. Wie sich das bei stark abweichenden Kurven verhält habe ich nie geprüft, da ich ja quasi andersherum gegangen bin und mit einem 100% Match angefagen habe.


Edit: Ouuu neee, das ganze war sogar nur eine Metrik um die Punktlöschung zu terminieren! Die Auswahl der Punkte habe ich anhand der Krümmung gemacht. Also immer den testweise gelöscht, bei dem die Krümmung im gesamten Spline die geringste war, und dann mit o.g. Methode gemessen ob ich das noch als "okay genug" bewertete und weiter versuchen will. Krümmung aus einer diskreten Punktmenge zu ermitteln war auch nicht unspannend

Edit 2: Was das ganze hier letztlich heißen sollte ist: Jup, ich halte das für einen guten Ansatz. Das Ergebnis mag nicht immer das Optimum sein, schneller geht es vermutlich auch irgendwie, aber es ist noch anschaulich und sicherlich schneller und leichter zu implementieren als andere potenzielle Verfahren (über die ich keine Kenntnis habe, und damals wie du auch keine so wirklich fand).
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)

Geändert von Medium (21. Nov 2018 um 08:32 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.629 Beiträge
 
Delphi 12 Athens
 
#5

AW: Mathematik: Konturen (Punkte-Array) vergleichen

  Alt 21. Nov 2018, 08:40
Nur so als extreme Testfälle.

Fall 1: Referenzkontur 1 ist ein Rechteck aus 4 Punkten, Kontur 2 ein Kreis aus 360 Punkten, der genau durch die Eckpunkte des Rechtecks geht.

Fall 2: Das gleiche Beispiel, aber diesmal ist der Kreis die Referenzkontur.

Der Algorithmus müsste in beiden Fällen keine Übereinstimmung auswerfen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von TigerLilly
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.241 Beiträge
 
Delphi 12 Athens
 
#6

AW: Mathematik: Konturen (Punkte-Array) vergleichen

  Alt 21. Nov 2018, 09:18
Nur so als extreme Testfälle.

Fall 1: Referenzkontur 1 ist ein Rechteck aus 4 Punkten, Kontur 2 ein Kreis aus 360 Punkten, der genau durch die Eckpunkte des Rechtecks geht.

Fall 2: Das gleiche Beispiel, aber diesmal ist der Kreis die Referenzkontur.

Der Algorithmus müsste in beiden Fällen keine Übereinstimmung auswerfen.
Naja, das muss nicht sein. Denn wenn du nur 4 Punkte hast, weißt du über die Kontur eigentlich nichts. Und dann ist die Frage, welches Maß für Ähnlichkeit man hat bzw was man als "ähnlich" definiert. Die Kreismethode würde in beiden Fällen eher "nicht ähnlich" liefern, weil es nur wenig Deckung gäbe.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.629 Beiträge
 
Delphi 12 Athens
 
#7

AW: Mathematik: Konturen (Punkte-Array) vergleichen

  Alt 21. Nov 2018, 10:18
Denn wenn du nur 4 Punkte hast, weißt du über die Kontur eigentlich nichts.
Der gezeigte Algorithmus geht von einer geraden Verbindung zwischen den Punkten aus - darauf bezog sich mein Einwand. Bei andersartigen Konturabschnitten (Kreisbogen, Bezier) kommt man mit zwei Punkten pro Anschnitt eh nicht aus und der Algorithmus müsste dann ganz anders aussehen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
730 Beiträge
 
Delphi 12 Athens
 
#8

AW: Mathematik: Konturen (Punkte-Array) vergleichen

  Alt 21. Nov 2018, 11:08
Mir fällt da folgender Ansatz ein:

Voraussetzung: Die Kontur ist durch Geraden zwischen den Konturpunkten definiert.

- Es wird eine innere und äußere Kontur gebildet, indem die Konturgeraden um das Maß der Toleranz nach innen bzw außen parallel verschoben werden.

- An den Knickpunkten werden die Schnittpunkte der neuen inneren bzw äußeren Konturgeraden bestimmt. Das sind dann die Eckpunkte der Toleranzfläche.

- Dann wird für jeden Punkt der zu prüfenden Kontur geprüft, ob er innerhalb der Toleranzfläche liegt. Dazu bildet man eine Gerade von dem zu prüfenden Punkt nach irgendwo ganz weit außerhalb und bestimmt die Anzahl der Schnittpunkte dieser Gerade mit der inneren und äußeren Kontur der Toleranzfläche. Ist die Anzahl ungerade, liegt der Punkt innerhalb der Toleranz.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.629 Beiträge
 
Delphi 12 Athens
 
#9

AW: Mathematik: Konturen (Punkte-Array) vergleichen

  Alt 21. Nov 2018, 12:34
- Es wird eine innere und äußere Kontur gebildet, indem die Konturgeraden um das Maß der Toleranz nach innen bzw außen parallel verschoben werden.

- An den Knickpunkten werden die Schnittpunkte der neuen inneren bzw äußeren Konturgeraden bestimmt. Das sind dann die Eckpunkte der Toleranzfläche.
Das hört sich einfacher an als es tatsächlich ist und kann ganz schön tricky werden, wenn durch die Parallelverschiebung und die Schnittpunktberechnung plötzlich ganze Teilstrecken verschwinden (gerade bei kurzen Teilstrecken im Verhältnis zum Toleranzwert). Diese Beispiel zeigt dabei noch einen relativ simplen Fall.

Die Abstandsberechnung ist da schon deutlich stabiler und vermutlich auch effizienter.
Angehängte Grafiken
Dateityp: png 21-11-_2018_13-28-40.png (2,8 KB, 12x aufgerufen)
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
ISMIRSCHLECHT

Registriert seit: 17. Dez 2018
Ort: Görlitz
69 Beiträge
 
#10

AW: Mathematik: Konturen (Punkte-Array) vergleichen

  Alt 17. Dez 2018, 15:36
Hallo,

ist das Problem noch relevant ?
Falls ja : Die Konturen ausfüllen (also doch als Bild) und nach "zweidimensionaler Kreizkorrelation" suchen.
D.h. beide Konturen sind dann Arrays mit den Werten 0 oder 1.
Die KKF wirkt Wunder

ISMIRSCHLECHT (ism)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz