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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
PG94
2 / 2 / 0
Регистрация: 15.01.2012
Сообщений: 181
#1

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

23.08.2013, 11:18. Просмотров 717. Ответов 7
Метки нет (Все метки)

Доброго времени суток.
Проблема скорее с математикой, чем с программированием. Есть ф-ия, которая по отрезку и стрелке возвращает отражённую стрелку:
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 * "проекция исходного на нормированный вектор нормали" * "вектор нормали". Почему для получения правильного результата нужно вычитать, а не прибавлять?
0
Изображения
 
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.08.2013, 11:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Получение отражённого луча (C++):

Пересечение луча и отрезка - C++
Помогите решить задачу: пересекает ли луч отрезок. Дано: начало луча О(х0, y0); луч параллелен оси Ox, и сонаправлен с ней отрезок AB...

Метод трассировки луча - C++
Нужно определить, находится ли точка в многоугольнике либо нет. Как я понял надо задать луч проходящий через эту точку, и если будет...

Точка пересечения луча (прямой) с треугольником. - C++
Как найти точку пересечения луча (прямой) с треугольником в пространстве? Добавлено через 4 часа 7 минут Как найти точку пересечения...

Расстояние от точки до луча (описание внутри) - C++
Помогите люди добрые :) Расстояние от точки до луча Даны координаты точки (x,y) и координаты начала и конца вектора (x1,y1) и (x2,y2). ...

Программа для нахождения общих точек отрезка и луча - C++
Программа для нахождения общих точек отрезка и луча. + в карму

Какова степень поляризации отраженного луча, если угол падения светового луча на границу раздела двух диэлектриков равен углу Брюстера? - Оптика
Подскажите как решить задачку

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
23.08.2013, 12:16 #2
откуда формула?
0
za5
441 / 345 / 30
Регистрация: 16.10.2010
Сообщений: 842
Записей в блоге: 7
23.08.2013, 12:31 #3
по-моему проще перемножить скалярно единичные векторы входящего луча и прямой покоординатно, это будет равняться косинусу угла между ними (т.к. оба единичные), ну а потом по этому углу просто восстановить отражённый вектор из точки пересечения первого луча.
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
23.08.2013, 12:37 #4
У меня правильно считается по такой формуле: reflected = vector_to_reflect + (normal * -(dot_product( vector_to_reflect, normal ) * 2))
Только не пойму, одинаковые у нас формулы или нет...
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
23.08.2013, 12:40 #5
...
0
Изображения
 
PG94
2 / 2 / 0
Регистрация: 15.01.2012
Сообщений: 181
23.08.2013, 13:42  [ТС] #6
Цитата Сообщение от Jupiter Посмотреть сообщение
откуда формула?
Опирался на эту статью http://habrahabr.ru/post/105882/
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
23.08.2013, 13:49 #7
Тут визуально объясняется отражение луча, правда на английском.
0
vndtta
90 / 67 / 13
Регистрация: 17.10.2011
Сообщений: 235
Завершенные тесты: 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); //новая стрелка
}
ошибка в коде имхо
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.08.2013, 14:33
Привет! Вот еще темы с ответами:

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

2 когерентных луча - Оптика
два когерентных луча имеют оптическую разность хода 1,5 мкм при длине волны 0,5 мкм. что будет наблюдаться (max или min) при интерференции...

трассировка луча - OpenGL
Помогите найти ответ на вопрос?! Какие эффекты ты не сможешь получить при использовании трассировки луча?

Пересечение луча и отрезка - Pascal
Дано: точки A, B, C, D, лежащие на одной прямой. Определить: пересекаются ли луч .


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
23.08.2013, 14:33
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru