Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #41 (permalink)  
Старый 11.12.2012, 23:35
Аватар для Дзен-трансгуманист
√₋̅₁̅
Отправить личное сообщение для Дзен-трансгуманист Посмотреть профиль Найти все сообщения от Дзен-трансгуманист
 
Регистрация: 18.06.2012
Сообщений: 385

cyber,
Ты не понял, я говорю о том, что векторной алгеброй можно было бы многое сократить и ускорить в моем примере. А писать что-то или переписывать я уже не буду, надоело.
__________________

Гейзенберг, возможно, читал этот тред.

Последний раз редактировалось Дзен-трансгуманист, 11.12.2012 в 23:44.
Ответить с цитированием
  #42 (permalink)  
Старый 11.12.2012, 23:36
Аватар для Дзен-трансгуманист
√₋̅₁̅
Отправить личное сообщение для Дзен-трансгуманист Посмотреть профиль Найти все сообщения от Дзен-трансгуманист
 
Регистрация: 18.06.2012
Сообщений: 385

Сообщение от cyber
но как найти нормаль я так и не понял..
Кстати, я не рассказал, как её определить. Если прямая задана двумя точками (x1,y1) и (x2,y2), то вектор нормали (ненормированый) легко определяется вот так:



Отличие моего кода в том, что у меня нормали левосторонние, так как фигуры у меня определяются по часовой стрелке.
__________________

Гейзенберг, возможно, читал этот тред.

Последний раз редактировалось Дзен-трансгуманист, 11.12.2012 в 23:40.
Ответить с цитированием
  #43 (permalink)  
Старый 11.12.2012, 23:39
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 17.12.2011
Сообщений: 4,415

Дзен-трансгуманист, видел, но не понял.
мне нужно y1-y2 / (x2-x1)?
__________________
Цитата:
Если ограничения и условия описываются как "коробка", то хитрость в том что бы найти именно коробку... Не думайте о чем то глобальном - найдите коробку.
Ответить с цитированием
  #44 (permalink)  
Старый 11.12.2012, 23:51
Аватар для Дзен-трансгуманист
√₋̅₁̅
Отправить личное сообщение для Дзен-трансгуманист Посмотреть профиль Найти все сообщения от Дзен-трансгуманист
 
Регистрация: 18.06.2012
Сообщений: 385

cyber,
Круглые скобки там - это просто описание компонент вектора. Так еще матрицы описываются.
x = y1-y2
y = x2-x1

Лучше пойди выспись и перечитай тот пост с утра на свежую голову, а то я всю ночь тут тебе объяснять буду... Всё, умаялся я уже.
__________________

Гейзенберг, возможно, читал этот тред.

Последний раз редактировалось Дзен-трансгуманист, 12.12.2012 в 00:00.
Ответить с цитированием
  #45 (permalink)  
Старый 12.12.2012, 15:21
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 17.12.2011
Сообщений: 4,415

Дзен-трансгуманист, да, чет по вечерам у меня включается режим тормоз))
Зная х и у , можно получить угол нормали через теорему косинусов...
__________________
Цитата:
Если ограничения и условия описываются как "коробка", то хитрость в том что бы найти именно коробку... Не думайте о чем то глобальном - найдите коробку.

Последний раз редактировалось cyber, 12.12.2012 в 15:28.
Ответить с цитированием
  #46 (permalink)  
Старый 12.12.2012, 15:33
Аватар для Дзен-трансгуманист
√₋̅₁̅
Отправить личное сообщение для Дзен-трансгуманист Посмотреть профиль Найти все сообщения от Дзен-трансгуманист
 
Регистрация: 18.06.2012
Сообщений: 385

cyber,
Если угол все-таки нужен, то Math.atan2.
__________________

Гейзенберг, возможно, читал этот тред.
Ответить с цитированием
  #47 (permalink)  
Старый 12.12.2012, 15:37
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 17.12.2011
Сообщений: 4,415

Дзен-трансгуманист, вот блин, как я мог пропустить такую полезную функцию....
__________________
Цитата:
Если ограничения и условия описываются как "коробка", то хитрость в том что бы найти именно коробку... Не думайте о чем то глобальном - найдите коробку.
Ответить с цитированием
  #48 (permalink)  
Старый 12.12.2012, 15:56
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 17.12.2011
Сообщений: 4,415

ну вот как то так)
function reflect(dx,dy){
      
       var power = Math.sqrt(dx*dx + dy*dy); // сила=корень из (dx*dx + dy*dy)
      
      var sinDrop = dy/power; //sin(угла падения) = dy / сила
      var cosDrop = dx/power; //cos(угла падения) = dx / сила
   
      
      var normal = Math.atan2(wall.x - ball.x, ball.y - wall.y);
      
      var sinL = Math.sin(normal) * cosDrop - Math.cos(normal) * sinDrop; //sin(L)=sin(Нормали)*cos(падения)-cos(Нормали)*sin(падения);
      
  var cosL =  Math.cos(normal) * cosDrop + Math.sin(normal) * sinDrop;   //cos(L)=cos(Нормали)*cos(падения)+sin(Нормали)*sin(падения);
      
 var reflSin = sinL * Math.cos(normal) + cosL * Math.sin(normal);     //sin(отражения)=sin(L)*cos(Нормали)+cos(L)*sin(Нормали);
      var reflCos = cosL * Math.cos(normal) - sinL * Math.sin(normal); //cos(отражения)=cos(L)*cos(Нормали)-sin(L)*sin(Нормали);    
      
      dx = Math.cos(reflCos) * power; //dx = cos(угол)*сила
      dy = Math.sin(reflSin) * power; //dy = sin(угол)*сила
      
        return {
          dx:dx,
          dy:dy
        }
      };


