PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Abschusswinkel finden


Marscel
2008-11-24, 11:05:15
Eher eine Mathefrage als konkret Programmierung, aber es gibt ja dieses Spiel, wo man über eine 2D-Karte Geschütze verteilt. Das Gelände ist zufällig und ziemlich hügelig. Man muss seinem Geschütz die anderen Abschießen, Schwierigkeit liegt darin, richtige Startgeschwindigkeit und Winkel zu finden.

Wenn man die Parameter selber finden muss, ist das ja alles kein Ding, nun aber wollte ich den vorliegenden Quellcode aus Langeweile mal um einen Computergegner erweitern, aber an einer Stelle weiß ich nicht weiter.

Es geht darum, herauszufinden, welcher Abschusswinkel mindestens erforderlich ist, damit der Computer mich trifft, die Koordinaten von meinem Panzer sind ja bekannt.
Aber jetzt gibt es ja eine ganze Menge an Fällen, die gedeckt werden müssen, konkret will ich auf die hinaus, die aus einem höheren Hindernis bestehen, egal, ob der Gegner über oder unter der eigenen Y-Koordinate liegt.
Um mich nicht gleich zu überfordern, dachte ich, es wäre einfacher, wenn der Scheitelpunkt der Schusslinie genau auf der Hälfte der X -Distanz liegt (ist das richtig, sinnvoll...?).

http://www.pcreact.de/3dc/graph.png

Ursprünglich hab ich überlegt, gehst du von Rot aus Richtung Blau bis zur Hälfte, suchst den maximalsten Winkel, andersrum in die andere Richtung und guckst, welcher max. Winkel größer ist, das in die Abschussposition umrechnen und weiter gehts, Geschwindigkeit ausrechnen, Feuer.
Aber wenn Blau nun viel höher liegen sollte als Rot, geht das ja nicht mehr auf, da muss man zwangsläufig weiter nach oben schießen.

Nun grübele ich seit zwei Tagen, um wieviel denn genau? Ein Annäherungsverfahren kann ja nicht der einzige Weg sein.

Gibt es Berechnungsverfahren oder weiß wer besser als ich, wie man da vorgeht?

Und nein, das ist keine Hausaufgabe, kein kommerzielles Projekt, ich mach das nur etwas aus Spaß am Minispiele bauen - und Informatik/Mathe/Physik studiere ich auch nicht. ;)

pest
2008-11-24, 11:12:17
gesetzt dem Fall ich habe verstanden um was es geht,
wäre meine erste Frage welche Formel deine Bahnkurve beschreibt.
Mit ein bisschen Rumrechnerei sollte der Computergegner immer die perfekte Kurve rausbekommen.

Marscel
2008-11-24, 11:26:37
Die gängige, luftwiderstandslose, "schiefer Wurf"-Parabel.

Wäre da jetzt nur ein Punkt irgendwo, den es damit zu treffen gilt, würde ich nicht fragen. Angesichts der Hindernisse, speziell im abgebildeten Fall, ist aber nicht jeder Winkel möglich (sodass bei zu geringem etwa das Geschoss am Hügel hängen bleibt) - und auch wenn man den Mindestwinkel hat, um über alle Hindernisse beim Aufstieg hinwegzukommen, muss ich ja immer noch wissen, wie steil der Sinkflug sein muss.
Ich dachte, wenn man den heraus hat, lässt sich die Startgeschwindigkeit bestimmen und alles läuft - aber find ich schlicht nicht auf intelligentem Weg heraus.

Monger
2008-11-24, 11:30:55
Also, mathematisch gesehen suchst du den Punkt, zu dem du selbst den steilsten Winkel hast.

Winkelrechnerei ist halt immer hässlich, aber in dem Fall musst du ja auch nur indirekt darauf schließen.

Sagen wir mal, du nimmst einen Punkt vom Gelände namens A mit den Koordinaten X1 und Y1. Du selbst bist T(X2,Y2)

Dann berechnen wir die Steigung von A zu T:
Steigung = (Y1 - Y2)/(X1 - X2)

