atan2-查找两点之间的角度(360度)

时间:2018-09-15 11:02:58

标签: java angle java-2d atan2

我有一个游戏,其中有一个$form->field($model, 'oFacilities')->checkboxList(Facility::forWidget(),[ 'item' => function($index, $label, $name, $checked, $value) { $checked = $checked ? 'checked' : ''; return "<label class='checkbox col-md-4' style='font-weight: normal;'><input type='checkbox' {$checked} name='{$name}' value='{$value}'>{$label}</label>"; } ]) 和一些Player。这些敌人,就像玩家自己一样,可以射击enemies。但是,bullets的项目符号并没有发生改变。新创建的子弹应该在自身和玩家之间找到一个角度,然后朝那个方向走-这必须在angle中完成。

我遵循了this answer,但是我认为我做错了什么。

因为发生这种情况:
enter image description here

这应该是这样的:
enter image description here

目前只能这样:
enter image description here

这是代码的一部分,用于处理项目符号的X和Y:

360°

如何使angle = Math.atan2(Game.getPlayerY(), Game.getPlayerX()) - Math.atan2(getY(), getX()); if (angle < 0) angle += 2 * Math.PI; setX((getX()+(float)(Math.sin(angle)))-Config.BulletSpeed); setY((getY()+(float)(Math.cos(angle)))-Config.BulletSpeed); 倾斜一定角度?

2 个答案:

答案 0 :(得分:1)

老实说,我认为您使用角度过于复杂了。您似乎想要做的就是以给定的速度沿着两个对象之间的向量移动子弹。

您要做的就是标准化向量。两者之间的线的长度由下式给出:

double dx = Game.getPlayerX() - getX();
double dy = Game.getPlayerY() - getY();
double len = Math.hypot(dx, dy);

因此您可以使用它来计算子弹速度的比例因子:

double s = Config.BulletSpeed / len;

然后在表达式中使用它来更新x和y:

setX((getX()+dx*s);
setY((getY()+dy*s);

答案 1 :(得分:1)

我同意安迪的回答;您实际上只需要两点之间的归一化向量,而不是角度。但是,如果需要成一个角度,则只需在两点之间形成向量,然后使用Math.atan2

let velocity = new Vector(target.x - source.x, target.y - source.y);
let angle = Math.atan2(velocity.y, velocity.x);

然后,如果需要从源到目标的x或y步,normalize向量,然后仅使用velocity.xvelocity.y

// normalize
let magnitude = Math.sqrt(velocity.x*velocity.x + velocity.y*velocity.y);  // distance formula for length of vector
velocity.x /= magnitude;
velocity.y /= magnitude;

// scaled to speed you want
velocity.x *= SPEED;
velocity.y *= SPEED;

您不需要从矢量的角度导出矢量。

编辑:正如Topaco在评论中指出的那样,要添加逼真的触摸效果,请将源速度添加到最终速度:

velocity.x += source_velocity.x
velocity.y += source_velocity.y