Brauche dringend Hilfe !!!!
-
Danke erstmal für deine Antwort, hätte nicht gedacht, das jemand so schnell antworten würde.
Also irgendwie überlege ich das Poblem so zu lösen, aber ich komme leider nicht weiter.
Hab an der Formel von Geraden gedacht,also da gilt ja, dass
wenn man z.B. vier Koordinaten (x1,y1),(x2,y2),(x3,y3),(x4,y4)und (y2-y1)/(x2-x1)=(y4-y3)/(x4-x3) dann ist die gerade die aus den Punkten (x1,y1) und (x2,y2) besteht parallel zu der gerade die aus den Punkten (x3,y3) und (x4,y4) besteht .
und dass wenn (y2-y1)/(x2-x1)*(y4-y3)/(x4-x3)=-1 dann ist die gerade die aus den Punkten (x1,y1) und (x2,y2) besteht senkrecht zu der gerade die aus den Punkten (x3,y3) und (x4,y4) besteht .
Dann dachte ich dass ein Rechteck aus vier Parallelen Geraden und aus vier senkrechten Geraden besteht.
Also schrieb ich folgenden Code:
void Rechteck(void){
float L1,L2,L3,L4,L5,L6;
L1=(y2-y1)/(x2-x1);//Alle Möglichkeiten für diese vier Koordinaten
L2=(y3-y1)/(x3-x1);
L3=(y4-y1)/(x4-x1);
L4=(y3-y2)/(x3-x2);
L5=(y4-y2)/(x4-x2);
L6=(y4-y3)/(x4-x3);if(L1==L2){ /*Hier will ich sagen dass, wenn L1=L2 dann heisst das, dass die gerade mit den Punkten (x1,y1) und (x2,y2) parallel zu der geraden mit den Punkten (x3,y3)und (x4,y4)
}
Also brauche ich insgesamt zwei parallele Geraden und zwei senkrechte GeradeJa und hier komme ich irgendwie nicht weiter, weiss nicht wie ich den Code weiterschreiben soll.
Helft mir Bitte!!!
Danke für jede Hilfe!!
-
Ich hoffe du hast gut geschlafen und weist jetzt wieviel Geraden ein
Rechteck bilden und wieviel Schnittpunkte du dann hast.Lösungsmöglichkeiten gibt mehrere.
Beschäftige z.B. mal mit Array's.
eindimmensionale haste ja in deinem ersten Beispiel, es gibt auch mehrdimmensionale.MfG f.-th.
-
Ja aber mit Mehrdimensionale Arrays komme ich leider nciht gut klar.
-
Du hast 6 mögliche Verbindungsgeraden, die du betrachten kannst, aber von denen können nur 4 (und auch die nicht beliebig) zu einem Rechteck zusammengestellt werden. Und die Geraden L1 und L2 können in einem Rechteck nicht parallel zueinander sein ;).
Effektiv kannst du drei mögliche Fälle unterscheiden (Lij bezeichnet die Gerade zwischen i und j):
- L12 senkrecht auf L23 - das Rechteck besteht aus 1-2-3-4-1
- L12 senkrecht auf L24 - das Rechteck besteht aus 1-2-4-3-1
- keins von beidem - die Punkte bilden kein Rechteck
In den Fällen 1 und 2 mußt du noch sicherstellen, daß alle anderen benachbarten Geraden auch senkrecht stehen.
-
Noch was, verstehe nicht was du meinst mit den geraden.
Ich weiss dass ein Rechteck durch vier Geraden gebildet wird, aber wenn zwei Geraden parallel sind und noch zwei andere Geraden senkrecht zu den vorrigen parallelen sind, dann bilden die auch ein Rechteck. Natürlich sind die auch miteinander parallel, aber wieso soll ich etwas komplizierter machen???
Also brauche ich nur zwei parallele (Geraden) und zwei (Geraden) die senkrecht zu den parallelen sind!!!!!
-
was machste, wenn sich aus den 8 punkten auf einmal 6 rechtecke bilden lassen?
-
Dank dir erst für deine Antwort!!
Verstehe irgendwie nicht wieso die Geraden L1 und L2 nicht parallel zueinander sein können?
Und was ist wenn, wie volkard schon sagte von paar Koordinaten sich mehr als ein Rechteck bilden lassen kann???
-
Bonafide schrieb:
Verstehe irgendwie nicht wieso die Geraden L1 und L2 nicht parallel zueinander sein können?
L1 und L2 gehen beide durch den Punkt (x1/y1) - wenn die tatsächlich parallel sind, hast du bestimmt kein Rechteck (höchstens ein entartetes mit einer Höhe von 0).
Und was ist wenn, wie volkard schon sagte von paar Koordinaten sich mehr als ein Rechteck bilden lassen kann???
Aus vier Punkten kannst du maximal 1 Rechteck zusammenbauen. Und wenn du mehr Punkte hast, mußt du nacheinander alle Teilmengen davon untersuchen.
Alternativ: du probierst nacheinander alle Geraden durch und suchst jeweils eine Folge von Geraden, die (a) senkrecht aufeinander stehen und (b) bei denen der Anfangspunkt einer Geraden gleich dem Endpunkt der jeweils nächsten ist. (Anmerkung: die Bedingung, daß die Geraden parallel sind, ergibt sich daraus von alleine)
-
Verstehe, das hat mich schon weitergebracht, thanks!
Hätte noch ne Frage:
Was muss ich schreiben, damit der pc sich merken kann, dass z.B. zwei Geraden senkrecht zueinander sind, also wenn ich schreibe:
if(L1*L1==-1)//Bedinung wenn die gerade L1 senkrecht zu der gerade L2 ist
{ //Was kann ich hier schreiben, das ich später bei einer anderer if-Bedinung
//benutzen kann
}
else {//nichts machen
}
-
Du kannst die Auswertungen der drei Fälle direkt in die jeweiligen if()-Blöcke unterbringen:
if(L1*L2 == -1) { // Fall 2 return L2*L6==-1 && L6*L5==-1 && L5*L1==-1; } else if(L1*L3 == -1) { // Fall 1 return L3*L6==-1 && L6*L4==-1 && L4*L1==-1; } else return false;P1 -L1- P2 | L2 | L3 \/ L4 | L5 | P4 -L6- P3
-
Verstehe nicht wieso du
return L2*L6==-1 && L6*L5==-1 && L5L1==-1;
schreibst, meine wenn L1L2=-1, also Gerdae L1 mit Gerade L2 senkrecht sind, dann muss es nicht gleich heissen dass die Gerade L2 mit der Gerade L6 auch senkrecht ist. Die Gerade L1 kann sich ja auch bei z.B. 30° mit der Gerade L6 schneiden. Ich sollte das eigentlich checken ob das stimmt, oder nicht????
-
Bonafide schrieb:
Verstehe nicht wieso du
return L2*L6==-1 && L6*L5==-1 && L5L1==-1;
schreibst, meine wenn L1L2=-1, also Gerdae L1 mit Gerade L2 senkrecht sind, dann muss es nicht gleich heissen dass die Gerade L2 mit der Gerade L6 auch senkrecht ist. Die Gerade L1 kann sich ja auch bei z.B. 30° mit der Gerade L6 schneiden. Ich sollte das eigentlich checken ob das stimmt, oder nicht????Ist es denn noch ein Rechteck, wenn die benachbarten Geraden einen Winkel von 30° einschließen? In diesem if-Block weiß ich, daß L1 und L2 senkrecht stehen, also besteht ein potentielles Rechteck aus L1,L2,L6,L5 (in dieser Reihenfolge nebeneinander) und ich muß nur doch überprüfen, ob an den übrigen drei Ecken auch ein rechter Winkel ist (wenn nicht, war's wohl doch kein Rechteck).
-
CStoll schrieb:
...und ich muß nur doch überprüfen, ob an den übrigen drei Ecken auch ein rechter Winkel ist (wenn nicht, war's wohl doch kein Rechteck).
Ahh du meinst ich soll erst
if(L1*L2 == -1) { // Fall 2 return L2*L6==-1 && L6*L5==-1 && L5*L1==-1; } else if(L1*L3 == -1) { // Fall 1 return L3*L6==-1 && L6*L4==-1 && L4*L1==-1; } else return false;schreiben und dann mit einer weiteren if-Anweisung weitermachen, wie:
if(L2*L6==-1 && L6*L5==-1 && L5*L1==-1){ printf("Die Geraden L1,L2,L5 und L6 bilden ein Rechteck"); } else if(return L3*L6==-1 && L6*L4==-1 && L4*L1==-1){ printf("Die Geraden L1,L3,L4 und L6 bilden ein Rechteck"); } else{ printf("Von den Geraden L1,L2,L3,L4,L5 und L6 können kein Rechteck bilden"); }Ist es so richtig, oder geht es garnicht???

-
Nein, der Ausdruck
L2*L6==-1 && L6*L5==-1 && L5*L1==-1überprüft die übrigen drei Ecken des Vierecks. Das heißt, die gesamte if-else-Kaskade liefert genau dann true zurück, wenn deine vier Punkte ein Rechteck bilden - das kannst du nun (zusammen mit der Bestimmung der Li's) in eine Funktion packen und nutzen. (wenn du Fall 1 und 2 noch unterschiedlich behandeln willst, sollte diese Sonderbehandlung in den jeweiligen if-Blöcken passieren)
-
Die Bedingungen die Du dort nochmal in ifs gepackt hast steht doch schon lange dort. In "Fall 2" z.B. wird true zurückgegeben wenn ein Rechteck gebildet wird, sonst false.
-
DANKE EUCH!!!!!
-
Sorry, dass ich euch weiterhin störe aber...
Also hab das alles gemacht, was du meintest, aber irgendwie schliesst sich immer das fenster nach return, was kann ich machen, damit es sich nicht schliesst???
-
Hallo
Du könntest mal in die Konsolen FAQ schauen und dort beim Thema schließen verhinder vorbeischauen.
chrische
-
Und wo finde ich die???
-
Wir haben hier mehrere Foren, unter anderem "DOS und Win32-Konsole". Direkt neben dem Namen des Forums steht "FAQ/Archiv". Klick mal drauf.