Das würde natürlich schief gehen, wenn der Punkt direkt unter dir liegt - den solltest du also von der Rechnung ausnehmen! ;)

Als Holzhammermethode musst du halt jeden Punkt des Geländes durchgehen, und dir den Punkt merken der die stärkste Steigung hat. Den benutzst du dann, um darüber hinweg anzupeilen. Vielleicht solltest du darüber hinaus auch nur die Punkte zwischen dir und deinem Gegner berücksichtigen, sonst schießt du in einem hohen Bogen auf den Gegner direkt neben dir, obwohl der nächste Berg kilometerweit weg ist! ;)

Eine wirklich mathematisch exakte Lösung ist das nicht, aber imho die unproblematischste. Du brauchst hier ja nur irgendwas Pi mal Daumen.

Gast
2008-11-24, 11:32:04
Kann man da keinen Ansatz über Energien reinbringen, um die Höhen zu berücksichtigen? Also prinzipiell alles berechnen, als wenn das Ziel auf gleicher Höhe ist und dann den Höhenunterschied als potentielle Energie rausrechnen und die 1. Rechnung korrigieren. Ich denke mal, Luftwiderstand wird vernachlässigt, also müsste man das so hinbekommen.

pest
2008-11-24, 11:34:11
Dann berechnen wir die Steigung von A zu T:
Steigung = (Y1 - Y2)/(X1 - X2)


dY/dX

too late ;)

Spasstiger
2008-11-24, 11:37:07
Ich würde als Nebenbedingung immer voraussetzen, dass die Geschwindigkeit maximal ist. Und dann dazu den passenden, maximal steilen Winkel finden.

Die Steigung am Abwurfpunkt berechnet sich aus dem Winkel übrigens über tan(Winkel). Wenn der Gegner wirft und du ein normales Koordinatensystem ansetzt, wo die x-Achse nach rechts größere Werte hat und die y-Achse nach oben, musst du (-1)*Winkel einsetzen.

Marscel
2008-11-24, 11:41:52
Als Holzhammermethode musst du halt jeden Punkt des Geländes durchgehen, und dir den Punkt merken der die stärkste Steigung hat. Den benutzst du dann, um darüber hinweg anzupeilen. Vielleicht solltest du darüber hinaus auch nur die Punkte zwischen dir und deinem Gegner berücksichtigen, sonst schießt du in einem hohen Bogen auf den Gegner direkt neben dir, obwohl der nächste Berg kilometerweit weg ist! ;)

Winkelberechnung über Tangens krieg ich ja hin. Genau diesen Weg hab ich ja ursprünglich mal versucht: der größte Winkel ist per sé eben da, wo die steilste Stelle zum Ausgang ist - in diesem Fall hier irgendwo im ersten Hügel. Soweit kein Problem. Aber der bringt mir ja nichts, wenn blau hinter diesem Hindernis noch höher liegt, dann muss der eben berechnete Winkel ja immer noch kleiner sein, als der der tatsächlich nötig ist, damit die Rakete im hohen Bogen und im richtigen - ggf großen - Winkel dort einschlägt.

Energien? Wenn ich mich richtig erinnere, müsste ich dafür doch Massen einführen, aber ist wirklich nötig?

Edit: maximale Geschwindigkeit wäre eine Option, aber nur das wäre doch sehr realitätsfern - dann müsste ich ja immer Sekunden warten, bis das Geschoss wieder zurück im Bildschirm ist. Eigentlich wollte ich damit nur sagen, es muss doch Wege geben, wie man das etwas natürlich wirkender lösen kann - haben doch andere Spiele auch schon geschafft. ;)

