Pruefen, ob Polygon einen Punkt enthaelt
-
Die contains Methode der Klasse java.awt.Polygon gibt an, ob der angegebene Punkt im Polygon liegt.
Dabei liegt ein Punkt nicht im Polygon, wenn er ausserhalb, oder direkt auf der Grenze des Polygons liegt.
Ich moechte aber, dass mir die Methode auch true liefert, wenn der Punkt nun direkt auf der Grenze liegt, also quasi <= und nicht nur < .Any help?
thx in advance!
-
Wir machen hier keine Hausaufgaben!
-
Hmm, hast du mal versucht intersects dafür zu missbrauchen? Ansonsten wird dir wohl nur übrig bleiben selber was zu stricken.
-
Wie wärs mit überschreiben der methode contains ???
-
sven1978 schrieb:
Wie wärs mit überschreiben der methode contains ???
Klar - dann gib mir bitte den Body, denn komplett neuschreiben ist ja ueberfluessig.
-
Du brauchst doch den Source von Poligon nicht.
Ich will dich ja nicht angreifen aber vielleicht solltest du mal in deinem Buch das Kapitel über Vererbung und Objectorientierte Programmierung durchlesen.
Habe die unten ein Beispiel wie du es machen könntest. Du ersetzt dann einfach alle Typen von Polygon in deinem Prog mit deinem abgeleitetem Typ.
Die methode contains überschreibst du dann. Als erstes rufst du in der überschriebenen contain die orginale mit super.contains auf. Ist der rückgabe wert true passt es ja und du kannst aus der Methode raus. Ist es false testet du im else zweig ob der Punkt an der Grenze liegt. Wie du das machst must du dir jetzt halt noch überlegen.class MyPlogon extends java.awt.Polygon { //Hier evt. Konstr. übverschreiben public boolean contains(int x,int y) { boolean result = super.contains(x,y); if ( result ) return result; else { //Hier neue berechnung von dir } return result; } }
-
@sven1978:
Danke, aber mit diesem Beitrag hast du mir absolut nicht weitergeholfen.
Glaub mir, ich weiss, wie OOP funktioniert.
Natuerlich ist die Methode contains in einer Subclass zu ueberschreiben,
aber es ist nicht besonders geschickt dort super.contains aufzurufen.
Ich vermute einfach mal, das in dem Algo, der prueft ob der Punkt im Polygon liegt irgendwo eine Zeile, wie etwa//... if((x > this.minX && x < this.maxX) && (y > this.miny && x < this.maxY)) return true;
liegt.
Wuerde ich jetzt in einer ueberschriebenen Methode die Methode super.contains aufrufen, dann haette das zwei Nachteile. Erstens: wenn obige Methode aufgerufen wuerde und dann false lieferte, dann wuerde ich in meinem, wie du es nennst "else Teil" noch einmal genau die selben Berechnungen, wie super.contains ausfuehren, mit dem einzigen Unterschied, dass obiges statement statt > und < halt >= und <= enthalten wuerde -->Performance.
Zweitens ist es ungeschickt, weil ich mit einem eingenen Algorithmus das Rad quasi neu erfinden muesste nur weil ich <= anstatt < haben will.
Viel zu viel Aufwand, wenn es doch so viel einfacher ginge -->Aufwand.Was ich brauche ist also die Implementation von Polygon.contains() - dort wuerde ich einfach nur aus < <= machen und aus > >= und schon waere ich fertig.
Nix mit ueberschreiben und neu stricken.
-
Die Standard-Implementation sieht wie folgt aus.
/** * Determines if the specified coordinates are inside this * <code>Polygon</code>. For the definition of * <i>insideness</i>, see the class comments of {@link Shape}. * @param x the specified x coordinate * @param y the specified y coordinate * @return <code>true</code> if the <code>Polygon</code> contains the * specified coordinates; <code>false</code> otherwise. */ public boolean contains(double x, double y) { if (npoints <= 2 || !getBoundingBox().contains(x, y)) { return false; } int hits = 0; int lastx = xpoints[npoints - 1]; int lasty = ypoints[npoints - 1]; int curx, cury; // Walk the edges of the polygon for (int i = 0; i < npoints; lastx = curx, lasty = cury, i++) { curx = xpoints[i]; cury = ypoints[i]; if (cury == lasty) { continue; } int leftx; if (curx < lastx) { if (x >= lastx) { continue; } leftx = curx; } else { if (x >= curx) { continue; } leftx = lastx; } double test1, test2; if (cury < lasty) { if (y < cury || y >= lasty) { continue; } if (x < leftx) { hits++; continue; } test1 = x - curx; test2 = y - cury; } else { if (y < lasty || y >= cury) { continue; } if (x < leftx) { hits++; continue; } test1 = x - lastx; test2 = y - lasty; } if (test1 < (test2 / (lasty - cury) * (lastx - curx))) { hits++; } } return ((hits & 1) != 0); }
Wahrscheinlich wirst du eine eigene Polygon-Klasse basteln und die vom Standard-Polygon ableiten, oder?
-
Super, danke!
Wahrscheinlich wirst du eine eigene Polygon-Klasse basteln und die vom Standard-Polygon ableiten, oder?
Ja, das hatte ich vor. Ich werde mir den Algo mal genauer ansehn und dann < durch <= und > durch >= ersetzen.
Kannst du mir noch sagen, wo du den Code her hast?Weiss jemand noch zufaellig, wie der Algo heisst, der da verarbytet ist(link waere auch nicht schlecht)?
-
Raptor schrieb:
Weiss jemand noch zufaellig, wie der Algo heisst, der da verarbytet ist(link waere auch nicht schlecht)?
Ob der von oben dabei ist weiß ich nicht, aber hier sind ein paar aufgelistet.