Форум программистов, компьютерный форум CyberForum.ru

Получение отражённого луча - C++

Восстановить пароль Регистрация
 
PG94
2 / 2 / 0
Регистрация: 15.01.2012
Сообщений: 181
23.08.2013, 11:18     Получение отражённого луча #1
Доброго времени суток.
Проблема скорее с математикой, чем с программированием. Есть ф-ия, которая по отрезку и стрелке возвращает отражённую стрелку:
C++
1
2
3
4
5
6
7
8
9
10
11
12
 Arrow reflected(Line& ln, Arrow& aw)
 {
    if (!belong_to_line(ln,aw.end()))
        throw logic_error("point is not belongs to the line");
    GVector vp(aw.end().x-aw.begin().x,aw.end().y-aw.begin().y);    //вектор из координат стрелки
    GVector vn(ln.point(1).y-ln.point(0).y,ln.point(0).x-ln.point(1).x);    //вектор нормали к прямой
    vn=vn.valuation();  //нормирование
 
    GVector v=-2*projection(vp,vn)*vn+vp;   //отражённый вектор
    Point p(v.x+aw.end().x,v.y+aw.end().y); //искомый конец отражённого луча
    return Arrow(aw.end(),p);   //новая стрелка
 }
Ниже конкретный пример, вопрос будет касаться именно его, так как с другими расположениями исх. стрелки и прямой функция может работать неверно (не тестировал). Отражённый вектор получается по формуле: "исходный вектор" - 2 * "проекция исходного на нормированный вектор нормали" * "вектор нормали". Почему для получения правильного результата нужно вычитать, а не прибавлять?
Изображения
 
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.08.2013, 11:18     Получение отражённого луча
Посмотрите здесь:

C - получение IP адреса C++
Точка пересечения луча (прямой) с треугольником. C++
Получение максимума C++
Получение данных о пк C++
Расстояние от точки до луча (описание внутри) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
23.08.2013, 12:16     Получение отражённого луча #2
откуда формула?
za5
440 / 344 / 30
Регистрация: 16.10.2010
Сообщений: 842
Записей в блоге: 7
23.08.2013, 12:31     Получение отражённого луча #3
по-моему проще перемножить скалярно единичные векторы входящего луча и прямой покоординатно, это будет равняться косинусу угла между ними (т.к. оба единичные), ну а потом по этому углу просто восстановить отражённый вектор из точки пересечения первого луча.
castaway
Эксперт С++
4842 / 2981 / 367
Регистрация: 10.11.2010
Сообщений: 11,013
Записей в блоге: 10
Завершенные тесты: 1
23.08.2013, 12:37     Получение отражённого луча #4
У меня правильно считается по такой формуле: reflected = vector_to_reflect + (normal * -(dot_product( vector_to_reflect, normal ) * 2))
Только не пойму, одинаковые у нас формулы или нет...
castaway
Эксперт С++
4842 / 2981 / 367
Регистрация: 10.11.2010
Сообщений: 11,013
Записей в блоге: 10
Завершенные тесты: 1
23.08.2013, 12:40     Получение отражённого луча #5
...
Изображения
 
PG94
2 / 2 / 0
Регистрация: 15.01.2012
Сообщений: 181
23.08.2013, 13:42  [ТС]     Получение отражённого луча #6
Цитата Сообщение от Jupiter Посмотреть сообщение
откуда формула?
Опирался на эту статью http://habrahabr.ru/post/105882/
castaway
Эксперт С++
4842 / 2981 / 367
Регистрация: 10.11.2010
Сообщений: 11,013
Записей в блоге: 10
Завершенные тесты: 1
23.08.2013, 13:49     Получение отражённого луча #7
Тут визуально объясняется отражение луча, правда на английском.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.08.2013, 14:33     Получение отражённого луча
Еще ссылки по теме:

Получение ошибка C++
C++ Получение информации об ОС
C++ Получение температуры ( C° - F°)

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
vndtta
66 / 43 / 5
Регистрация: 17.10.2011
Сообщений: 146
Завершенные тесты: 1
23.08.2013, 14:33     Получение отражённого луча #8
Цитата Сообщение от PG94 Посмотреть сообщение
Arrow reflected(Line& ln, Arrow& aw)
{
if (!belong_to_line(ln,aw.end()))
throw logic_error("point is not belongs to the line");
GVector vp(aw.end().x-aw.begin().x,aw.end().y-aw.begin().y); //вектор из координат стрелки
GVector vn(ln.point(1).y-ln.point(0).y,ln.point(0).x-ln.point(1).x); //вектор нормали к прямой
vn=vn.valuation(); //нормирование

GVector v=-2*projection(vp,vn)*vn+vp; //отражённый вектор
Point p(v.x+aw.end().x,v.y+aw.end().y); //искомый конец отражённого луча
return Arrow(aw.end(),p); //новая стрелка
}
ошибка в коде имхо
Yandex
Объявления
23.08.2013, 14:33     Получение отражённого луча
Ответ Создать тему
Опции темы

Текущее время: 23:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru