Reflektion an einem Dreieck und bei einem Kreis???
-
Hallo
mein Problem ist folgendermassen,
Ich arbeite mit dem Borland, wo ich mit einem Image so eine art Pong ausprogrammieren möchte.Der Ball soll an einem Körper reflektieren bei einem Rechteck ist des ja einfach,
doch wie Prüfe ein Dreieck ( Dreieck mit LineTo und MoveTo gezeichnet), des problem ist ja ich kann ja nicht if(ball_x1==x2) machen wegen der schräge vom Dreieck.Genau so möchte ich gerne mit einem Kreis (Ellpise) eine Reflektion prüfen.
Hat da einer von euch eine Idee wie ich das mit dem Dreieck und mit dem Kreis hin bekomme ?
-
Um die Kollision mit einer Geraden zu prüfen, stellst Du diese in der Hesseschen Normalform dar; also
mit
Ist die Ball-Position und sein Radius, so ist die Kollision aufgetreten, wenn
Bei der Ellipse wird es etwas schwieriger. Seien und die beiden Brennpunkte der Ellipse, so liegt ein Punkt innerhalb, wenn die Summe der beiden Abstände des Punktes zu den Brennpunkten kleiner als die große Halbachse der Ellipse ist.
Wie man den Ball-Radius berücksichtigt, fällt mir jetzt gerade nicht ein.Gruß
WernerPS.: die Ausrichtung der Latex-png's innerhalb einer Zeile passt nicht. Sollte mittig sein, nicht bündig an der Oberkante
-
Vielen dank schon mal für deine Hilfe
nur das problem ist ich bin nur nicht mit der höheren mathematik vertraut ^^
aber ich versteht schon mal die Hesseschen Normalform etwas, nur noch eine frage weisste wie man diese Formel mit den Brennwert nennt damit ich in google oder wiki des mir anschaun kann.
Aber danke nochmal für deine Hilfe
-
ER4SER schrieb:
.. ich bin nur nicht mit der höheren mathematik vertraut
'Hessesche Normalform' und Ellipse (Kegelschnitte) ist Oberstufe Gymnasium
ER4SER schrieb:
.. nur noch eine frage weisste wie man diese Formel mit den Brennwert nennt damit
Habe ich Brennwert geschrieben? Das sind die Brennpunkte. Ist doch bei Wiki alles schön erklärt. Kapitel "Ellipse als Punktmenge" erster Satz; Definition der Ellipse.
Gruß
Werner
-
Könnest du mir des auch evtl als Quelltext schreiben, weil ich komme einfach nicht mehr weiter so,das ist mein Dreieck.
Image1->Canvas->Brush->Color= RGB(0,255,0); Image1->Canvas->Pen->Color=RGB (0,255,0); Image1->Canvas->MoveTo(0,425); Image1->Canvas->LineTo(100,525); Image1->Canvas->LineTo(0,525); Image1->Canvas->LineTo(0,425); Image1->Canvas->FloodFill(10,475, RGB (0,255,0), fsBorder);
und der Ball hat die werte x1,y1,x2,y2.
Schau dir des mal an, es ist nur eine Schräge des wäre mir schon viel wert wenn des als if-Anweisung klappen würde, einfach wenn der Ball an die Schräge ankommt.Danke nochmal
Gruß Timo
PS: ist nur Scheisse das ich nur Realschulabschluss hab
-
Hallo Timo,
Um das alles zu handeln würde ich Dir mindestens empfehlen eine Klasse für einen mathematischen Vektor zu nutzen. Du findest so was zum Beispiel in einem alten Beitrag von mir. Dort heißt er 'basic_vector<>' bzw. einfach 'Vector' für double's.
Die Schräge geht von (0,425) nach (100,525); also steht ein Vektor (1,-1) darauf senkrecht. In Code:
Vector n( 1, -1 ); // steht senkrecht auf der Schräge; zeigt nach außen n /= abs( n ); // teile durch seinen Betrag, dann ist 'n' ein Einheitsvektor double d = n * Vector( 0, 425 ); // (0, 425) ist ein Punkt der Schräge // mit 'n' und 'd' ist die Schräge jetzt festgelegt // -- Kollisions-Prüfung Vector posBall( x1, y1 ); // aktuelle Ball-Position double R = ...; // Ballradius (darf auch 0 sein) if( n * posBall <= d + R ) { // Ball hat die Schräge berührt oder ist bereits dahinter
Du siehst, dass die Verwendung von so einer Vector-Klasse den großen Vorteil hat, dass man die Formeln in Code fast direkt hinschreiben kann.
Jetzt bleibt noch, die neue reflektierte Bewegungsrichtung des Balls zu bestimmen. Weißt Du wie das geht?
ER4SER schrieb:
ist nur Scheisse das ich nur Realschulabschluss hab
Immerhin hast Du den; sei stolz drauf
Gruß
Werner
-
Hallo Werner
Sorry aber ich habe schon das Problem gelöst,
und zwar mit der einfachen, berühmten Formely=mx+b
und so sieht des aus//schräge z1=1*x1+400; //x1,y1,x2,y2 ist der ball z2=1*x2+400; //z1 und z2 sind meine maxima grenzen if ( ( y2 >= z1 ) && ( x1 >=0 ) && ( y2 >= z2 ) ) { schritt_unten=-10; punkte+=100; }
und des läuft wunderbar so, aber der Programmier stil von dir ist auch mal sehr interessant.
Diese Aufgabe was ich machen muss it ein Schulprojekt ^^, da wir C++ als Unterrichtsfach haben und des hab ich nun seid 1,5 Jahre und wir sind gerade erst mal bei Vererbung xD und so bisschen Anwendungsumgebung, da wir einen Lehrer haben der nicht von seinem Fach versteht z.b. die Methode OnKeyPress ^^Stolz über mein Realabschluss bin ich, wenn man davon absieht das ich mal Hauptschüler war ^^
Wenn das nun noch mit dem Kreis reflektiert dann hab ich meine 1 Sicher ^^
Aber danke nochmals für deine Bemühungen
Gruß Timo