Entwickler-Ecke

Sonstiges (Delphi) - Mathe Problem - IV


Aya - Fr 03.01.03 23:59
Titel: Mathe Problem - IV
huhu :)

mal wieder ein MatheProblem...
user defined image

Ich habe die X und Y-Koordinaten beider Kreise, sowie den Winkel in dem Kreis2 auf Kreis1 zukommt... wie errechne ich nun den winkel in dem Kreis2 abprallt??? (Kreis1 steht fest)

Au'revoir,
Aya~

PS: Bitte nicht einfach nur sagen "Einfallswinkel = Ausfallswinkel" das weiß ich auch... nur ich bräuchte mal genauere formeln... zumal Kreis2 in jedem beliebigen winkel ankommen kann, und Kreis1 an jeder beliebigen stelle treffen kann..


Ex0rzist - Sa 04.01.03 03:29

Hallo,

zu erst einmal musst du den Aufprallpunkt berechnen. Das dürfte ja kein Problem sein.
Dann denkst du dir eine Gerade (g1) zwischen dem Mittelpunkt des Kreises 1 (der feste) und dem Aufprallpunkt.
Dann denkst du dir eine andere Gerade (g2) zwischen dem Mittelpunkt des Kreises 2 (der bewegte) und dem Aufprallpunkt.
Anschließend brauchst du nur noch den Schnittwinkel dieser beiden Geraden berechnen. Das ist dann der Einfallwinkel (a) und auch der Ausfallwinkel.

Skizze:
user defined image

Ich hoffe mal, dass dir das weiterhilft. :wink:


Delete - Sa 04.01.03 06:01

Hm. Aya, was war denn das jetzt? Genauso habe ich es dir doch auch im ICQ erklärt, nur das ich mit der Tangente an Kreis 1 und dem Auftreffpunkt gearbeitet haben. Was, wie mir jetzt klar wird, überflüssig war.


mimi - Sa 04.01.03 18:28

ich habe auch das problem:
ich will testen ob 2 Greiße(image Kompos) zusammen gestoßen sind aber wie ?

MFG
mimi


delphist - Sa 04.01.03 18:50

mimi hat folgendes geschrieben:
ich habe auch das problem:
ich will testen ob 2 Greiße(image Kompos) zusammen gestoßen sind aber wie ?

MFG
mimi

Greiße gibt es nicht!
Es gibt nur Kreise und Greise!


mimi - Sa 04.01.03 18:55

dann habe ich mich veschrieben aber wie mache ich das nun ?
also wie teste ich habe zwei Kreise zusammengestoßen sind ?

MFG
mimi


Aya - Sa 04.01.03 20:12

@Ex0rcist: Mh... das es so geht weiß ich, nur bei mir komm tjedesmal was anderes raus...

Sag mir doch bitte mal ne genaue Formel... :)

@Luckie: Ja, es is genauso wie du erklärt hast.. nur wie gesagt klappt es bei mir net :(

*winkt*
Aya~


Aya - Sa 04.01.03 20:15

@Mimi: geht einfach.. :)

Du brauchst nur die Position des Kreises und den Radius...
dann rechnest du mit dem Satz des Pythagoras:

Sqrt(Sqr(X2 - X1) + Sqr(Y2 - Y1))

Wenn das dann kleiner ist als R1 + R2 dann treffen sich die beiden kreise.

Au'revoir,
Aya~


mimi - Sa 04.01.03 21:50

Verstehe ich nicht: kannst du mal ein beispiel als funktion machen die funktion soll dann ein Bool wert zurückgeben.
Danke
und könntes du mir genauer sagen was Sqrt macht ?
weil ich kenn mich in Mahte leider nicht gut aus *heuel*

MFG
mimi


Aya - Sa 04.01.03 22:32

huhu,

Sqrt = Wurzel
Sqr = Quadrat (^2)

Beispiel:

Quelltext
1:
2:
3:
4:
function Collision(X1, Y1, X2, Y2: Integer; R1, R2: Single): Boolean;
begin
  Result:=Sqrt(Sqr(X2 - X1) + Sqr(Y2 - Y1))<R1 + R2;
end;


Au'revoir,
Aya~


mimi - Sa 04.01.03 22:34

Danke !!
werde ich mal teste.
was muss ich als r angeben ?
radios ?
und wie bekomme ich denn raus ?

MFG
mimi


Aya - Sa 04.01.03 22:36

huhu,

R ist Radius, ja...

Wie du den rausbekommst..? Öh... kommt drauf an wie du den kreis zeichnest...

schau mal im MatheBuch :)


Raphael O. - Sa 04.01.03 22:37
Titel: Funktion
Hallo!

sqrt zieht die 2. Wurzel (sqrt(9)=3)
sqr gibt dir das Quadrat (sqr(3)=9)

wenn AYA's Angaben richtig sind (wovon iuch ausgehe), dann könnte eine Funktion so aussehen:


Quelltext
1:
2:
3:
4:
function kreiskollision(x1,y1,x2,y2,r1,r2:Integer):boolean;
begin
if Sqrt(Sqr(X2 - X1) + Sqr(Y2 - Y1)) <(r1+r2) then result:=true else result:=false;
end;

8)

Fiji-Fighter


Raphael O. - Sa 04.01.03 22:39
Titel: OOps
:oops: :oops: :oops:

Da war wer schneller :P :oops: :evil:

na ja egal

Fiji-Fighter


Aya - Sa 04.01.03 22:39

ha!

ich war schneller *g*
und vorallem is meine Funktion kürzer, optimierter ;)


mimi - Sa 04.01.03 22:43

ich habe leider kein mahte buch das so schlau ist :cry:
deshlab: könnte ihr mir vieleicht sagen wie ich zu r komme.
ich weiß nur das ich denn durchmesser durch 2 teilen muss mehr nicht.
Aber wie komme ich an denn durchmesser ?
fragen über Fragen ;)

MFG
mimi


Aya - Sa 04.01.03 22:44

Aber.. mal davon abgesehen, mein Hauptproblem is immernoch da :)


mimi - Sa 04.01.03 22:45

meins auch ;)

MFG
mimi


Aya - Sa 04.01.03 22:45

Wie zeichnest du denn einen Kreis, wenn du keinen Radius weißt...?

Was weißt du denn alles von deinem Kreis? (Koordinaten oder so?)


Raphael O. - Sa 04.01.03 22:53
Titel: Buhuuu
:crying: :bawling:

Mein Code ist schlecht

:crying: :bawling:

Ich schreibe in Foren immer unoptimierten Code damit ich gegenüber anderen Programmierern evtl. immer einen Vorteil habe :wink: :wink:

Hast du ein 3/86 oder warum meinst du eine halbe Zeile weniger wäre schon optimiert???

Ich jedenfalls habe einen 4/86 *stolz sein* {gibt es so etwas überhaupt???}
und der ist voll schnell, so dass ich voll viel Datenmüll schreiben kann der gar nicht in der Geschwindigkeit auffällt!!! :twisted: :wink: :wink:


Na gut...
Dein Code ist besser.

Fiji-Fighter

P.S. -Meine Codes sind meistens 3-mal so lang wie die von anderen, dann war dass jetzt doch gar nicht so schlecht... :wink: :wink:


Raphael O. - Sa 04.01.03 22:58

@Aya

Welchen Winkel weißt du denn???

den zwischen der senkrechten und der geraden auf der der Mittelpunkt von Kreis1 auf den MP von Kreis2 zufliegt???

Fiji-Fighter :?: :?:


Aya - Sa 04.01.03 23:13

ich kenne die X und Y Koordinaten beider kreise UND den Winkel in dem der Kreis angeflogen kommt :)


Raphael O. - So 05.01.03 01:03

Schau mal ob dir meine "schöne" "Zeichnung" etwas hilft
user defined image
Also Beta musst du irgendwie noch ausrechnen (du hasst den Kollisionspunkt und den Kreis MP)
Alpha ist glaub ich der winkel den du auch hast.
der Winkel von Epsylon(') an der Achse (nicht in der Zeichnung) ist auch nicht so schwer herauszufinden...
nämlich: Gamma(=y) + Epsylon
der Winkel von Epsylon('') an der Achse ist 180°-(Epsylon-y)

Hoffe das stimmt alles und hilft Dir weiter :wink:


Fiji-Fighter


Aya - So 05.01.03 01:46

:? *schaut nichtsverstehend* :oops:

Also.. äh... ich ähm.. *g*
*doof is* Ich hab nix kapiert :cry:


Raphael O. - So 05.01.03 02:00

Also...

in meiner Zeichnung fliegt der Kreis oben links auf den unten rechts zu.

den Winkel Alpha hast du doch, oder???

Dann mustt du einfach noch Beta ausrechnen und anhanddessen lässt sich dann der Rest ausrechnen!!

Ist doch ganz einfach :!: :wink: :wink: :lol:

Stelle deine Frage mal etwas konkreter, was du nicht verstehst...


Fiji-Fighter


Aya - So 05.01.03 02:06

gut *G* Wie rechne ich Beta aus? :)


