Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Области Вороного (https://javascript.ru/forum/misc/33706-oblasti-voronogo.html)

schmetterling 07.12.2012 12:16

cyber, в случае, если у вас шарик будет соприкасаться с углом, вам нужно считать расстояние между центром и углом) И проверять, не меньше ли оно радиуса.

cyber 07.12.2012 20:39

нет все таки не разобрался)
если брать углы за окружность
<!DOCTYPE HTML>
<html>
  <head> </head>
  <body>
  <canvas width="500" height="500"></canvas>
    <script>

      var canva = document.body.children[0];
      
      var ctx = canva.getContext("2d");

var block = {
      
   
        width:150,
        height:30,
        
        Draw: function (x, y) {
          
          ctx.beginPath();
           ctx.fillStyle = "green";
          ctx.fillRect(x,y,this.width, this.height);
          this.y = y;
          this.x = x;
          
        boundary();
       
        }
      
        
      };
  block.Draw(150,100);   
      
      function boundary() {
      
        var rad = 20;
         
        ctx.beginPath();
     
        ctx.moveTo(block.x,block.y - rad);
        ctx.lineTo(block.x + block.width , block.y - rad);
        ctx.stroke();
        
        ctx.beginPath();
     
        ctx.moveTo(block.x+ block.width + rad,block.y);
        ctx.lineTo(block.x+ block.width + rad , block.y + block.height);
        ctx.stroke();
        
       ctx.beginPath();
     
        ctx.moveTo(block.x, block.y + block.height + rad);
        ctx.lineTo(block.x + block.width , block.y + block.height + rad);
        ctx.stroke();
        
        
        ctx.beginPath();
     
        ctx.moveTo(block.x-  rad,block.y);
        ctx.lineTo(block.x - rad , block.y + block.height);
        ctx.stroke();
        
      ctx.beginPath();
        ctx.fillStyle = "blue";
      ctx.moveTo(block.x,block.y);
      ctx.arc(block.x,block.y, rad,(Math.PI / 180)* -90, (Math.PI / 180)* -180, true);
       ctx.fill();
          
        ctx.beginPath();
        ctx.fillStyle = "blue";
      ctx.moveTo(block.x +block.width,block.y);
      ctx.arc(block.x +block.width, block.y, rad,(Math.PI / 180)* -90, (Math.PI / 180)* 0, false);
       ctx.fill();  
          
          ctx.beginPath();
        ctx.fillStyle = "blue";
      ctx.moveTo(block.x + block.width, block.y + block.height);
      ctx.arc(block.x + block.width, block.y + block.height, rad,(Math.PI / 180)* 0, (Math.PI / 180)* 90, false);
       ctx.fill();
          
          ctx.beginPath();
        ctx.fillStyle = "blue";
            ctx.moveTo(block.x ,block.y + block.height);
           ctx.arc(block.x ,block.y + block.height, rad,(Math.PI / 180)* 180, (Math.PI / 180)* 90, true);
  ctx.fill();    
      
      }


    </script>

  </body>
</html>

расчитывать пересечение двух окружностей , то возникает проблема когда шарик на шаге n не пересекается с окружностью , а на шаге n+1 он нужен дальше окружности..
проверял так
var d = (x - block.x)*(x - block.x) + (y - block.y + block.height) * (y - block.y + block.height);
      if(d < (ball.R + ball.R ) * (ball.R + ball.R) &&  d > (ball.R - ball.R) * (ball.R - ball.R))

и блин не как не могу понять как автор этой статьи так просто расчитывает пересечения с углами

cyber 07.12.2012 20:49

Цитата:

Сообщение от schmetterling (Сообщение 220038)
cyber, в случае, если у вас шарик будет соприкасаться с углом, вам нужно считать расстояние между центром и углом) И проверять, не меньше ли оно радиуса.

если бы прочитал бы этот коммент на пол часа раньше, то не ломал бы голову пол часа, но в итоге сам дошел)
Кстати арканоид хороший способ подучить геометрию))
П.с сор что туплю, понимаю что достал уже)

schmetterling 08.12.2012 00:19

Цитата:

Сообщение от cyber
П.с сор что туплю, понимаю что достал уже)

Да всё норм)

cyber 10.12.2012 21:37

schmetterling,хм, запутался.
Так как расчитываю координаты следущие, то если шарик залетает на блок нужно уменьшать растояние до того на котором он только столкнется , а не пересечет и не могу найти как определить ту точку в которой он будет сталкиваться а не пересекать(проблема только с углами)?

schmetterling 10.12.2012 23:06

cyber, ну вы же координаты последующие как-то вычисляете? Вот и проверяете каждый раз пересечение круга и блока для вычисленных координат. Если пересеклись -- значит, текущая точка и есть точка столкновения.

cyber 10.12.2012 23:18

schmetterling,можно на ты ?
я делаю так:
что бы найти растояние до нужной точки я от радиуса отнимаю растояние между точками В и А и прибавляю его к А.

но работает как то не так...

schmetterling 11.12.2012 01:12

Цитата:

Сообщение от cyber
schmetterling,можно на ты ?

Да, конечно)

Цитата:

Сообщение от cyber
что бы найти растояние до нужной точки

Это можно, но сложно. Зачем? Просто проверяй вычисленные координаты на столкновение.

cyber 11.12.2012 02:50

schmetterling, не совсем понял.
Если новые координаты внутри блока, а если отразить раньше то сильно заметно..

Дзен-трансгуманист 11.12.2012 16:27

В общем набросал кое-что, но сюда код не помещается, поэтому кладу на дропбокс: Collisions.
Управление:
стрелочки - перемещение шарика
WSAD - поворот и изменение длины вектора движения

Иногда шарик проходит углы насквозь. Иногда даже зависает.
Писать красиво и модульно мне было некогда, поэтому говнокод.

В данный момент только статическая трассировка, может в другой раз заставлю картинку двигаться самостоятельно.


Часовой пояс GMT +3, время: 16:44.