@Afafks123132132165

Почему данный код работает неправильно?

Почему лучи не сталкиваются с гранью квадрата?

код
<!DOCTYPE html>
<html>
<head>
<title>Game</title>
</head>
<body>
<canvas id="canvas" width="320" height="320"></canvas>
<style type="text/css">
#canvas{
border:1px solid black;
}
</style>
<script type="text/javascript">
document.getElementById("canvas");
var ctx = canvas.getContext("2d");

x = 160;
y = 160;
rays = [];
blocks = [];
for(i = 0;i < 20;i++){
  rays.push({x:0,y:0,radius:0,qq:0,angle:i,raysa:0});
}
blocks.push({x:199,y:170});

function draw(){
  ctx.clearRect(0,0,320,320);
  for(i in rays){
    rays[i].raysa = 0;
    for(j = 0;j < 1000;j++){
      rays[i].x = Math.cos(rays[i].angle/180*Math.PI) * rays[i].raysa + x;
      rays[i].y = Math.sin(rays[i].angle/180*Math.PI) * rays[i].raysa + y;
      for(q in blocks){
        if(rays[i].x == blocks[q].x && rays[i].y >= blocks[q].y && rays[i].y <= blocks[q].y + 32){
          rays[i].qq = 1;
        }else{
          rays[i].qq = 0;
        }
      }
      if(rays[i].qq == 0){
        rays[i].raysa+=1;
      }
    }
    ctx.beginPath();
    ctx.moveTo(x,y);
    ctx.lineTo(rays[i].x,rays[i].y);
    ctx.stroke();
    rays[i].angle+=2;
  }
  for(i in blocks){
    ctx.strokeRect(blocks[i].x,blocks[i].y,32,32);
  }
}

setInterval(draw,20);
</script>
</body>
</html>


пример на jsfiddle
  • Вопрос задан
  • 198 просмотров
Решения вопроса 1
lastuniverse
@lastuniverse
Всегда вокруг да около IT тем
Вы неверно написали условие

у вас:
rays[i].x == blocks[q].x && rays[i].y >= blocks[q].y && rays[i].y <= blocks[q].y + 32


должно быть:
rays[i].x>=blocks[q].x && rays[i].x <= blocks[q].x + 32 && rays[i].y >= blocks[q].y && rays[i].y <= blocks[q].y + 32


Ну а бонусом ловите рабочий вариант:
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
twobomb
@twobomb
Странный способ, но предложу свой вариант.

P.S. Просто у вас он странно работает, точность зависит от количества циклов, но даже на 1000 циклов явно видно как линии "залазят" на квадраты.
P.P.S. По колизиям можно тут алгоритмы взять.
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Потому что строгое равенство не используют для вещественных чисел из-за проблем с точностью их компьютерного представления.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы