robocode:target-linear-1
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
robocode:target-linear-1 [2015/03/16 16:49] – angelegt rothe | robocode:target-linear-1 [2020/10/13 14:25] (aktuell) – Externe Bearbeitung 127.0.0.1 | ||
---|---|---|---|
Zeile 2: | Zeile 2: | ||
Wenn sich der gegnerische Roboter bewegt, befindet er sich nicht mehr am gleichen Ort, wenn das Geschoss diesen erreicht. Ein Ansatz ist, auszurechnen, | Wenn sich der gegnerische Roboter bewegt, befindet er sich nicht mehr am gleichen Ort, wenn das Geschoss diesen erreicht. Ein Ansatz ist, auszurechnen, | ||
+ | |||
+ | {{robocode.pdf|Die Mathematik}} (PDF) | ||
<code java> | <code java> | ||
public void onScannedRobot(ScannedRobotEvent e) { | public void onScannedRobot(ScannedRobotEvent e) { | ||
- | double | + | |
- | double | + | final double ROBOT_WIDTH = 16.0; |
- | double | + | final double ROBOT_HEIGHT = 16.0; |
- | | + | |
- | | + | double headingToRobot = getHeading() + e.getBearing(); |
+ | // Bekannte Werte bestimmen | ||
+ | double | ||
+ | double yB = getY(); | ||
+ | double vB = Rules.getBulletSpeed(FIREPOWER); | ||
+ | double xE = xB + e.getDistance() * Math.sin(Math.toRadians(headingToRobot)); | ||
+ | double yE = yB + e.getDistance() * Math.cos(Math.toRadians(headingToRobot)); | ||
+ | double vE = e.getVelocity(); | ||
+ | double phiE = e.getHeading(); | ||
+ | // Konstanten A bis D bestimmen | ||
+ | double A = (xE - xB) / vB; | ||
+ | double | ||
+ | double C = (yE - yB) / vB; | ||
+ | double D = vE / vB * Math.cos(Math.toRadians(phiE)); | ||
+ | // Koeffizienten fuer quadratische Gleichung bestimmen | ||
+ | double a = A*A + C*C; | ||
+ | double b = 2*(A*B + C*D); | ||
+ | double c = B*B + D*D - 1; | ||
+ | | ||
+ | double d = b*b - 4*a*c; | ||
+ | if (d < 0) { | ||
+ | // Keine Loesung vorhanden, Ende | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | // Loesungen bestimmen | ||
+ | double t1 = 2*a / (-b + Math.sqrt(d)); | ||
+ | double t2 = 2*a / (-b - Math.sqrt(d)); | ||
+ | // Kleinste nicht negative Loesung suchen | ||
+ | double t = 0; | ||
+ | | ||
+ | t = Math.min(t1, | ||
+ | } | ||
+ | else if (t1 >= 0) { | ||
+ | t = t1; | ||
+ | } | ||
+ | else if (t2 >= 0) { | ||
+ | t = t2; | ||
+ | } | ||
+ | else { | ||
+ | // keine positive Loesung | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | // Zukuenftige Koordinaten des Gegners bestimmen | ||
+ | double x = xE + vE * t * Math.sin(Math.toRadians(phiE)); | ||
+ | double y = yE + vE * t * Math.cos(Math.toRadians(phiE)); | ||
+ | // Gegner kann Spielfeld nicht verlassen | ||
+ | x = Math.max(ROBOT_WIDTH, | ||
+ | y = Math.max(ROBOT_HEIGHT, | ||
+ | double aimAt = Math.toDegrees(Math.atan2(x - xB, y - yB)); | ||
+ | turnGunRight(Utils.normalRelativeAngleDegrees(aimAt - getGunHeading())); | ||
+ | | ||
} | } | ||
</ | </ | ||
robocode/target-linear-1.1426520947.txt.gz · Zuletzt geändert: 2020/10/13 14:25 (Externe Bearbeitung)