所以我似乎无法找到答案,但我试图将子弹射入一个圆圈。我有一个圆形路径的简单类,我附加到子弹,当给定时间值时,它从该类读取一个位置。子弹只是递增此时间值,不断更新其位置到下一个。这可以改进,但直到我得到逻辑,这就是我所拥有的。我知道这种方法有效,因为我尝试使用线性路径。问题是将它应用于循环路径。
我希望子弹围绕一个点(比如Point'Center')以给定的半径和速度旋转。我希望所有子弹以相同的速度行进,无论圆的半径如此,因此较大的圆圈比较短的圆圈需要更长的时间才能完成。目前发生的事情是我有一个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);
}
}
答案 0 :(得分:1)
x = r * cos(t/r)
y = r * sin(t/r)
答案 1 :(得分:1)
另一个解决方案是对2d动量进行建模,并对你想要移动物体绕轨道运行的中心点(或更普遍的椭球焦点)施加“重力”。
(经典的太空战争游戏是在一台机器上实现的,它太慢而无法实时处理三角计算,因此他们为重力场的x和y分量预先计算了一个二维数组;然后他们可以只进行一次表格查找根据船舶的最后位置,并用它来更新其动力,然后用它来更新它的位置。较慢的机器迫使更聪明的解决方案。)