Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Nils
Anmeldungsdatum: 24.03.2006 Beiträge: 191
|
Verfasst am: 30.06.2016, 15:49 Titel: Kugel trifft Schräge |
|
|
Guten Tag Gemeinde!
Trotz EM habe ich mal eine Frage in die Runde.
Ich möchte virtuell eine Kugel rollen lassen, die eine Schräge treffen soll. Sobald sie die Schräge berührt, möchte ich den Berührungspunkt der Schräge, den der Kugel und den Mittelpunkt der Kugel wissen.
Wie macht man so etwas? Ich habe da gar keine Ahnung.
grüsse Nils _________________ Kontrolliert die Politik! Laßt nicht die Politik Euch kontrollieren! Das sind Eure Angestellten! Lasst Sie das spüren!!! |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4603 Wohnort: ~/
|
Verfasst am: 30.06.2016, 18:42 Titel: |
|
|
Dazu bräuchte man noch ein paar grundlegende Informationen - ist das als dreidimensionales Problem gedacht? Wenn ja, wie werden die Daten zur Kugel und zur Ebene dargestellt?
Üblicherweise würde man wohl die Kugel über ihren aktuellen Mittelpunkt (Ortsvektor) und ihren Radius angeben und die Ebene (Schräge) durch ihren Normalenvektor. Die Kugel braucht dann noch einen Richtungsvektor für die aktuelle Bewegung vor "Zusammenstoß" mit der Ebenen. Mit diesen Angaben lässt sich dann über die Analytische Geometrie alles weitere berechnen. Als Denkanstoß: Der Kugelmittelpunkt bewegt sich auf einer Geraden, und du suchst einen Punkt auf dieser Geraden, deren Abstand zur Ebene gleich dem Kugelradius ist (da wird es in der Regel zwei geben, von denen aber nur einer in Frage kommt). Dieser Punkt steht senkrecht zur Ebene (-> Normalenvektor) im Abstand des Kugelradius über dem gesuchten Berührpunkt. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2509 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 01.07.2016, 22:45 Titel: |
|
|
Projekt von mir in diese Richtung:
http://www.dreael.ch/Deutsch/Download/Billard-Simulation.html
=> Am besten die dortigen Quellcodes Dir einmal anschauen. Nebenbei noch viele Algorithmen enthalten wie die Sache mit dem Impulssatz (Zusammenstoss zweier Kugeln sowie auch mit Bande) und das Handling, wenn gleichzeitig viele Kugeln sich bewegen. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
|
Nils
Anmeldungsdatum: 24.03.2006 Beiträge: 191
|
Verfasst am: 02.07.2016, 19:53 Titel: |
|
|
@dreael: Aus den Quellcodes werde ich wahrscheinlich nichts so recht rauslesen können. Dazu bin ich zu ungeübt dazu. Wie groß sind denn die Iterationschritte um zu vernünftigen Ergebnissen zu kommen? Erfasst Du denn den Kontaktpunkt?
@nemored:
Schick überlegt!
Zitat: | Dieser Punkt steht senkrecht zur Ebene (-> Normalenvektor) im Abstand des Kugelradius über dem gesuchten Berührpunkt. |
Welcher Punkt ist exakt gemeint? Gehtst Du davon aus, dass der Berührpunkt auf der Schräge Fußpunkt einer Normale ist, die durch den Kugelmittelpunkt geht? Meinst Du das so?
@Beide:
Wie erhalte ich denn den Berührpunkt? Ich stelle mir das nicht einfach vor. Der kann ja im R2 in allen Richtungen liegen und erst recht im R3. Dazu habe ich noch unzählige Kreisumfangs- bzw. Kugeloberflächenpunkte. Oder hab' ich gerade ein Brett vorm Kopf?
grüsse Nils _________________ Kontrolliert die Politik! Laßt nicht die Politik Euch kontrollieren! Das sind Eure Angestellten! Lasst Sie das spüren!!! |
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2509 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 02.07.2016, 20:56 Titel: |
|
|
Zum Ausprobieren am besten die QBasic-Version nehmen, diese sollte sich mit relativ wenig Aufwand in FreeBasic übernehmen lassen. Hauptteil zum Anpassen: Double-Buffering mittels der in FreeBasic natürlich eher besser ausgebauten Möglichkeiten (ich meinte ScreenLock / ScreenUnlock oder so etwas müsste verwendet werden. Hat hier genügend Profis).
Sonst die wichtigsten SUB-Prozeduren daraus:
- WannStoss(): Berechnung Zeitpunkt, wann sich zwei Kugeln zusammenstossen werden
- WannBande(): dito nur mit der feststehenden Bande
Grundprinzip: Jede Kugel ist als Objekt (TYPE in QB) abgebildet, u.a. besitzt jede Kugel eine momentane Geschwindigkeit (als Vektor v.x/v.y abgebildet) + eine Ausgangsposition (p.x/p.y) zu einem Zeitpunkt t0
Weil sich viele Kugeln bewegen, findet natürlich immer das zeitlich demnächst (am frühesten) stattfindende Zusammenstoss-Ereignis (Objekt Stosszeit) statt, wofür eine sog. Halde (Array StEreig) zum Einsatz kommt.
In den beiden SUB-Prozeduren UmlenkungStoss() und UmlenkungBande() wird dann entsprechend dem Impulssatz der Stoss "ausgeführt", d.h. die Geschwindigkeit umgelekt, wobei die Kugel bezüglich t0 und p.x/p.y entsprechend der bisherigen Geschwindigkeit vorher noch nachgeführt wird (SUB BewegeKugel()) -> die Umlenkung ist dann nur noch eine Änderung des Geschwindigkeitsvektors. Dabei werden künftige Zusammenstoss-Ereignisse, welche ohne die vorzeitige Umlenkung stattgefunden hätten, verworfen und aufgrund der neuen Geschwindigkeitsrichtung diese neu berechnet.
=> Für Deine ursprüngliche Frage solltest Du also WannBande() und UmlenkungBande() Dir ganz genau anschauen und verstehen versuchen.
Da Du noch das Stichwort Iteration nennst: In dem Sinn in kleinen Schritten alle Kugeln direkt bewegen und erst bei Annäherung mit Zusammenstoss-Ereignissen aktiv werden mache ich dort nicht, sondern jede Bandenwand mit jeder Kugel sowie jede Kugel mit jeder anderen Kugel wird explizit der Zeitpunkt ausgerechnet. => Simulation läuft in dem Sinn mit der maximalen Präzision unabhängig von der Frames-per-Second-Bildwiederholrate, d.h. problemlos könntest Du dort auch nur alle 10 Sekunden ein Bild darstellen und der Simulationsverlauf stimmt genauso perfekt als würdest Du 100 Bilder/s berechnen. Genau deswegen kommt die Sache mit der sog. Halde ins Spiel, weil diese schlussendlich steuert, welches von den vielen künftig möglichen Zusammenstoss-Ereignissen auch tatsächlich zustandekommt. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4603 Wohnort: ~/
|
Verfasst am: 02.07.2016, 21:45 Titel: |
|
|
Zum rein mathematischen Problem:
Die Kugel besitzt den Radius r und bewegt sich auf der Geraden g mit Ortsvektor u und Richtungsvektor v.
g: x = u + l*v (leider kann ich hier nicht auf komfortable Art Vektorpfeile schreiben) bzw.
g: (x1|x2|x3) = (u1|u2|u3) + l*(v1|v2|v3)
Die Ebene wird durch die Hessenormalform präsentiert:
E: n1*x1 + n2*x2 + n3*x3 - n0 = 0
wobei (n1|n2|n3) ein Normalenvektor n vorzugsweise der Länge 1 ist.
Jetzt gibt es genau zwei Punkte auf g, die von E genau den Abstand r besitzen. Dazu setzt du x1 = u1 + l*v1 usw. in die Ebenengleichung ein, allerdings nicht mit Ergebnis =0, sondern =r oder =-r (sofern der Normalenvektor Länge 1 besitzt). Nur eine der beiden Versionen befindet sich "auf der richtigen Seite". Dann l in g einsetzen, damit erhältst du den Mittelpunkt M der Kugel beim Berühren der Ebene. M - r*n oder M + r*n ergibt den Berührpunkt auf der Ebene (funktioniert wieder nur, wenn n ein Einheitsvektor ist). Ob - oder + hängt wieder davon ab, auf welcher Seite der Ebene die Kugel liegt bzw. in welche Richtung n zeigt.
Ich würde gern noch eine hübsche Zeichnung beifügen, aber ich bin schon froh, dass ich einigermaßen 3D-Zeichungen mit der Hand hinbekomme - am Computer wird das erst recht nichts ... _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
|