Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Угол отражения (http://www.flasher.ru/forum/showthread.php?t=126222)

wvxvw 14.06.2009 15:32

Угол отражения
 
Не могу посчитать :)
Код AS3:

public function reflection(force:Point):Point
{
        var x:Number = force.x;
        var y:Number = force.y;
        var perpendicular:Number = _angle - Math.PI / 2; // _angle - угол наклона поверхности
        var iangle:Number = Math.atan2(x, y); // iangle - угол падения
        var rangle:Number = perpendicular - iangle; // rangle - должен быть угол отражения
        var d:Number = Math.sqrt(x * x + y * y);
        return new Point(Math.cos(rangle) * d, Math.sin(rangle) * d);
}

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

silin 14.06.2009 15:49

затык скорее всего в Math.atan2(x, y), должно быть Math.atan2(y, x)
остальное только вопрос системы координат/обозначений
upd:
мне кажется так должно быть
Код AS3:

public function reflection(force:Point):Point
{
        var x:Number = force.x;
        var y:Number = force.y;
        var perpendicular:Number = _angle - Math.PI / 2;
        var iangle:Number = Math.atan2(y, x);
        var rangle:Number = 2 * perpendicular - iangle;//угол падения равен углу..
        var d:Number = Math.sqrt(x * x + y * y);
        return new Point(Math.cos(rangle) * d, Math.sin(rangle) * d);
}

но опять же от принятых направлений зависит

Яски 14.06.2009 20:18

Мне больше нравится, когда плоскость задается нормалью и оффсетом из формулы Ax + By + C = 0, где A - x нормали, B - y нормали, C - оффсет
Тогда и отражение от плоскости считается очень просто:
Код AS3:

function reflect(vector:Point, normal:Point):void {
  // Поскольку длина нормали 1, скалярное произведение дает проекцию
  // вектора на перпендикуляр к плоскости
  var dot:Number = vector.x*normal.x + vector.y*normal.y;
  // Меняем направление вектора противоположно плоскости
  vector.x -= 2*dot*normal.x;
  vector.y -= 2*dot*normal.y;
}

Получить номаль из угла можно так:
Код AS3:

  normal.x = -Math.sin(angle);
  normal.y = Math.cos(angle);

Добавлено через 6 минут
Всмысле не плоскость, а прямая. Но для плоскости формулы будут теже.

wvxvw 14.06.2009 20:35

Ок, спасибо, буду разбираться :)


Часовой пояс GMT +4, время: 15:51.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.