Нахождение разницы между и вектора и точка-точка в p5 - PullRequest
0 голосов
/ 08 марта 2020

У меня есть enemies, которые стоят в определенном направлении, обозначенном жирной черной линией. Я хотел бы создать «конус вида», который регистрируется, когда мышь входит в него.

Вот мой код:

  canSeeMouse(){

    stroke("#000000");
    strokeWeight(4);

    // Get a point 60px from the enemy, in the direction it is looking
    let lookingAt = p5.Vector.fromAngle(this.a).mult(60).add(this.p);
    // Draw a line for debugging.
    line(this.p.x, this.p.y, lookingAt.x, lookingAt.y);


    // Get the angle between this position and the players
    let toPlayer = Math.atan2(player.p.y - this.p.y, player.p.x - this.p.x);

    // if the angle from this to the player minus the angle this character is looking at is more than PI/4, stop
    if(Math.abs( toPlayer - this.a )  > (Math.PI/4)){
      return false;
    }
    if(this.p.dist(player.p) > 30){
      return false;
    }
    // Draw the sight line
    strokeWeight(1);
    stroke("#ffaaaa");
    line(this.p.x, this.p.y, player.p.x, player.p.y);
  }

А вот демо: https://codepen.io/EightArmsHQ/pen/9ef2e8266f4cfb14b4ac177c135908b4?editors=0010

Моя проблема, я получаю нерегулярно результаты:

Illustration

Правый верхний и нижний левый верны, два других показывают неправильный вид-конус.

Я думал что это было из-за того, что один угол был между 0 и Math.PI*2, а другой - из величины смещения, поэтому попытался использовать такие вещи:

if(Math.abs( toPlayer%(Math.PI*2) - this.a%(Math.PI*2) )  > (Math.PI/4)){

Но это не так ... Я также попытался изменить порядок вычитания:

if(Math.abs( this.a - toPlayer )  > (Math.PI/4)){

Но это тоже не помогло. Я не могу понять, какую часть моего уравнения я делаю неправильно.

1 Ответ

1 голос
/ 08 марта 2020
if(Math.cos( toPlayer - this.a) >  Math.cos(Math.PI / 4))

решает все проблемы с порядком и с переходом через ноль

...