Ähnlichkeit zweier Polygone bestimmen

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

Es gibt 50 Antworten in diesem Thema. Der letzte Beitrag () ist von Mokki.

    Unter "Positionierung" verstehe ich sozusagen die Reihenfolge, in der die Ecken in zwei ähnlichen Polygonen auftreten.
    Also dass so etwas bei dir z.B. nicht vorkommt:

    Die beiden Polygone sind mal grundsätzlich ähnlich (aus optischen Gründen sind hier Rotation und Skalierung identisch, ist aber irrelevant), aber die beiden mit Pfeilen markierten Ecken sind unterschiedlich. Wenn ich jetzt einfach nur im Uhrzeigersinn (oben links beginnend) die einzelnen Ecken der Polygone auf Winkel und die jeweils angrenzenden (folgenden) Seiten auf Länge vergleiche, kommt natürlich Quatsch raus
    BezeichnungWinkel_rotLänge_rotWinkel_grünLänge_grün
    A911910,51
    B450,71790,51
    C2700,7460,7
    D4512700,7
    E910,51451
    F1790,51901

    (Die Winkel und Längen ergeben mathematisch keinen Sinn und sind nur beispielhaft für die Skizze. Ich habe jeweils 1° bzw. 0,01 LE mehr oder weniger gewählt, um zu verdeutlichen, dass es eigentlich etwas größer oder etwas kleiner sein müsste)
    Die Anzahl der Ecken ist zwar bei beiden gleich, jedoch ist sozusagen die Reihenfolge anders, wodurch sich alles verschiebt (die 179°-Winkel ändern an der Ähnlichkeit wenig, aber an der Reihenfolge schon).
    Kann so etwas bei dir vorkommen? Weil deine Skizze hat nicht die gleiche Anzahl an Ecken, ist daher nicht sonderlich aussagekräftig.
    @BjöNi Ja das kann vorkommen, bei deiner Skizze sollte jetzt durch Berechnung trotzdem ein sehr hoher Ähnlichkeits-Wert herauskommen. Meine Skizze ist nicht von mir sondern von einem der verlinken Beiträge, sollte aber dennoch die gleiche Anzahl an Ecken haben, wenn nicht, dann nehmen wir an, es wäre so.

    Allgemein hast du ein gutes Beispiel gebracht, also orientieren wir uns nun an dieser Skizze+Tabelle. Wie müsste ich beim Berechnen nun vorgehen ?
    Mit dieser Bedingung geht das nicht mehr so einfach, jedenfalls imo nicht mehr mit der von Rod vorgeschlagenen Methode - diese baute eben auf Abweichungen der einzelnen Ecken auf.
    Ich frage mich aber, wie du sicherstellen möchtest, dass die Polygone immer die gleiche Anzahl an Ecken haben, wenn die Positionierung (Reihenfolge) der Ecken beliebig ist - sofern das nicht einfach nur aus vorhergehenden Vereinfachungen des komplexeren Polygons resultiert.

    Ich schaue mir das aber morgen nochmal genauer an.
    sofern das nicht einfach nur aus vorhergehenden Vereinfachungen des komplexeren Polygons resultiert
    Genau das ist es, eine Liste von Punkten vereinfacht zu einem Polygon. Okay, dann bis morgen :)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „xd-franky-5“ ()

    xd-franky-5 schrieb:

    Dennoch sind zb. diese beiden Polygone zu 95% identisch
    Das Genom von Homo Sapiens und vom Gorilla ist zu 95% (+-) identisch.
    ========
    @BjöNi Jou.
    Du solltest zunächst, bevor Du weitermachst, eine sehr präzise Aufgabenstellung formulieren und auch Begriffe klar definieren..
    Vielleicht sollten da solche Worte vorkommen wie "Schlauch", "Umgebung", "Toleranz" (siehe Post #15 von @~blaze~ ).
    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!
    @RodFromGermany das war jetzt mal als Beispiel gemeint, was ungefähr rauskommen sollte, so nach Augenmaß.
    Ich wüsste jetzt nicht, wie ich die Wörter verwenden sollte, aber ich dachte, ich habe die Aufgabe nun ausreichend formuliert. Siehe:
    ​Wir haben ein gespeichertes Vergleichspolygon und ein live-ermitteltes Polygon.Beide haben IMMER die selbe Anzahl an Ecken.Beide können unterschiedlich skaliert sein.Beide können unterschiedlich rotiert sein.Beide können unterschiedlich positioniert sein.Es kann vorkommen, dass es mehrere "kleinste Seiten" gibt.


    ​Die Anzahl der Ecken ist zwar bei beiden gleich, jedoch ist sozusagen die Reihenfolge anders, wodurch sich alles verschiebt (die 179°-Winkel ändern an der Ähnlichkeit wenig, aber an der Reihenfolge schon).Kann so etwas bei dir vorkommen? Weil deine Skizze hat nicht die gleiche Anzahl an Ecken, ist daher nicht sonderlich aussagekräftig.

    ​Ja das kann vorkommen, bei deiner Skizze sollte jetzt durch Berechnung trotzdem ein sehr hoher Ähnlichkeits-Wert herauskommen.


    Hoffe es ist nun, zusammengefasst, verständlicher und mir kann man helfen :-/
    @xd-franky-5 Wie sehen denn die Lizenzbedingungen bei codeproject aus?
    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!
    @RodFromGermany opensource.org/licenses/gpl-3.0.html

    Außerdem @BjöNi das mit der Reihenfolge, dass der Knick an einer anderen Stelle ist, kann glaube ich doch nicht vorkommen. In dem codeproject Projekt wird das glaube ich auch nicht berücksichtigt oder? Also nehmen wir erstmal an, das kann nicht passieren. Wie gehe ich vor?

    Mit freundlichen Grüßen Frank
    @xd-franky-5 ICh meinte, ob es für Dich akzeptabel ist.
    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!
    Ok also ich bin nicht sehr gut darin alles bei solchen Problemen zu berücksichtigen und hab auch gerade leider nicht die Möglichkeit das Ganze zu testen, aber warum implementierst du es nicht folgendermaßen:
    1. Größeres Polygon finden
    2. Kleiners Polygon in größeres legen, sodass der Mittelpunkt beider übereinstimmt
    3. Kleines Polygon solange rotieren bis eine ausgewählte Ecke des kleinen am nächsten an einer ausgewählten Ecke des großen dran ist
    4. Kleines Polygon vergrößer bis die ausgewählte Ecke wieder am nähsten dran is
    5. Den Unterschied der Flächen speichern
    6. Schritt 3, 4 und 5 mit alles Ecken eines Polygons wiederhohlen
    7. Die Unterschiede vergleichen => kleinster Unterschied = beste Übereinstimmung
    Wahlweise kannst du natürlich auch Schritt 4 auslassen, falls du die Größe berücksichtigen willst (oder Schritt 3 für die Rotation)



    Lg Mokki
    ​Smartnotr - ein intelligentes Notizprogramm
    zum Thread

    @Mokki also müsste ich erst ein mal von beiden Polygonen den Flächeninhalt berechnen um das größere zu finden, dann müsste ich den Schwerpunkt rausfinden von beiden. Wie soll ich das rotieren, gradweise und dann jeweils die Distanz zweier Ecken berechnen? Wie soll ich vergrößern, pixelweise? Und dann jeweils wieder die Distanz berechnen? Dann wieder beide Flächen berechnen und voneinander abziehen. Und das mit allen Ecken machen. Und dann noch alles miteinander vergleichen. Also ich weiß nicht, ob das überhaupt funktioniert, aber wenn, dann ist es mega rechenaufwendig. Ich denke da gibt es bestimmt eine bessere Lösung :-/
    Trotzdem danke, vielleicht kannst du's dir ja nochmal durch den Kppf gehen lassen.

    mfG Frank

    xd-franky-5 schrieb:

    Wie soll ich vergrößern, pixelweise?
    Kleinste / Größte Kante gleich lang,
    Umkreisdurchmesser, ...
    Wenn Du die Polygone in einer List(Of DoublePoint) hast, sollte das alles kein Problem sein.
    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!
    Ich bin ja normalerweise wirklich aufgeschlossen, was Hilfe für Andere angeht und auch wirklich bereit, da mitzumachen. Was mir aber wirklich absolut nicht gefällt, ist die Art, wie du bei diesem Problem mit uns umgehst. Ich habe dir in deinem anderen Thema einen Algorithmus entworfen, an dem ich längere Zeit gesessen habe, nur um dir dein Unwissen abzunehmen. Er wurde als nicht gut genug betitelt und dass es schon einen besseren gibt - dass er so abstrakt gefasst war, dass er einfach nur noch so weit verbessert werden konnte, dass er jedes Problem hätte lösen können, fand gar nicht erst Beachtung. Gedankt wurde mir auch nicht. Gleich vorweg: Dass ein kleines Problem enthalten ist, das ohne großen Aufwand behoben werden hätte können, ist kein rechtfertigendes Argument.
    Du weigerst dich außerdem anscheinend wehement dagegen, dir die nötigen Grundlagen anzueignen und einfach mal über die Sachen nachzudenken oder diese zu verbessern. Wenn es noch keine Lösung für dein Problem gibt, so ist sie ungeeignet und andere sollen sich eine Lösung für dich überlegen. Ich hatte bereits seit der Erwähnung von Lizenzproblemen das Gefühl, dass du das Programm vertreiben willst - und an dieser Stelle hört bei mir das Verständnis auf. Ich arbeite nicht dafür, dass du Geld bekommst, noch dazu wenn meine Arbeit so geringgeschätzt wird. Ich habe eine gute theoretische Lösung für das gesamte Problem, werde sie dir aber definitiv nicht mehr mitteilen.
    Ich finde so ein Verhalten unverschämt und es verärgert mich wirklich sehr und mir ist wirklich die viele Zeit, die ich mir genommen habe, im Nachhinein zu schade.
    Ich weiß, dass das Feedback harsch ist, aber ich möchte dennoch meinen Standpunkt erläutern und auch gerne deine Meinung dazu hören.

    Viele Grüße
    ~blaze~
    @RodFromGermany Okay, ich versuch' das dann doch mal.

    @~blaze~
    Danke für eure Rückmeldungen

    @RodFromGermanyn Okay danke

    @VB3-Guru danke

    @Morrison Ja das sind Edge Detection Filter, einen solchen habe ich bereits. Es geht um Konturverfolgung Trotzdem danke.

    Ich habe oft gedankt, tut mir leid, wenn ich dich dort ausgelassen habe, war auf jeden Fall nicht mit Absicht. Ich habe, wie gesagt deinen Algorithmus nicht verstanden, also konnte ich ihn selbst auch nicht verbessern.

    Ich kann selbst nicht einschätzen wie gut ich mich auskenne, aber ich versuche wirklich die Grundlagen zu beherrschen, ich arbeite mich schon wochenlang hier durch, habe auch mit IT- und Mathe-Lehrern gearbeitet und versucht Kontakt zum Fraunhofer-Institut zu bekommen. Ich denke auch viel nach und probiere aus, habe einige Skizzen daheim 'rumliegen und habe den einen Algorithmus auch durch viel Überlegen erst zum Laufen gebracht.
    Außerdem möchte ich alle gesammelten Informationen hier veröffentlichen, wie ich schon oft gesagt habe und ein Schulprojekt ist es auch, deshalb wird es eine große Dokumentation geben. Dass eine Firma darauf Aufmerksam geworden ist, habe ich ja erst im Nachhinein mitgekriegt.
    Ich habe deine Arbeit nicht gering geschätzt, ich kann nur nichts damit anfangen.
    @~blaze~ hm ich steig da irgendwie nicht durch, ist mir glaub' ich zu hoch geschrieben. Der Algorithmus den ich ganz am Anfang hatte funktioniert bei mir gerade am besten, also er gibt die längsten Pfade zurück, aber er gibt mir immer zwei, einen auf der linken Seite der Linie und einen auf der rechten Seite.

    Dann entschuldige ich mich dafür, dass mein Verhalten eventuell unverschämt herüber kam und danke für das Feedback.

    mfG Frank

    EDIT: Hatte glaube ich auch paar deiner Beiträge geliket.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „xd-franky-5“ ()

    Vergrößern: vom Mittelpunkt aus die Entfernung vergrößern
    Den Flächeninhalt herauszufinden sollte wirklich nicht sehr rechenaufwenig sein. Ich hab grad 5 min gegoogel und es scheint Möglichkeiten zu geben, die (fast) linear in der Zeit zunehmen die sie zur Berechnung brauchen. Ich würd das Polygon einfach in Dreiecke einteilen und mit denen rechnen. Rotieren würde ich auch um den Mittelpunkt. Und du musst die Größe nur einmal berechnen, danach reicht eine Berechnung des Größenunterschieds. Und selbst die erste Größenberchenung fällt weg, wenn du es richtig implementierst.

    Warum man Dreiecke benutzen sollte und weshalb man um den Mittelpunkt rotieren sollte kannst du mit etwas Nachdenken selber herausfinden. Wenn net im Kopf kannst du dir ja auch zwei Schablonen ausschneiden (hilft mir zumindest immer mal wieder).

    Soviel steht fest: ich hab nicht die Zeit u es ist auch nicht meine Aufgabe das Ganze zu implementieren. Falls du über die Schwächen des Algos diskutieren willst, bin ich dafür gerne bereit, nur dafür musst du ihn erstmal verstehen....

    Lg Mokki
    ​Smartnotr - ein intelligentes Notizprogramm
    zum Thread

    @Mokki Danke. Ich habe dich auch nicht darum gebeten irgendwas zu implementieren. Okay ich gebe mein Bestes ihn zu verstehen :)

    @~blaze~ Danke, wenn du doch noch mal Interesse hast zu helfen, kannst du dich ja melden.

    @Nils_Kr ich könnte beides machen, was eben am geschicktesten wäre.

    mfG Frank