Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Kugel trifft Schräge

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Off-Topic-Forum
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Nils



Anmeldungsdatum: 24.03.2006
Beiträge: 191

BeitragVerfasst am: 30.06.2016, 14:49    Titel: Kugel trifft Schräge Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden AIM-Name
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 30.06.2016, 17:42    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2507
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 01.07.2016, 21:45    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Nils



Anmeldungsdatum: 24.03.2006
Beiträge: 191

BeitragVerfasst am: 02.07.2016, 18:53    Titel: Antworten mit Zitat

@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
Benutzer-Profile anzeigen Private Nachricht senden AIM-Name
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2507
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 02.07.2016, 19:56    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 02.07.2016, 20:45    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Off-Topic-Forum Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz