Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 18:14

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: line circle intersection
BeitragVerfasst: Di Sep 09, 2003 18:21 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jun 09, 2003 08:09
Beiträge: 98
Ich bastel zurzeit an meiner Kollisions Kontrolle rum...
Naja ich hab ne art Standline zwischen zwei Punkten P1 und P2, und nen Kreis mit dem Radius R an der Position P.
Nun gehts darum festzustellen ob der Kreis die Line schneidet oder nicht, wenn ja wo (wobei beim richtigen "schneiden" zwei Schnittpunkte vorhanden sind).
Hab schon bei Google gesucht, finde aber nur so mathematisches Gefasel und dann auf Englisch, da hörts bei mir auf...

mfg las


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 10, 2003 10:54 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Also ich hab mal schnell versucht nen Algo dafür zu schreiben, funzt teilweise... schau dirs mal an:

der code für Sphere-Line-Intersection: (Für links und rechts funzt es wunderbar, bloss für oben nicht wirklich :( )

Code:
  1.  
  2. TR3DVector = record
  3.   X,Y,Z : Single;
  4. end;
  5.  
  6. TR3DLine = array [0..1] of TR3DVector;
  7.  
  8. TR3DSphere = record
  9.   Position : TR3DVector;
  10.   Radius : Single;
  11. end;
  12.  
  13. function r3d_VectorInterpolate(_Vector1, _Vector2: TR3DVector;
  14.   Amt: Single): TR3DVector;
  15. begin
  16.   Result.X := _Vector1.X + (_Vector2.X - _Vector1.X) * Amt;
  17.   Result.Y := _Vector1.Y + (_Vector2.Y - _Vector1.Y) * Amt;
  18.   Result.Z := _Vector1.Z + (_Vector2.Z - _Vector1.Z) * Amt;
  19. end;
  20.  
  21. function r3d_VectorLength(V: TR3DVector): Single;
  22. begin
  23.   Result := Sqrt(Sqr(V.X) + Sqr(V.Y) + Sqr(V.Z));
  24. end;
  25.  
  26. function r3d_VectorDistance(_Vector1, _Vector2 : TR3DVector) : Single;
  27. begin
  28.   Result := Sqrt(Sqr(_Vector1.x-_Vector2.x)+Sqr(_Vector1.y-_Vector2.y)+Sqr(_Vector1.z-_Vector2.z));
  29. end;
  30.  
  31. function r3d_SphereLineIntersection(_Sphere : TR3DSphere; _Line : TR3DLine) : Boolean;
  32. var
  33.   Middle                  : TR3DVector;
  34.   Distance,
  35.   LineLength,
  36.   DistanceMinusLineLength : TR3DFloat;
  37. begin
  38.   // Länge der Linie
  39.   LineLength := r3d_VectorLength(r3d_VectorSub(_Line[0], _Line[1]));
  40.  
  41.   // Mitte der Linie rausfinden
  42.   Middle := r3d_VectorInterpolate(_Line[0], _Line[1], 0.5);
  43.  
  44.   // Distance zwischen (Mitte der Linie) und (Kugel Position)
  45.   Distance := r3d_VectorDistance(Middle, _Sphere.Position);
  46.  
  47.   // Distance minus Länge der Linie / 2
  48.   DistanceMinusLineLength := Distance - (LineLength / 2);
  49.  
  50.   // Kollision wenn Distance sich im radius befindet.
  51.   Result := (DistanceMinusLineLength < _Sphere.Radius);
  52. end;
  53.  


Download vom demo:
http://encorex.no-ip.com/shared/Final/r3d_collisiondetection.zip

Steuerung fürs demo:

Pfeiltasten Oben/Unten +Y / -Y
Pfeiltasten Rechts/Links +X / -X
Einfg -Z
Entf +Z
Leertaste Kollisionsmodell wechseln


Hoffe ma das hilft dir ;)

matane,
Final


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 10, 2003 17:32 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jun 09, 2003 08:09
Beiträge: 98
Also 3D bringt mich nicht wirklich weiter...
big thx trotzdem.
hmmm ich muss mal nen bissel was ausprobieren...


mfg las


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 16 Queries | GZIP : On ]