cyber,
Ты не понял, я говорю о том, что векторной алгеброй можно было бы многое сократить и ускорить в моем примере. А писать что-то или переписывать я уже не буду, надоело. |
Цитата:
![]() Отличие моего кода в том, что у меня нормали левосторонние, так как фигуры у меня определяются по часовой стрелке. |
Дзен-трансгуманист, видел, но не понял.
мне нужно y1-y2 / (x2-x1)? |
cyber,
Круглые скобки там - это просто описание компонент вектора. Так еще матрицы описываются. x = y1-y2 y = x2-x1 Лучше пойди выспись и перечитай тот пост с утра на свежую голову, а то я всю ночь тут тебе объяснять буду... Всё, умаялся я уже. |
Дзен-трансгуманист, да, чет по вечерам у меня включается режим тормоз))
Зная х и у , можно получить угол нормали через теорему косинусов... |
cyber,
Если угол все-таки нужен, то Math.atan2. |
Дзен-трансгуманист, вот блин, как я мог пропустить такую полезную функцию....
|
ну вот как то так)
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,
Там в статье написано, что углы отсчитываются против часовой стрелки, но здесь имеется ввиду традиционное представление координат, как на обычных графиках, когда игрек направлен вверх. В экранных же координатах, как и на канвасе, игрек направлен вниз, поэтому угол тут возрастает по часовой стрелке. |
Цитата:
Цитата:
|
Цитата:
Алгоритмов это никак не касается. Ладно, как-нибудь сам разберешься... ;) |
Дзен-трансгуманист, тьфу блин, запутал :)
Я думал ты про статью с алгоритмом , перечетал ее еще раз 5, после твоего коммента. Прочитав описание Math.atan2 , понял к чему ты Цитата:
var normal = (Math.atan2(nx,ny)) * 180/ Math.PI; |
cyber,
Зачем тебе градусы? Градусы не нужны. Цитата:
|
Цитата:
Цитата:
var normal = Math.atan2(nx,ny) * 180/ Math.PI Цитата:
|
cyber,
Нормаль - это вектор, а ты что думал? :lol: иди еще раз перечитывай статью на хабре. |
Цитата:
Ну всё, я снимаю подписку с этой темы, а то это будет бесконечно длиться, а у меня еще работы дохера. :) Успехов! |
Цитата:
Цитата:
Цитата:
Удачи! |
| Часовой пояс GMT +3, время: 15:00. |