Raphael O. - So 05.01.03 02:15

Tja, gute Frage!! *ggg*

Also,
wenn du den kollisionspunkt hast (x+y-wert) dann
ist die steigung von dem radius vom MP zum Kollisionspunkt (KP)
(y1-y2)/(x1-x2) nicht 100% sicher aber 99%

Beta=180°-90°-Steigung

Tataaa :P :P :P Ich habe es hingekriegt

überprüfs nochmal und stell weitere Fragen...


Fiji-Fighter


Aya - So 05.01.03 02:16

*meep* Kleiner einwand... ich hab den Kollisionspunkt nicht *g*
Ich weiß nur OB die dinger kollidieren, nicht wo... :)

PS: Ich bin doof, mh?? :roll:


Raphael O. - So 05.01.03 02:26

Schei*** warum hast du den verdammten kollisionspunkt denn nciht???
Dann Rechne ihn dir halt aus!!! :wink:

*ruhig Blut* :wink:

Also wie könnte man den ausrechnen?!?

*denk*denk*denk* :idea:

der ist auf jedenfall abhängig vom radius :!:

hast du denn die x+y-Koordinaten des MP von beiden Kreisen bei der Kollision???


Aya - So 05.01.03 02:27

jep, die hab ich :)
Den Radius auch


Raphael O. - So 05.01.03 02:30

wenn du die beiden MP hast dann müsste man überprüfen ,welcher Punkt "beiden gemeinsam ist" :?
Nur wie??


Aya - So 05.01.03 02:33

KA... :)
Deswegen dieser Thread hier.. *gg*


Raphael O. - So 05.01.03 02:36

Man könnte natürlich alle Kreispunkte absuchen... zu aufwändig...
ich muss unbedingt optimieren :lol: :wink:


Raphael O. - So 05.01.03 02:41

Dass mir das nicht früher eingefallen ist!!! :idea: :idea: :idea: :P :lol: 8)

Der KP liegt genau zwischen den beiden MP!!!

Also KP.x:=(mp1.x+mp2.x)/2;
KP.:=(mp1.y+mp2.y)/2;

oder??

Fiji-Fighter


Aya - So 05.01.03 02:43

so rein theoretisch könntest du fast recht haben :)


Raphael O. - So 05.01.03 14:52

man könnte allerdings auch anstatt der steigung vom KP zum MP auch die Steigung zwischen den beiden Mp's ausrechnen, denn die ist die gleiche...
dann braucht man gar nicht den KP erst ausrechnen :D :) :P :!:

Fiji-Fighter


Ex0rzist - So 05.01.03 19:41

Fiji-Fighter hat folgendes geschrieben:
Der KP liegt genau zwischen den beiden MP!!!

Also KP.x:=(mp1.x+mp2.x)/2;
KP.:=(mp1.y+mp2.y)/2;

oder??


Aber nur, wenn der Abstand der beiden Mittelpunkte der Kreise gleich der Summe der Radien der beiden Kreise ist.
Also musst du zuerst diese Bedingung prüfen, um dann den Kollisionspunkt zu berechnen.


Raphael O. - Mo 06.01.03 17:12

Zitat:
aber nur, wenn der Abstand der beiden Mittelpunkte der Kreise gleich der Summe der Radien der beiden Kreise ist
:shock: soso...
Wann ist das denn nicht der Fall???

Ähem...

Das ist immer der Fall!
Egal welche Radien...
aber tatsächlich war der Code den ich gepostet hatte nur für 2Kreise mit gleichgroßem Radius zu gebrauchen, ist aber auch nicht schwer so umzuformen, dass er für Kreise mit beliebigen Radien zu gebrauchen ist....
Allerdings habe ich ja auch schon gesagt, dass man den KP gar nicht braucht, wodurch eine Lösung dieses "Problems" überflüssig ist...

Fiji-Fighter


Ex0rzist - Mo 06.01.03 20:34

