所以我似乎无法找到答案,但我正试图将子弹射入一个圆圈。我有一个简单的循环路径类,我将它附加到子弹上,当给定时间值时,它会从该类中读取位置。子弹只是增加这个时间值,不断更新它的位置到下一个。这可以改进,但直到我弄清逻辑,这就是我所拥有的。我知道这种方法有效,因为我用线性路径尝试过。问题是将其应用于圆形路径。
我希望子弹以给定的半径和速度围绕一个点(比如点“中心”)旋转。无论圆的半径如何,我都希望所有子弹都以相同的速度行进,因此较大的圆比较短的圆需要更长的时间才能完成。目前正在发生的事情是我有 CircularPath 对象给出说 x = r * cos(t) 和 y = r * sin (t) 其中 t 以弧度为单位,但这会形成一个随着半径增加而速度增加的圆,并且这个圆的半径和中心是完全关闭的。子弹从正确的位置开始,除了半径和速度关闭。我希望我能充分描述这一点。我将发布代码供任何人检查。
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);
}
}