<!DOCTYPE HTML>
<html>
  <head> </head>
  <body>
    <canvas width="500" height="500"></canvas>
    <script>
var canv = document.body.children[0];
     var ctx = canv.getContext("2d");
      
      var ball = {
        x:80,
        y:170,
        R:20,
        Draw: function (x,y){
        
        ctx.clearRect(this.x - this.R, this.y - this.R, this.R *2,this.R *2);
          
        ctx.beginPath();
        ctx.fillStyle = "red";
       
        ctx.arc(x,y,ball.R,0, (Math.PI/180)* 360, false);
        ctx.fill();
        }
        
      
      }; 
      
      var wall = {
       
        x:100,
        y:100,
        width:100,
        height:50,
        Draw:function() {
         
         
     
        ctx.beginPath();
        ctx.fillStyle = "green";
         ctx.fillRect(wall.x,wall.y,wall.width,wall.height);
         
        }
      };
      
     
      ball.Draw(ball.x, ball.y, false);
      wall.Draw();
      
      var dx = 10, dy = 10;
      
      var ref = reflect(dx,dy);
     
      
      ball.Draw(ball.x + ref.dx,ball.y + ref.dy);
      
function distance(x1,y1,x2,y2){

return Math.sqrt(Math.pow(x2-x1,2) + Math.pow(y2-y1,2));

};
      
      function reflect(dx,dy){
      
       var power = Math.sqrt(dx*dx + dy*dy); // сила=корень из (dx*dx + dy*dy)
      
      var sinDrop = dy/power; //sin(угла падения) = dy / сила
      var cosDrop = dx/power; //cos(угла падения) = dx / сила
      
      var nx = wall.x - ball.x;
      var ny = ball.y - wall.y;
      
      var normal = Math.atan2(nx,ny);
      
      var sinL = Math.sin(normal) * cosDrop - Math.cos(normal) * sinDrop; //sin(L)=sin(Нормали)*cos(падения)-cos(Нормали)*sin(падения);
      
  var cosL =  Math.cos(normal) * cosDrop + Math.sin(normal) * sinDrop;   //cos(L)=cos(Нормали)*cos(падения)+sin(Нормали)*sin(падения);
      
 var reflSin = sinL * Math.cos(normal) + cosL * Math.sin(normal);     //sin(отражения)=sin(L)*cos(Нормали)+cos(L)*sin(Нормали);
      var reflCos = cosL * Math.cos(normal) - sinL * Math.sin(normal); //cos(отражения)=cos(L)*cos(Нормали)-sin(L)*sin(Нормали);    
      
      dx = Math.cos(reflCos) * power; //dx = cos(угол)*сила
      dy = Math.sin(reflSin) * power; //dy = sin(угол)*сила
      
        return {
          dx:dx,
          dy:dy
        }
      }      
    </script>

  </body>
</html>
__________________
Цитата:
Если ограничения и условия описываются как "коробка", то хитрость в том что бы найти именно коробку... Не думайте о чем то глобальном - найдите коробку.

Последний раз редактировалось cyber, 12.12.2012 в 15:58.
Ответить с цитированием
  #49 (permalink)  
Старый 12.12.2012, 15:58
Аватар для Дзен-трансгуманист
√₋̅₁̅
Отправить личное сообщение для Дзен-трансгуманист Посмотреть профиль Найти все сообщения от Дзен-трансгуманист
 
Регистрация: 18.06.2012
Сообщений: 385

cyber,
Там в статье написано, что углы отсчитываются против часовой стрелки, но здесь имеется ввиду традиционное представление координат, как на обычных графиках, когда игрек направлен вверх. В экранных же координатах, как и на канвасе, игрек направлен вниз, поэтому угол тут возрастает по часовой стрелке.
__________________

Гейзенберг, возможно, читал этот тред.

Последний раз редактировалось Дзен-трансгуманист, 12.12.2012 в 16:20.
Ответить с цитированием
  #50 (permalink)  
Старый 12.12.2012, 16:20
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 17.12.2011
Сообщений: 4,415

Сообщение от Дзен-трансгуманист
Там в статье написано,
чет не могу найти такого , но не важно , я вроде понял к чему ты клонишь.
Сообщение от Дзен-трансгуманист
В экранных же координатах, как и на канвасе, игрек направлен вниз, поэтому тут угол возрастает по часовой стрелке.
т.е y нужно отнимать , а не прибавлять?
__________________
Цитата:
Если ограничения и условия описываются как "коробка", то хитрость в том что бы найти именно коробку... Не думайте о чем то глобальном - найдите коробку.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как изменить цвет области скрипта? Wonder Land Общие вопросы Javascript 0 05.02.2012 06:27
Получить размеры рабочей области окна в Chrome unclechu Events/DOM/Window 1 13.09.2011 02:37
стили Css в зависимости от высоты активной области браузера Vladimir_Kl Javascript под браузер 3 23.03.2011 16:04
Закрытие прозрачного div при щелчке мыши в любой его области mav1 Элементы интерфейса 8 09.02.2011 19:25
выделение прямоугольной области belbek Общие вопросы Javascript 2 22.09.2010 16:21