Fiji-Fighter hat folgendes geschrieben:
Zitat:
aber nur, wenn der Abstand der beiden Mittelpunkte der Kreise gleich der Summe der Radien der beiden Kreise ist
Wann ist das denn nicht der Fall???

Ähem...

Das ist immer der Fall!


Nicht, wenn die Kreise sich nicht berühren. :wink:


Raphael O. - Mo 06.01.03 20:38

dann gibt es auch nicht einen Kollisionspunkt! :twisted:

Fiji-Fighter


Ex0rzist - Mo 06.01.03 20:47

Fiji-Fighter hat folgendes geschrieben:
dann gibt es auch nicht einen Kollisionspunkt! :twisted:


Und deshalb muss man das vorher überprüfen, bevor man den Punkt berechnen will. :wink:


Raphael O. - Mo 06.01.03 20:54

Zitat:
Und deshalb muss man das vorher überprüfen, bevor man den Punkt berechnen will.


das stimmt schon...
aber die funktion zum ausrechnen des ausfallwinkels (darum geht es ja eigentlich!) wird bei der Berührung aufgerufen. und ich würde mal meinen bei einer Berührung gibt es einen KP!!!!!!!!!!!!!

Fiji-Fighter

P.S. Wie macht man das, dass man ein Quote macht wo dann auch dasteht wer das geschrieben hat und nicht nur "Zitat"???


Ex0rzist - Mo 06.01.03 20:57

Ok, das war auch nur ein wenig Haarspalterei. :wink:

Das mit dem Zitat geht mit Hilfe von

Quelltext
1:
[quote="Fiji-Fighter"] ... [/quote]                    


Nächste Frage: :wink:
Fiji-Fighter hat folgendes geschrieben:
man könnte allerdings auch anstatt der steigung vom KP zum MP auch die Steigung zwischen den beiden Mp's ausrechnen, denn die ist die gleiche...
dann braucht man gar nicht den KP erst ausrechnen :D :) :P :!:


Also das musst du mir erklären.
Wenn die Steigung zwischen KP - MP genauso groß ist wie die zwischen MP - MP, dann prallt der Kreis dorthin ab, wo er hergekommen ist.

Oder nicht? :?:


Raphael O. - Mo 06.01.03 21:01

das mit der Steigung war nur um Beta auszurechnen und nicht um den Ausfallwinkel auszurechnen...

schau noch mal meine "Zeichnung" und die Posts danach an, da habe ich es schon erklärt!

ich hatte schon [quote=Name] blablabla[/quote] ausprobiert aber wie du siehst klappt das nicht *ggg*
danke für die hilfe mit den ""

Fiji-Fighter


Ex0rzist - Mo 06.01.03 21:11

Achso, alles klar. :roll:

Nimm es mir bitte nicht übel, aber irgendwie finde ich meine Lösung einfacher. :beer:
Aber das behauptet wohl jeder von seiner Lösung. :lol:


Für ein Zitat mit Namen kannst du alternativ auch auf "Zitat" bei dem jeweiligen Post klicken. :P


Raphael O. - Mo 06.01.03 21:17

Ex0rzist hat folgendes geschrieben:
irgendwie finde ich meine Lösung einfacher.

Deine Lösung ist sogar einfacher :oops:
aber ich wusste nicht, wie man daraus den ausfallwinkel relativ zur Achse angeben kann...
jetzt weiss ich es allerdings *gg*

Fiji-Fighter


Ex0rzist - Mo 06.01.03 21:20

Gut, dass wir darüber gesprochen haben. :beer:


Aya - Mo 06.01.03 21:32

Ich hab irgendwie den faden verloren... *g*

Also wie ist nun die einfachste lösung?? :oops:

*winkt*
Aya~


Raphael O. - Mo 06.01.03 21:39

Aya hat folgendes geschrieben:
Ich hab irgendwie den faden verloren... *g*
Wer hat das nicht?? *ggg*

na ja wahrscheinlich die von Ex0rzist!
Funktioniert denn meine Methode eigentlich???

nur wie man das relativ zur achse bei Ex... angibt erklär ich wananders *ggg* vielleicht morgen...
bin im moment nicht dazu imstande *ggg*

Fiji-Fighter


Ex0rzist - Mo 06.01.03 21:49

Wie man den Kollisionspunkt berechnet, haben wir ja hier beschrochen. :wink: Den Schnittwinkel von Geraden bestimmt man mit Hilfe des Skalarproduktes zweier Vektoren.

