Strahl schneidet Kreis
Übersicht

EdlothiolBetreff: Strahl schneidet Kreis |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Wie finde ich heraus, ob ein Strahl mit der Position x,y und dem Winkel a einen Kreis mit der Position cx,cy und dem Radius cr schneidet?
Ich brauch das für meine Duel - KI. |
||
Apocalyptic |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Naja, ist zwar keine gute Lösung, aber trotzdem mein Denkansatz:
Du berechnest die Steigung deiner Linie (Linie=Strahl?) ((y2-y1)/(x2-x1) bzw mit Hilfe des Winkels) berechnest für alle in Frage kommenden x die entsprechenden y (y=mx+c), und prüfst damit Die Entfernung zum Mittelpunkt deines Kreises (Pythagoras). Wenn die Entfernung kleiner gleich als der Radius ist, dann sollte sich das ganze schneiden. Ich hoffe mal, ich denk richtig... |
||
Suum cuique
[ www.ffs-net.de.vu ] [ Raycaster ] |
Edlothiol |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Müsste theoretisch klappen, aber von der Performance her... Ausserdem weiß ich eigentlich nicht genau, wie lang die Linie sein muss (deshalb Strahl). Egal, ich werds trotzdem mal probieren, danke. | ||
Apocalyptic |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich sagte ja, schlechte Lösung ![]() Was hast du den für Informationen von deinem Strahl? Anfangsposition und Winkel? |
||
Suum cuique
[ www.ffs-net.de.vu ] [ Raycaster ] |
HOT-BITGast |
![]() Antworten mit Zitat |
|
---|---|---|
Hi,
schau unter Superballs. Da hab ich sowas eingebaut. Toni |
||
Edlothiol |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Bin ich blind? Ich finds nicht.
@Apocalyptic: Ja, Anfangsposition und Winkel. |
||
![]() |
D2006Administrator |
![]() Antworten mit Zitat ![]() |
---|---|---|
mit hilfe von atan2 könntest du den winkel der position des kreises relativ zum strahl-ursprung ausrechnen. damit kannst du dann die winkel der äußeren punkte des kreises relativ zum ursprung ausrechnen. befindet sich nun der strahl innerhalb dieser beiden winkel, schneidet er den kreis früher oder später
MfG |
||
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2 |
![]() |
Merced |
![]() Antworten mit Zitat ![]() |
---|---|---|
Kannst das so lösen:
Nimm deinen Winkel zähl 90° dazu. Von diesem Winkel aus rechnest Du den Punkt aus, der R (Radius) Einheiten vom Kreiszentrum entfernt ist. Das gleiche nochmal in die andere Richtung. (Dein Winkel-90°) Jetzt hast Du die Punkte in denen der Strahl den Kreis tangieren (berühren) würde. Jetzt musst Du nur noch prüfen ob Dein Strahl zwischen beiden Punkten durchgeht oder nicht. Basta. |
||
http://www.starship-battles.de.vu
http://www.venture-interactive.de.vu |
![]() |
Mr.Keks |
![]() Antworten mit Zitat ![]() |
---|---|---|
beim kreis ist wahrscheinlich die tangentenmethode die beste... ansonsten ist die ganz oben beschriebene gut... habe dazu auch was... http://www.crazypage.net/Inarie/downloads.php "laserdemo", denke ich. is aber unkommentiert =) | ||
MrKeks.net |
![]() |
D2006Administrator |
![]() Antworten mit Zitat ![]() |
---|---|---|
ich möchte nur eben darauf hinweisen, dass ein Strahl eine Gerade mit Startpunkt, aber ohne Endpunkt ist. Aus diesem Grund kann man sich die Überprüfung erleichtern.
EDIT @Mike-Nike (s. unten): Die Linie zwischen zwei Punkten hieß STRECKE ![]() |
||
- Zuletzt bearbeitet von D2006 am Sa, Feb 21, 2004 0:08, insgesamt einmal bearbeitet
![]() |
Mike Nike |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hmm...als Mathematiker ist es meine Pflicht, denke ich, nochmals auf die mathematische Korrektheit hinzuweisen:
1. Eine LINIE hat einen Startpunkt und einen Endpunkt 2. Ein STRAHL hat einen Startpunkt, aber keinen Endpunkt 3. Eine GERADE hat weder Startpunkt, noch Endpunkt Möge sich mein Ex-Mathelehrer einen Strick nehmen, wenn dies nicht stimmen sollte ![]() Edit: *fettgrins* - ich geb zu, es lag mir auf der Zunge, aber irgendwie hat sich stattdessen Linie in mein Gehirn gepflanzt ![]() |
||
..where the only limit is your imagination. |
![]() |
Mr.Keks |
![]() Antworten mit Zitat ![]() |
---|---|---|
hmm, danke mikenike... sonst hätte ich mich wohl kaum an den stoff der dritten klasse erinnert...
willst du uns nicht auch noch erklären, was der da oben mit kreis meinte? und was sollten eigentlich die tangenten? ![]() |
||
MrKeks.net |
Edlothiol |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich hab jetzt mal die Methode von Apocalyptic ausprobiert...
Code: [AUSKLAPPEN] function AvoidCircle(sangle,sx,sy,x,y,r)
; Vorberechnungen cosangle# = cos(sangle) sinangle# = sin(sangle) ; Berechnen, ob ein Strahl durch den Kreis geht ; Überhaupt Overlap? firstcolx = -1 : firstcoly = -1 lastcolx = -1 : lastcoly = -1 if rectsoverlapex(x-r,y-r,r*2,r*2,sx,sy,cosangle * Avoid_Distance,sinangle * Avoid_Distance) = false then return ax# = sx : ay# = sy r2 = r^2 count = 0 while count < Avoid_Distance count = count + 1 ax = ax + cosangle ay = ay + sinangle ; Entfernung berechnen if ((x-ax)^2 + (y-ay)^2) < r2 then ; Kollision! if firstcolx = -1 then firstcolx = ax firstcoly = ay end if lastcolx = ax lastcoly = ay elseif lastcolx <> -1 then return true ; Einmal ausgetreten, wird es keine Kollision mehr geben end if wend end function Wundert euch nicht über die komischen Namen ![]() Es funktioniert einwandfrei. Irgendwelche Verbesserungsvorschläge? Ich brauch den ersten und letzten Punkt der Kollision, deshalb hab ichs so implementiert. Edit: Ach ja, "RectsOverlapEx" funktioniert wie RectsOverlap, nur nimmt es auch negative Breiten/Höhen und subtrahiert die dann von den Koordinaten. |
||
![]() |
Kryan |
![]() Antworten mit Zitat ![]() |
---|---|---|
eine sehr dumme frage (möchte sie trotzdem beantwortet haben):
Wie schießt man? Ok, ich weiß, passt nit hier rein, aber ich wills trotzdem wissen! |
||
Webspaceanbieter?
Klick hier! Kultige Spieleschmiede? Klick hier! |
Edlothiol |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Höä? Wie "Wie schießt man"? Was meinst du damit?
Das Ausweichen funktioniert jetzt recht gut (naja, recht gut) ![]() |
||
![]() |
Kryan |
![]() Antworten mit Zitat ![]() |
---|---|---|
oh, schon gut, auf den nach unten cursor ![]() |
||
Webspaceanbieter?
Klick hier! Kultige Spieleschmiede? Klick hier! |
Edlothiol |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ah, achso. Sonst hätte ich dir mal empfohlen, die readme.txt zu lesen ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group