Spasstiger
2008-11-24, 11:50:51
Edit: maximale Geschwindigkeit wäre eine Option, aber nur das wäre doch sehr realitätsfern - dann müsste ich ja immer Sekunden warten, bis das Geschoss wieder zurück im Bildschirm ist. Eigentlich wollte ich damit nur sagen, es muss doch Wege geben, wie man das etwas natürlich wirkender lösen kann - haben doch andere Spiele auch schon geschafft. ;)
Du kannst natürlich auch erstmal prüfen, welcher Winkel mindestens erforderlich ist, um über ein Hindernis drüber zu kommen. Z.b. erstmal in 1°-Schritten prüfen, ob ein Hindernis im Weg ist.
Auf jeden Fall musst du einen Parameter irgendwie festlegen, sonst ist das Problem nicht lösbar. Man kann auch eine Bedingung für die Bahnkurve definieren, z.B. eine maximale Höhe oder eine maximale Flugzeit.
Du brauchst auf jeden Fall neben Start- und Zielpunkt noch einen weiteren fest gewählten Parameter.

Denn du willst ja die Lösung einer Parabel berechnen und die hat bei Vorgabe von zwei Punkten nunmal zwei freie Parameter (z.B. einen x-Wert und einen y-Wert von einem weiteren Punkt auf der Kurve).

pest
2008-11-24, 11:52:51
die Holzhammermethode ist, über den Parameterbereich der Bahnkurve zu iterieren und zu schauen wann "es" ankommt.

Gast
2008-11-24, 11:55:33
Winkelberechnung über Tangens krieg ich ja hin. Genau diesen Weg hab ich ja ursprünglich mal versucht: der größte Winkel ist per sé eben da, wo die steilste Stelle zum Ausgang ist - in diesem Fall hier irgendwo im ersten Hügel. Soweit kein Problem. Aber der bringt mir ja nichts, wenn blau hinter diesem Hindernis noch höher liegt, dann muss der eben berechnete Winkel ja immer noch kleiner sein, als der der tatsächlich nötig ist, damit die Rakete im hohen Bogen und im richtigen - ggf großen - Winkel dort einschlägt.

Energien? Wenn ich mich richtig erinnere, müsste ich dafür doch Massen einführen, aber ist wirklich nötig?

Kannst ja vieles 1 setzen, muss ja nicht die Realität wiedergeben. Es ist halt sinnvoll, die Bewegung in X und Y-Richtung getrennt zu sehen. Wenn ich mich recht erinnere bleibt Vx immer gleich. Also musst du die Zeit berechnen, die das Geschoss in der Luft bleiben muss, um zu treffen. Für die Höhen musst du die Zeit, die zum Zurücklegen des Unterschieds gebraucht wird wieder abziehen.

Bin mir aber grad auch nicht so sicher...

Marscel
2008-11-24, 12:05:35
Also prinzipiell hab ich beim Wurf von einem Punkt zum anderen - wenn das Ziel höher liegt als der Ausgang - ein Schar von Kurven, korrekt?

Wenn mir dann doch die Bedingungen fehlen, bleibt mir übrig, ausgehend vom Mindeststartwinkel - der sich über die Steigung der Hindernisse halt berechnen lässt, die nötige Geschwindigkeit herauszufinden - und dann jeweils abklappern, ob da noch Hindernisse im Weg sind, die nicht anfangs erfasst werden konnten. Dass dann in Schritten von 1°, aber nicht 0° (im Kontext des Spiels hieße das senkrecht nach oben feuern).

EDIT: Melde später im Laufe des Tages wieder.

Spasstiger
2008-11-24, 12:24:24
Du kannst ja einfach den höchsten Punkt in der Landschaft in die Parabelgleichung einsetzen. Wenn du dann noch einmal den Startpunkt einsetzt und einmal den Zielpunkt, hast du ein Gleichungssystem. Die Lösungen des Gleichungssystem sind dann die gewünschten Parameter der gesuchten Parabelfunktion. Daraus die physikalischen Parameter zu berechnen (Wurfgeschwindigkeit, Wurfwinkel), ist quasi nur noch Formsache.
Sofern es keine Lösung innerhalb des zulässigen Parameterbereichs gibt - z.B. weil beide Figuren zu nahe an einem Hügel stehen und sich nicht gegenseitig treffen können - musst du über einen anderen Weg eine Lösung berechnen. Dann kannst du z.B. festlegen, dass die Flugbahn eine bestimmte Höhe erreichen soll. Diese Lösung trifft dann zwar auf ein Hindernis, das Hindernis wird aber abgetragen und irgendwann trifft man doch den Spieler.

