Überschneidung

butterfly84

Mitglied
Hallo,

es soll überprüft werden, ob sich Segmente schneiden. Für den Fall, dass das Segment senkrecht ist klappts auch, aber nicht wenn das Segment waagerecht ist. Habt ihr vielleicht eine Idee warum das so ist? Hier ist der Code:

Java:
 public boolean schneidetSegment(Segment s) {
   if (istSenkrecht())  
      // Segment this ist senkrecht.
      return(((s.p1.x < p1.x && s.p2.x > p1.x) || 
              (s.p1.x > p1.x && s.p2.x < p1.x)) &&
             ((p1.y < s.p1.y && p2.y > s.p1.y) || 
              (p1.y > s.p1.y && p2.y < s.p1.y)));
   
    else // Segment this ist waagerecht,
         // im Aufruf von schneidetSegment werden
	 // daher this und s vertauscht.
       // return(s.schneidetSegment(this));};
    	return
    	(((p1.x < s.p1.x && p1.x > s.p2.x) || 
                ( p1.x > s.p1.x && p1.x < s.p2.x)) &&
               (( s.p1.y < p1.y && s.p1.y > p2.y) || 
                ( s.p1.y > p1.y && s.p1.y < p2.y)));};
 
S

SlaterB

Gast
du rechnest in beiden Fällen dasselbe aus,
schau dir die jeweiligen Abfragen für x und y einzeln an, sie sind symmetrisch,
z.B. eigenr p1-x-Wert zwischen s-x-Werte oder andersrum, wenn du da die Variablen umtauschst, dann ergibt das keinen Unterschied

hoch interessant ist allerdings, dass nirgendwo das eigene p2.x oder das andere s.p2.y verwendet wird,
kann es richtig sein, diese Werte komplett zu ignorieren?

sinnvoll wäre in jedem Fall, ein komplettes Programm mit Beispiel-Segmenten zu posten

edit:
oder logge/ debugge selber, schaue dir zwei Segmente auf Papier an, überlege welcher Werte-Vergleich entscheidend sein sollte,
dann suche die entsprechende Code-Stelle, logge welche Werte dort konkret zu welchem Ergebnis vergleichen werden,
korrigiere gegebenenfalls den Code usw.
 
Zuletzt bearbeitet von einem Moderator:

butterfly84

Mitglied
Danke für die Antwort, eigentlich sollte ja nach dem else dieses stehen

Java:
return(s.schneidetSegment(this));

aber dann bekomme ich einen Stackoverflow deshalb habe ich versucht irgendwie this und Segment s auszutauschen aber stimmt, ist das gleiche, wie du es sagst. Ich poste nochmal die ganze Klasse:

Java:
import java.util.ArrayList;


// Segment
//
// Segmente sind durch die Punkte p1 und p2 gegeben.
//


class Segment {
 public static Segment segment;

 // Klassenvariablen
 Punkt p1, p2;
 ArrayList<Punkt> polyline; // Polyline
 // Konstruktor
 Segment (Punkt p1, Punkt p2) {
  this.p1 = p1;
  this.p2 = p2;
 }
 
	 
 
//Segment (Punkt.)





// String
 public String toString() {
   return "("+p1+","+p2+")";
 }

 // Gibt an, ob Segment this senkrecht ist.
 public boolean istSenkrecht() {
   return(p1.x == p2.x);};
   

   


 public boolean schneidetSegment(Segment s) {
   if (istSenkrecht()) {
	  
      // Segment this ist senkrecht.
      return(((s.p1.x < p1.x && s.p2.x > p1.x) || 
              (s.p1.x > p1.x && s.p2.x < p1.x)) &&
             ((p1.y < s.p1.y && p2.y > s.p1.y) || 
              (p1.y > s.p1.y && p2.y < s.p1.y)));
   }
    else // Segment this ist waagerecht,
         // im Aufruf von schneidetSegment werden
	 // daher this und s vertauscht.
   
        return(s.schneidetSegment(this));};

  
 // Prueft, ob sich ein Segment mit einem
 // Rechteck (this und r) schneidet.
 public boolean schneidetRechteck(Rechteck r) {
	// System.out.println(this + " schneidet " + r);
   if (istSenkrecht())
      // Segment this ist senkrecht,
      // kann sich also nur mit den waagerechten
      // Segmenten oben und unten von Rechteck r
      // schneiden.
      return(schneidetSegment(r.oben) ||
             schneidetSegment(r.unten));
    else // Segment this ist waagerecht, 
         // kann sich also nur mit den senkrechten
         // Segmenten links und rechts von Rechteck r
         // schneiden.
         return(schneidetSegment(r.links) ||
                schneidetSegment(r.rechts));};

} // class Segement
 
S

SlaterB

Gast
tja, also ich möchte das jetzt nicht fertig programmieren, falls du darauf wartest ;)

ich weiß ja noch nichtmal die Definition eines Schnitts zweier Segmente, und was ist überhaupt ein Segment, ein Rechteck oder eine Linie?
wie unterscheidet sich waagerecht von senkrecht,
eine main-Methode mit definierten Beispielen wäre auch hilfreich
 

butterfly84

Mitglied
nein natürlich warte ich nicht auf so was :) eigentlich steht im Code, was ein Segment ist. Ein Segment verbindet zwei Punkte, ist also eine Linie und ein Rechteck besteht ja auch nur aus Segmenten es wird nur unterschieden ob senkrecht oder waagerecht. Wenn die x-Koordinaten von den beiden Punkten gleich sind ist das Segment senkrecht ansonsten waagerecht (steht auch im Code Zeile 37 u. 38). Ich verstehe nur nicht wieso es zu einem Stackoverflow kommt.

Hier nochmal der Fehler:

Exception in thread "main" java.lang.StackOverflowError

at Segment.istSenkrecht(Segment.java:38)
at Segment.schneidetSegment(Segment.java:45)
at Segment.schneidetSegment(Segment.java:57)
 
S

SlaterB

Gast
wenn zwei senkrechte bzw. eben nicht senkrechte Segmente verglichen werden,
dann immer wieder rekursiv das andere Element gefragt, nach paar tausend mal hin und her gehts schief
 
S

SlaterB

Gast
hast du meine Aussage verstanden?
zwei Segmente A und B werden verglichen, A ist nicht senkrecht, ruft B auf, B ist nicht senkrecht, ruft A auf, A wieder B und B wieder A usw. bis in alle Ewigkeit bzw. bis zur Exception wenige ms später
 
S

SlaterB

Gast
ja, aufhören das so zu machen wie du es im Moment machst, das war die Erkenntnis, die ich erzielen wollte,
keine Alternativlösung ;)

wenn A nicht senkrecht, aber B schon und andersrum, dann kannst du gerne in einem der Fälle die beiden vertauschen um das einheitlicher zu behandeln,
aber wenn beide gleichzeitig nicht senkrecht sind, dann hilft es nicht, die Schuld bzw. Arbeit vor sich her zu schieben, sondern dann müssen x und y verglichen werden usw.,
ran an den Speck, ich löse das nicht für dich ;)
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben