1

So I can't seem to find an answer to this, but I am trying to fire bullets into a circle. I have a simple class for a circular path that I attach to a bullet and it reads from that class a position when given a time value. The bullet simply increments this time value, constantly updating its position to the next. This can be improved but until I get the logic down this is what I have. I know this method works because I tried it with a linear path. The problem is applying it to a circular path.

I want the bullet to circle around a point (say Point 'Center') with a given radius and speed. I want all bullets to travel at the same speed no matter the radius of the circle so a larger circle will take longer to complete than a shorter one. Currently what is happening is I have the CircularPath object giving saying x = r * cos(t) and y = r * sin (t) where t is in radians, but this is making a circle that increases in speed as the radius increases and the radius and center of this circle is completely off. The bullets are starting in the correct position, except the radius and speeds are off. I hope I am describing this adequately. I will post the code for anyone to inspect.

package io.shparki.tetris.go;

import io.shparki.tetris.util.Point2D;

import java.awt.Color;
import java.awt.Graphics2D;

public class CircularPath extends Path{


private  double radius;

// Where Start is the center and end is the location of mouse
// Radius will be distance between the two
public CircularPath(Point2D start, Point2D end) {
    super(start, end);
    radius = normalToEnd.getLength();

    color = Color.YELLOW;
}

public Point2D getPointAtTime(double time){
    double px = start.getX() + radius * Math.cos(Math.toRadians(time));
    double py = start.getY() - radius * Math.sin(Math.toRadians(time));
    return new Point2D(px, py);
}
public double getFinalTime() { return 0; }
public CircularPath getClone() { return new CircularPath(start.getClone(), end.getClone()); }

public void update(){
    super.update();

    radius = normalToEnd.getLength();
}
public void render(Graphics2D g2d){
    super.render(g2d);

    g2d.drawLine((int)start.getX(), (int)start.getY(), (int)end.getX(), (int)end.getY());
    //g2d.drawOval((int)(start.getX() - radius), (int)(start.getY() - radius), (int)radius * 2, (int)radius * 2);
}

}

matt murray
  • 233
  • 2
  • 12

2 Answers2

1
x = r * cos(t/r)
y = r * sin(t/r)
Edward Doolittle
  • 4,002
  • 2
  • 14
  • 27
  • that makes them all just fly upwards; I still want the projectiles to move in a circle just at a consistent speed and at the correct center and radius; – matt murray May 21 '15 at 20:38
  • @Matt: This is the correct answer. Why would they just fly upwards when it is clearly changing the value of x? Are you sure you implemented it correctly? – Phil Anderson May 21 '15 at 22:24
  • I'm looking into the rest of my code; I think My projectiles are firing differently than they should but thank you! – matt murray May 21 '15 at 22:31
1

The other solution is to model 2d momentum and impose a "gravitational force" toward the center point (or ellipsoidal focus, more generally) that you want the moving object to orbit around.

(The classic Space Wars game was implemented on a machine too slow to handle the trig computations in realtime, so they precomputed a 2d array each for the x and y components of the gravity field; they could then just do a table lookup based on the ship's last position and use that to update its momentum, which was then used to update its position. Slower machines forced more clever solutions.)

keshlam
  • 7,931
  • 2
  • 19
  • 33