Wenn du eine Maximalhöhe der Flugbahn festlegst, ergibt sich übrigens von ganz alleine die Abwurfgeschwindigkeit in vertikale Richtung aus dem Energieerhaltungsgesetz und das ohne eine Masse zu verwenden:
E_kin = 1/2*m*v^2
E_pot = m*g*h

Beides muss gleich sein
=> 1/2*m*v^2 = m*g*h
=> 1/2*v^2 = g*h
=> v = Wurzel(2*g*h)

h ist die Höhendifferenz zwischen Abwurfpunkt und maximaler Höhe der Flugbahn. g (die Fallbeschleunigung) ergibt sich aus dem Code, welcher generell die Flugbahn berechnet, wenn man einen Wurf tätigt.

/EDIT: Das v oben ist nur die Geschwindigkeit in vertikale Richtung. Man muss für die weitere Rechnung die Wurfgeschwindigkeit in Wurfrichtung in Abhängigkeit vom Winkel angeben. Auf jeden Fall hat man dann nur noch den Winkel als einzige Unbekannte in der Gleichung, somit kann der Winkel berechnet werden.

pest
2008-11-24, 12:43:41
Wenn du eine Maximalhöhe der Flugbahn festlegst, ergibt sich übrigens von ganz alleine die Abwurfgeschwindigkeit aus dem Energieerhaltungsgesetz und das ohne eine Masse zu verwenden:


Die Maximalhöhe ist doch vom Abschusswinkel abhängig
Epot=Ekin gilt doch aber nur, wenn ich senkrecht schieße, sonst wird die Kraft
die an dem Geschoss ansetzt in mehr als 1 Komponente zerlegt, oder meinst du das "g aus der Flugbahn berechnet"

Spasstiger
2008-11-24, 12:51:29
Die Maximalhöhe ist doch vom Abschusswinkel abhängig
Epot=Ekin gilt doch aber nur, wenn ich senkrecht schieße, sonst wird die Kraft
die an dem Geschoss ansetzt in mehr als 1 Komponente zerlegt, oder meinst du das "g aus der Flugbahn berechnet"
g ist die Fallbeschleunigung, also ein Modellparameter. Dieser muss irgendwo im bestehenden Code in irgendeiner Form vorgegeben sein.
Und die Wurfgeschwindigkeit ist bei solchen Spielen immer in Wurfrichtung.
Das Energieerhaltungssatz gilt dann genau so wie von mir oben ausgeführt.

Der Winkel ergibt sich aus der Rechnung.

Ich war übrigens schon ein Fan davon, Probleme über Energien zu berechnen. In der Schule habe ich das so gemacht und an der Uni in Experimentalphysik genauso. Wenn ich da an eine Gruppenübung zurückdenke, wo vorne ein Chinese an einer Aufgabe 20 Minuten rumgerechnet hat mit irgendwelcher Vektoranalysis, wo ich drei Zeilen "angewandter Energieerhaltungssatz" in meinen Aufzeichungen hatte, die genau zum selben Ergebniss führten. ;)

pest
2008-11-24, 12:57:55
Ich war übrigens schon ein Fan davon, Probleme über Energien zu berechnen. In der Schule habe ich das so gemacht und an der Uni in Experimentalphysik genauso. Wenn ich da an eine Gruppenübung zurückdenke, wo vorne ein Chinese an einer Aufgabe 20 Minuten rumgerechnet hat mit irgendwelcher Vektoranalysis, wo ich drei Zeilen in meinen Aufzeichungen hatte, die genau zum selben Ergebniss führten.

naja bewegungsgleichungen sind einfach flexibler, ich habe letztens auch ne aufgabe in biomechanik so gelöst, also über energieerhaltung

aber vielleicht steh ich ja echt grad aufm schlauch

wenn ich ein geschoss mit 50m/s senkrecht nach oben schieße ergibt das eine maximalhöhe von 127m.

wenn der abschusswinkel nun 10° statt 90° beträgt sicherlich nicht.

Spasstiger
2008-11-24, 13:02:09
wenn ich ein geschoss mit 50m/s senkrecht nach oben schieße ergibt das eine maximalhöhe von 127m.