Quelltext
1:
2:
3:
4:
            ->   ->
            a ·  b  
cos(a) =  ----------
           |a|·|b|


Aya - Di 07.01.03 00:06

Macht ihr mir nochmal eine komplette finale Formel?? *g*

Wie ich den winkel berechne?? :)


DerKrasseHans - Fr 10.01.03 21:07

Moin Letz,
Puuuuuh ganz schön starker Tobak und ich muss gestehen, ich schliess mich den Club, derer die den Faden verloren haben an, aber ich hab zwei Skizzen gesehen, die mich veranlasst haben eine eigene anzufertigen:
user defined image
Man muss bedenken, dass der Schnittpunkt B der Geraden g1 mit dem festen Kreis, den Du erhältst, indem Du die Gerade g1 definiert durch deinen Winkel y und den Mittelpunkt M des beweglichen Kreises auf den festen Kreis "losschießt" ist nicht der Punkt, in dem sich die beiden Kreise beim Zusammenstoß berühren! Der Berührpunkt ist A, der sich aus der Ausdehnung der Kreise und der Gerade g1 berechnen lässt (die Frage ist nur wie, ich hab keine Ahnung!).
Wenn man den Punkt A hat kann man über die Kreisfunktion und deren Ableitung den Steigungswert m der Tangenten t(x) bestimmen.
Über die Arcus-Tangens-Funktion, dann den Winkel zwischen Waagerechter und dieser Tangenten bestimmen, wodurch man wiederum den Auftreffwinkel der beiden Kreise (Gegenwinkel!) bestimmen kann.

So ich hoffe man konnte (und wollte) mir noch folgen.


Raphael O. - Fr 10.01.03 21:40

*faden.such* *ggg*

das der kollisionspunkt nicht genau auf dem Geraden liegt in die die Kugel fliegt, da habe ich auch schon mal drauf hingewiesen...

mit deiner Zeichnung (sehr schön im Gegensatz zu meiner *ggg*) kommen wir der "perfekten" Lösung wieder etwas näher, dadurch wird das ganze Problem allerdings wieder um einiges komplexer...
Irgendwann wird das ganze dann mal klar gelöst sein und dann meißeln wir es in Stein :wink: :wink:

Man würde gar nicht denken das ein anscheinend so simples Problem so kompliziert werden kann bzw. ist...

Fiji-Fighter

P.S. dieser Beitrag trägt wahrlich wenig zu der Lösung des Problems bei (wie z.B. mit Formeln...) aber diese Gedanken werden noch Folgen, falls nicht irgendwer schneller ist (ist so etwas überhaupt möglich??? Ich tippe doch schon schneller als mein eigener Schatten...) :wink: :wink:


DerKrasseHans - Mi 29.01.03 23:48

Nabend,
ich bilde mir ein das Problem gelöst zu haben, aber eher praktisch als theretisch. Von zweiterem kann ich aufgrund meiner Versuche die Kreisabprall-Geschichte rein auf einem Zettel abzuleiten nur abraten. Ich hatte ein paar Ableitungsschritte vor dem Ziel eine Formel, die so sperrig war, dass sie selbst auf das Papier im Querformat nur noch schwerlich passte.
Das Problem aber in einer Programmlaufzeit zu lösen geht dagegen doch verhältnismäßig viel einfacher. Ich hab hier mal einen Quellcode zusammengeschustert und zum download bereitgestellt (link unten).
Es kommt in dem Code sehr viel lineare Algebra vor, wer auf dem Gebiet nicht mehr so fit ist, sollte sich vielleicht sein altes Mathebuch aus der Oberstufe nochmal krallen.
Ansonsten bin ich gespannt auf Kommentare zum Code.
http://members.fortunecity.de/derkrassehans/KreisAufprall.zip
Gruß aus Hamburch...


©menschenskind - Sa 01.02.03 12:20

wie sag ich immer so schön, programmieren zu können, heißt alternativen zu finden :mahn:


DerKrasseHans - Di 04.02.03 21:30

Der Code enthält eins zu eins den mathematische Lösungsweg, es geht genau in den Schritten vor, in denen man auch vorgehen würde, wenn man das Problem formal auf Papier ausrechnet. Daher ist es nicht als Alternative, sondern als Umsetzung zu verstehen.
Gruß Paul.