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

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

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

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

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

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

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

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

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

Получение температуры ( C° - F°) - C++
Добрый день уважаемые ! Вообщем столкнулся с такой проблемой . В данном коде: #include <iostream> #include <conio.h> using...

Получение IP адреса (Си) - C++
Есть ли функция или библиотека для С для определения своего реального интернет IP адреса? Или может есть сервис?

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 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
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
23.08.2013, 12:37     Получение отражённого луча #4
У меня правильно считается по такой формуле: reflected = vector_to_reflect + (normal * -(dot_product( vector_to_reflect, normal ) * 2))
Только не пойму, одинаковые у нас формулы или нет...
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 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
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
23.08.2013, 13:49     Получение отражённого луча #7
Тут визуально объясняется отражение луча, правда на английском.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.08.2013, 14:33     Получение отражённого луча
Еще ссылки по теме:

Получение данных о пк - C++
какие функций существуют или как это сделать? например узнать какой процессор и какое на нем сейчас напряжение?)

Получение информации об ОС - C++
Есть программа которая показывает следующие функции: 1 Имя компьютера 2 Системная информация 3 Системные цвета 4 Директорию Windows...

Получение максимума - C++
Даны x, y, z. Вычислить a, b, используя приведенные ниже формулы. Получить max(a, b). a=1+sin^2(x+y)/2+|x-2x/(1+x^2y^2)|+x,...

Получение ошибка - C++
Помогите создать процесс с ощибкой, которую бы он писал в STDERR, а не в STDOUT. Деление на ноль, выдаёт не ошибку, а инфинити. Может...


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

Или воспользуйтесь поиском по форуму:
vndtta
88 / 65 / 13
Регистрация: 17.10.2011
Сообщений: 225
Завершенные тесты: 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     Получение отражённого луча
Ответ Создать тему
Опции темы

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