Area.isRectangular()

Status
Nicht offen für weitere Antworten.

byte

Top Contributor
Hi,

ich habe zwei Polygone, bestehend aus 4 rechtwinkligen Linien, also Rechtecke. :) Die beiden Polygone teilen sich eine Linie, sind also angrenzend.

Ich möchte nun bestimmen, ob die Vereinigung der beiden Polygone wieder rechteckig ist. Dafür erzeuge ich aus den Polygonen Areas, vereine diese und benutze die Methode isRectangular(). Leider funktioniert das ganze nicht wie gewünscht.

Hier ein Beispiel:

Java:
		Polygon p1 = new Polygon();
		p1.addPoint(0, 0);
		p1.addPoint(10, 0);
		p1.addPoint(10, 10);
		p1.addPoint(0, 10);
		
		Polygon p2 = new Polygon();
		p2.addPoint(0, 10);
		p2.addPoint(10, 10);
		p2.addPoint(10, 20);
		p2.addPoint(0, 20);
		
		Polygon p3 = new Polygon();
		p3.addPoint(10, 0);
		p3.addPoint(20, 0);
		p3.addPoint(20, 10);
		p3.addPoint(10, 10);
		
		Area a1, a2;
		
		
		System.out.println("Polygon 1, Polygon 2:");
		a1 = new Area(p1);
		a2 = new Area(p2);
		a1.add(a2);
		System.out.println("singular = " + a1.isSingular());   // true
		System.out.println("rectangular = " + a1.isRectangular());   // false
		
		System.out.println("\nPolygon 1, Polygon 3:");
		a1 = new Area(p1);
		a2 = new Area(p3);
		a1.add(a2);
		System.out.println("singular = " + a1.isSingular());   // true
		System.out.println("rectangular = " + a1.isRectangular());   // true

Polygon 1 und Polygon 3 grenzen horizontal aneinander. Da funktionierts. Polygon 1 und Polygon 2 grenzen vertikal aneinander. Da funktionierts nicht.

Habe ich einen Denkfehler oder warum funktioniert die Methode nicht wie gewünscht?

TIA byte
 

Marco13

Top Contributor
Um die Ursache rauszufinden fehlt mir im Moment die Zeit, aber wenn man beim ersten
a2.add(a1);
schreibt, gibt er "true, true" aus - das "add" ist also nicht kommutativ. Mein erster Gedanke war, dass das irgendein Seiteneffekt von der "Definition of insideness" von Shape (Java Platform SE 6) sein könnte, aber das müßte man sich genauer ansehen...
 

byte

Top Contributor
Ich habe mal testweise die "überlappende" Linie in Polygon 2 vertikal verschoben, so dass es definitiv "in" Polygon 1 liegt. Aber auch da liefert die Methode false. :noe:
 

byte

Top Contributor
Offenbar funktioniert die Methode nur dann richtig, wenn die Polygone horizontal angrenzen.

Daher habe ich folgenden Hack probiert: Falls die Methode false liefert, rotiere ich die Polygone um PI/2 und prüfe dann nochmal auf isRectangular.
Ist zwar irgendwie dämlich, aber es scheint zu funktionieren.

Java:
		Polygon p1 = new Polygon();
		p1.addPoint(0, 0);
		p1.addPoint(10, 0);
		p1.addPoint(10, 10);
		p1.addPoint(0, 10);
		
		Polygon p2 = new Polygon();
		p2.addPoint(0, 8);
		p2.addPoint(10, 8);
		p2.addPoint(10, 20);
		p2.addPoint(0, 20);
		
		Polygon p3 = new Polygon();
		p3.addPoint(10, 0);
		p3.addPoint(20, 0);
		p3.addPoint(20, 10);
		p3.addPoint(10, 10);
		
		Area a1, a2;
		
		
		System.out.println("Polygon 1, Polygon 2:");
		a1 = new Area(p1);
		a2 = new Area(p2);
		a1.add(a2);
		System.out.println("singular = " + a1.isSingular());
		System.out.println("rectangular = " + a1.isRectangular());
		
		System.out.println("\nPolygon 1, Polygon 2 (gedreht):");
		a1 = new Area(p1);
		a2 = new Area(p2);
		AffineTransform t = new AffineTransform();
		t.rotate(Math.PI/2);
		a1 = a1.createTransformedArea(t);
		a2 = a2.createTransformedArea(t);
		a1.add(a2);
		System.out.println("singular = " + a1.isSingular());
		System.out.println("rectangular = " + a1.isRectangular());
		
		
		System.out.println("\nPolygon 1, Polygon 3:");
		a1 = new Area(p1);
		a2 = new Area(p3);
		a1.add(a2);
		System.out.println("singular = " + a1.isSingular());
		System.out.println("rectangular = " + a1.isRectangular());
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Method Area, Stack, Heap Allgemeine Java-Themen 7
G editor area.eclipse rcp Allgemeine Java-Themen 19

Ähnliche Java Themen

Neue Themen


Oben