wenn der abschusswinkel nun 10° statt 90° beträgt sicherlich nicht.
Ok, da war noch was. Es ergibt sich natürlich erstmal nur die Geschwindigkeit in vertikale Richtung. Man muss dann mit der Wurfgeschwindigkeit in Abhängigkeit vom Winkel weiterrechnen und so den Winkel bestimmen.

Werd das oben gleich noch anmerken.

Gast
2008-11-24, 13:11:11
naja bewegungsgleichungen sind einfach flexibler, ich habe letztens auch ne aufgabe in biomechanik so gelöst, also über energieerhaltung

aber vielleicht steh ich ja echt grad aufm schlauch

wenn ich ein geschoss mit 50m/s senkrecht nach oben schieße ergibt das eine maximalhöhe von 127m.

wenn der abschusswinkel nun 10° statt 90° beträgt sicherlich nicht.

Deswegen hab ich doch oben geschrieben, dass man die Bewegungen voneinander trennen muss. 10° entsprächen 10/90 der gesammt V, also der Vkin, welche Spasstiger in seiner Formel hatte, und schon kann mans wieder rechnen. Man berechnet also hiernach die Fluzeit über die 10/90 der V mit der Energieerhaltung und kann dann mit der Zeit Vx = 80/90 die Schussweite errechnen. Eventuelle Höhenunterschiede wie gesagt zur Flugzeit addieren (wenn Ziel niedriger) oder abziehen (wenn höher).

Spasstiger
2008-11-24, 13:23:25
Hier mal noch ein paar Formeln zur Berechnung von Wurfgeschwindigkeit und Winkel, wenn man eine bestimmte Höhe am Scheitelpunkt voraussetzt.
Bekannt seien:
Abwurfpunkt (0|0), Scheitelpunkt (...|ys), Zielpunkt (xz|yz)

Aus Energieerhaltungssatz:
v_vertikal = Wurzel(2*g*ys)

Dauer des Flugs:
t = sqrt(2*ys/g) + sqrt(2*(ys-yz)/g)

Daraus:
v_horizontal = xz/t

Winkel:
winkel = arctan(v_vertikal/v_horizontal)

Wurfgeschwindigkeit
v = sqrt(v_vertikal^2 + v_horizontal^2)

Gast
2008-11-24, 13:44:08
Hier mal noch ein paar Formeln zur Berechnung von Wurfgeschwindigkeit und Winkel, wenn man eine bestimmte Höhe am Scheitelpunkt voraussetzt.
Bekannt seien:
Abwurfpunkt (0|0), Scheitelpunkt (...|ys), Zielpunkt (xz|yz)

Aus Energieerhaltungssatz:
v_vertikal = Wurzel(2*g*ys)

Dauer des Flugs:
t = sqrt(2*ys/g) + sqrt(2*(ys-yz)/g)

Daraus:
v_horizontal = xz/t

Winkel:
winkel = arctan(v_vertikal/v_horizontal)

Wurfgeschwindigkeit
v = sqrt(v_vertikal^2 + v_horizontal^2)
Sach ich ja, X und Y Bewegung trennen und über die Flugzeit ;).
Das Problem bei der Aufgabe ist, dass man zuviele Parameter hat, welche es zu beachten gibt. Zur (einfachsten) Lösung ist es im Spiel demnach am Besten, wenn man die Energien und damit V begrenzt und berechnet, welcher Scheitelpunkt (Winkel) der höchst mögliche ist, um das Ziel zu treffen. So sollten auch die Hindernisse am ehsten weggerechnet werden können. Sie fallen halt raus, weil je steiler der Winkel, desto weniger wird ein Hinderniss in der Flugbahn sein. Ohne Begrenzung würde dann immer ein Winkel von 89,99999... rauskommen. Andersrum würde es auch gehen (also niedrigste Energie wählen), aber da werden die Winkel u.U. zu flach, was die Hindernisprobe nötig macht.

Actionhank
2008-11-24, 14:19:11
Man könnte ja auch aus Startpunkt und Endpunkt nen Dreieck bauen, so dass dessen obere Ecke zu Seiten ohne Kollision mit dem Gelände führt. Wenn ich das mit der Konvexität der Parabell richtig sehe, sollte die Wurfbahn immer "ausserhalb" des Dreiecks liegen, sofern der Wurf durch den oberen Punkt geht. Es muss nur geprüft werden, dass die Seiten nicht durchs Gelände gehen. Und die Parabel sollte wünschenswerterweise durch den Endpunkt gehen. Naja, so einfach ist das nicht, weil vielleicht nicht immer lösbar mit den 2 Punkten. Versuch einfach mal die Höhe des Dreiecks als nötige Höhe des Wurfs und den Endpunkt als Ziel zu nehmen. Also mit Energieansatz kommst du auf die Höhe und vx sollte halt so schnell sein, dass man in der Zeit ty von A zu B die Entfernung x zurücklegen kann.

Marscel
2008-11-24, 14:35:20
Danke für die Rege Beteiligung, hab gerade nur kurz Zeit, werde das nachher alles durchgehen. =)

Man könnte ja auch aus Startpunkt und Endpunkt nen Dreieck bauen, so dass dessen obere Ecke zu Seiten ohne Kollision mit dem Gelände führt. Wenn ich das mit der Konvexität der Parabell richtig sehe, sollte die Wurfbahn immer "ausserhalb" des Dreiecks liegen, sofern der Wurf durch den oberen Punkt geht. Es muss nur geprüft werden, dass die Seiten nicht durchs Gelände gehen. Und die Parabel sollte wünschenswerterweise durch den Endpunkt gehen. Naja, so einfach ist das nicht, weil vielleicht nicht immer lösbar mit den 2 Punkten.

Ja, so ein Dreieck war von Anfang an meine Idee, der Spieler hat auch so eine Art Hilfsdreieck, mit dem er Zielhilfe kriegen kann. Jedenfalls um das korrekte Dreieck zu bauen, braucht man entweder den richtigen Scheitelpunkt (die y-Koordinate, wenn X = Player.X + DX/2 ist) oder den richtigen - besser passenden - Winkel einer der beiden Geschütze, aber ich habe nichts von beidem.

pest
2008-11-24, 14:38:45
Deswegen hab ich doch oben geschrieben, dass man die Bewegungen voneinander trennen muss. 10° entsprächen 10/90 der gesammt V, also der Vkin, welche Spasstiger in seiner Formel hatte, und schon kann mans wieder rechnen.

das kann man m.M. nach nicht einfach linear runterrechnen.
man hat eine bewegungskomponente in x-richtung und eine in y-richtung.
das leiten wir schön ab, und dann hat man wahrscheinlich eh die allseits bekannten schulformeln...:D

Actionhank
2008-11-24, 14:39:19
Für die Konstruktion des Dreiecks brauchst du ja die Geländeinformation.
Kannst du nicht mit beiden Seiten bei 90 Grad anfangen und dann langsam den Winkel verringern bis du auf Gelände triffst? Dann kannst du den Schnittpunkt berechnen. Keine Ahnung, auf was du Zugriff hast.

Spasstiger
2008-11-24, 15:17:28
Hier noch eine weitere Hilfe:

Es sind drei Punkte der Flugbahn bekannt:
Startpunkt (0|0), beliebiger Zwischenpunkt (x1|y1), Zielpunkt (x2|y2)

Daraus ergeben sich für Wurfwinkel und Wurfgeschwindigkeit in Wurfrichtung folgende Werte:

Winkel =
/(x1 + x2) y1\
arctan|------------|
\ x2 x1 /

v =
(1/2)
/ / 2 2 \\
| |(x1 + x2) y1 ||
| y1 g |-------------- + 1||
| | 2 2 ||
(1/2) | \ x2 x1 /|
2 |- -------------------------| x1 x2
\ x1 x2 /
- -----------------------------------------------
2 y1

Mal frech mit Maple berechnet und rauskopiert. ;)
Dabei gehe ich von einem normalen Koordinatensystem aus, das nach rechts und nach oben größere Achsenwerte annimmt. Ein Winkel von 0° entspricht hier einem horizontalen Wurf nach rechts.

Als beliebigen Punkt (x1|y1) könntest du z.B. die höchste Stelle im Gelände zwischen den beiden den beiden Kontrahenten wählen oder den Berührpunkt des obigen Dreiecks mit dem Gelände. Bzw. Punkte leicht darüber, damit die Flugbahn nicht das Gelände vorzeitig berührt. ;)

Ich würde einfach mehrere Methoden implementieren und dann nacheinander die Methoden unsichtbar durchprobieren lassen. Beginnend mit der knappsten Methode und endend mit der großzügigsten Methode. Wenn alle Methoden versagen, reißt man halt mit einer der Methoden ein Loch in die Landschaft und bei den nächsten Versuchen arbeitet man sich mit den gleichen Werten durch die Landschaft durch.
Oder du wählst halt den Brute-Force-Ansatz und probierst alle Winkel und Geschwindigkeiten unsichtbar durch bis es einen Treffer gibt.

Die Optimallösung wäre ein Schnitt der Parabelgleichung der Flugbahn mit der Kurvengleichung der Landschaft. Eine Lösung ist dann gefunden, wenn es genau zwei Schnittpunkte gibt, nämlich beim Abwurfpunkt und beim Ziel. Wenn aber keine Lösung zu erlaubten Parametern - d.h. einer zulässigen Geschwindigkeit - führt, muss man sich definitiv durch die Landschaft durcharbeiten. Und da müsste man dann optimalerweise den kürzesten Weg durch die Landschaft ermitteln.
Diese Optimallösung ist zwar mit dem richtigen mathematischen Know How durchaus umsetzbar und vermutlich auch deutlich performanter als die Brute-Force-Lösung, aber dürfte den gewünschten Rahmen wohl doch ein wenig sprengen.
Die KI soll ja nicht den Anschein erwecken, Raketenwissenschaftler zu sein. ;)

Marscel
2008-11-24, 19:58:56
Vielen Dank für all eure Mithilfe soweit, danke für die Formeln, Spasstiger.

Ich werde mal das Annäherungsverfahren von Winkel zu Geschwindigkeit versuchen, wenn sich das als unpraktikabel erweist, das maximalmögliche Absenken der beiden Winkel. Und wenn dann immer noch Experimentierbedarf besteht, ein paar Punkte in die Formeln einsetzen und sehen, was rauskommt.

huha
2008-11-24, 20:05:38
Ich will euch ja nicht den Spaß verderben, aber die Wikipedia (http://de.wikipedia.org/wiki/Schiefer_Wurf) ist eine ordentliche Quelle für die Formeln, die du brauchen wirst. ;)

-huha

Marscel
2008-11-27, 11:49:12
Ok, habe mich an die Errechnung des Mindeswinkels gemacht, die funktioniert eigentlich auch soweit, bis auf einen Fall, der mir nicht klar wird.

http://pcreact.de/3dc/tangens.jpg

Wie in der Abbildung zu sehen, wenn Rot vor einer deutlich höheren Wand steht und darauf noch eine Steigung folgt, kommt mir der Winkel spanisch vor.

Tatsächlich ist der Winkel von der roten Linie nötig, um nicht von vornherein in den Felsen zu fliegen, oder? Der größte Tanges-Betrag führt aber zu dem Punkt Grün mir Rosalinie, die aber den Felsen schneidet. Die Message-Box enthält für die Pixel 0 bis 50 nach rechts vom roten Gelenk die dazugehörigen Tangens-Werte. Ja, ich seh der höchste errechnete Wert ergibt umgerechnet einen nötigen Winkel von 62°, bis zur Kante sind es bloß 60° -> aber dennoch scheint mir 62°C graphisch gesehen nicht richtig.

Mach ich einen Denkfehler?

Und ja: bevor irgendwer unkt, es handelt sich um dieses (http://www.riemers.net/eng/Tutorials/XNA/Csharp/series2d.php) XNA-Tutorial, ich bin nur dabei es groß zu erweitern. ;)