Punkt in Polygon bestimmen
Ich habe meinen Code mal neu hochgeladen. Kann mir Jemand mal erklären wie das mit der Ignore-Variante in der Quelle,
http://rw7.de/ralf/inffaq/polygon.html
gemeint ist ? Speziell folgender Satz:
http://rw7.de/ralf/inffaq/polygon.html
gemeint ist ? Speziell folgender Satz:
Die Idee ist, anders zu zählen. Nicht die Anzahl der Schnittpunkte der Kanten mit dem Strahl ist interessant, sondern es wird gezählt, wie oft der Polygonzug die Seite des Strahls wechselt.
Du musst schon genau schreiben, was Dir nicht gefällt. Abgesehen davon ist dies nur ein Modul welches wo anders benutzt werden soll, dann wird daraus auch OOP.hendrikS hat geschrieben:Dein Code macht aber immer noch den Eindruck als hättest Du das Prinzip von OOP nicht wirklich verstanden. Auch die __ ändern da nichts. Hat auch so kleines bisschen Javasmell.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Das sind alles zusammengewürfelte Funktionen mit hässlichen, nicht PEP8-konformen Namen die aus keinem sinnvollen Grund in einer Klasse sind. So eine Struktur zum aufsammeln von Funktionen gibt es in Python auch, nennt sich Modul.
Auch der restliche Code mit der rumindexerei sieht auch nicht sonderlich klar aus. Ein erster Blick auf den Code sagt "Hä?" und das ist genau das was nicht passieren sollte.
Auch der restliche Code mit der rumindexerei sieht auch nicht sonderlich klar aus. Ein erster Blick auf den Code sagt "Hä?" und das ist genau das was nicht passieren sollte.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Das stimmt so nicht. Der Klassenname ist aussagekräftig und fängt mit einem großen Buchstaben an alles andere fängt mit einem kleinen Buchstaben an. Die Namen habe ich aus dem Algorithmus hergeleitet(Siehe Link) und sind auch aussagekräftig gewählt. Gearbeitet wird mit Übergabe von Argumenten und Rückgabewerten, was ja die Kapselung, die OOP mitunter ausmacht unterstreicht.Leonidas hat geschrieben:Das sind alles zusammengewürfelte Funktionen mit hässlichen, nicht PEP8-konformen Namen die aus keinem sinnvollen Grund in einer Klasse sind. So eine Struktur zum aufsammeln von Funktionen gibt es in Python auch, nennt sich Modul.
Die Indexerei ist unschön, aber leider fällt mir da zur Zeit nix besseres ein. Ich habe mal auf Kosten der Performance den Code lesbarer gemacht.Leonidas hat geschrieben:Auch der restliche Code mit der rumindexerei sieht auch nicht sonderlich klar aus. Ein erster Blick auf den Code sagt "Hä?" und das ist genau das was nicht passieren sollte.
-
- User
- Beiträge: 996
- Registriert: Mittwoch 9. Januar 2008, 13:48
Wozu ist das in einer Klasse? Hast du denn das Klassenmodell verstanden?
- Defnull
- User
- Beiträge: 778
- Registriert: Donnerstag 18. Juni 2009, 22:09
- Wohnort: Göttingen
- Kontaktdaten:
1) Deine Klasse hat keine Klassenvariablen, also keinen Zustand. Es würde keinen Sinn machen, sie zu instanziieren.
2) Deine Klasse hat keine öffentlichen Methoden. Man kann sie also von außen auch nicht benutzen.
3) Die Klasse hat einen Side-Effekt (print) der aus dem Klassennamen und der Dokumentation nicht ersichtlich ist.
4) "The Return type of this object is bool or an exception." ... Klassen haben keinen "Return type". Außerdem ist __nonzero__(self) ist nicht definiert, die Dokumentation lügt also.
Was du versuchst, ist das aufsplitten eines Problems in mehrere kleine Teilprobleme. Das ist auch gut und schön so, hat aber nichts mit Klassen oder OOP zu tun.
Warum nutzt du keine Funktion mit geschachtelten Hilfsfunktionen? Dann ist der ganze Hilfs-Kram so "privat" wie er nur sein kann und das alles ergibt deutlich mehr Sinn.
2) Deine Klasse hat keine öffentlichen Methoden. Man kann sie also von außen auch nicht benutzen.
3) Die Klasse hat einen Side-Effekt (print) der aus dem Klassennamen und der Dokumentation nicht ersichtlich ist.
4) "The Return type of this object is bool or an exception." ... Klassen haben keinen "Return type". Außerdem ist __nonzero__(self) ist nicht definiert, die Dokumentation lügt also.
Was du versuchst, ist das aufsplitten eines Problems in mehrere kleine Teilprobleme. Das ist auch gut und schön so, hat aber nichts mit Klassen oder OOP zu tun.
Warum nutzt du keine Funktion mit geschachtelten Hilfsfunktionen? Dann ist der ganze Hilfs-Kram so "privat" wie er nur sein kann und das alles ergibt deutlich mehr Sinn.
Code: Alles auswählen
def is_point_in_polygon(point, polygon):
def helper_fast(...):
...
def helper_slow(...):
...
return helper_fast(...) and helper_slow(...)
def test_polygon():
point1 = np.array([[4], [4]])
poly1 = np. array([[3, 5, 5, 3, 3], [3, 3, 5, 5, 3]])
...
print "Is the point ... within polygon ... ?"
if is_point_in_polygon(point1, poly1):
print "Yes"
else:
print "No"
Zuletzt geändert von Defnull am Freitag 10. Juli 2009, 10:30, insgesamt 2-mal geändert.
Bottle: Micro Web Framework + Development Blog
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Der Klassenname ist Blödsinn: erklär mir mal was eine Instanz von "Pointtests" darstellen soll? Es hat keinen *semantischen* Wert (davon abgesehen würde man Klassen im Singular benennen, denn Klassen gibt es eine, aber mehrere Objekte einer Klasse. PEP8 sagt auch, dass man da für Namen CamelCase verwendet). Alles andere fängt mit Kleinbuchstaben an, aber ist camelCase, wo PEP8 doch gerade names_with_underscores sagt. Außerdem ist eine Klasse dazu da Zustand zu kapseln (so dass man eben nicht ständig den Polygon mitgeben muss) - du kapselst dort keinen interessanten Zustand sondern hast halt einfach eine Reihe von Funktionen, die komisch benannt sind und sinnloserweise in einer unnötigen Klasse stecken.feldmann_markus hat geschrieben:Das stimmt so nicht. Der Klassenname ist aussagekräftig und fängt mit einem großen Buchstaben an alles andere fängt mit einem kleinen Buchstaben an. Die Namen habe ich aus dem Algorithmus hergeleitet(Siehe Link) und sind auch aussagekräftig gewählt. Gearbeitet wird mit Übergabe von Argumenten und Rückgabewerten, was ja die Kapselung, die OOP mitunter ausmacht unterstreicht.
Kapselung von Daten und Methoden macht OOP aus, nicht die zwanghafte Verwendung von Klassen. Argumente und Rückgabewerte sind eher für die funktionale Programmierung typisch, aber auch da verwendet man keine unnötigen Klassen um Funktionalität zu Kapseln sondern auch eher Module.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Also wäre an dieser Stelle ein Modul ohne Klasse mit nur Funktionen ausreichend ?
Was ist an den Namen <_checkPointIsOnLine()> und <_checkbounds()> nicht verständlich ?
check sagt aus, dass hier was geprüft werden soll und was geprüft werden soll kommt danach, also ob der Punkt auf der Line ist und ob der Punkt innerhalb der x/y-Grenzen ist. Wie hättest Du das denn sonst formuliert ?
Was ist an den Namen <_checkPointIsOnLine()> und <_checkbounds()> nicht verständlich ?
check sagt aus, dass hier was geprüft werden soll und was geprüft werden soll kommt danach, also ob der Punkt auf der Line ist und ob der Punkt innerhalb der x/y-Grenzen ist. Wie hättest Du das denn sonst formuliert ?
-
- User
- Beiträge: 996
- Registriert: Mittwoch 9. Januar 2008, 13:48
`point_is_on_line` oder `is_on_line` und `is_in_polygon` oder `in_polygon`.feldmann_markus hat geschrieben:Wie hättest Du das denn sonst formuliert
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Ja. Eine Klasse soll ein *Objekt* beschreiben, man sollte es nicht als schlichten Namensraum missbrauchen.feldmann_markus hat geschrieben:Also wäre an dieser Stelle ein Modul ohne Klasse mit nur Funktionen ausreichend ?
Es wurde nie gesagt, dass sie unverstaendlich sind, sondern dass sie nicht PEP8 konform sind. Demnach sollten sie ``check_point_is_on_line`` (oder noch besser: ``is_on_line(point)``) und ``check_bounds()`` heissen.feldmann_markus hat geschrieben:Was ist an den Namen <_checkPointIsOnLine()> und <_checkbounds()> nicht verständlich ?
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Ja, wenn man keine Funktionalität von Klassen nutzt, dann ist das ein gutes Indiz dafür, dass man keine Klassen braucht um das Problem zu lösen.feldmann_markus hat geschrieben:Also wäre an dieser Stelle ein Modul ohne Klasse mit nur Funktionen ausreichend ?
``point_is_on_line`` etwa...feldmann_markus hat geschrieben:Wie hättest Du das denn sonst formuliert ?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice