Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.09.2010, 17:35   #1
Nazar1994
Пользователь
 
Аватар для Nazar1994
 
Регистрация: 25.10.2009
Сообщений: 75
По умолчанию Алгоритм пересекает ли окружность отрезок. Как он работает?

Цитата:
bool intersectcircleline (const vec2&center, float radius, const vec2&p1, const vec2&p2)
{
float x01=p1.x-center.x;
float y01=p1.y-center.y;
float x02=p2.x-center.x;
float y02=p2.y-center.y;
float dx=x02-x01;
float dy=y02-y01;
float a=dx*dx+dy*dy;
float b=2.0f*(x01*dx+y01*dy);
float c=x01*x01+y01*y01 -radius*radius;
if (-b<0) return (c<0);
if (-b<(2.0f*a)) return (4.0f*a*c-b*b<0);
return (a+b+c<0);
}
1)что такое vec2&...- думал vec2-еденичный вектор.
2)как работают последние 6 строк перед "}" (не могу нарисовать графично чтобы понять как ето работает)
3)хочу перевести ето на дельфи, но не знаю : return ... pавносильно
begin result:=... ; exit; end;
4) 2.0f, 4.0f -?
Зарание спасибо.
Nazar1994 вне форума Ответить с цитированием
Старый 24.09.2010, 18:27   #2
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Код:
const vec2& center
1. Константная ссылка на объект center типа vec2 (похоже, координаты центра окружности). Передача константной ссылки в C++ позволяет передать объект в качестве аргумента функции без лишнего копирования (если передавать не как ссылку, то в функцию пойдет аргумент, скопированный с того, с которым функция вызывалась; если передавать как неконстантную ссылку, то объект можно будет изменить внутри функции, чего здесь явно не ожидается). В общем, это стандартный прием передачи больших объектов в качестве аргументов без накладных расходов на копирование.
2. сам толком не понял всю эту геометрию, по крайней мере, при беглом просмотре
3. насколько я знаю, более-менее равносильно. Разве что с той разницей, что после первого вызова return функция завершается вне зависимости от того, есть ли дальнейший код или другие return
Код:
int max(int a, int b, int c)
{
if (a > b && a > c)
 return a;
if (b > c)
 return b;
return c;
}
Уж если к строке return c; функция все еще не завершилась - значит, до предыдущих return дело не дошло, а стало быть условия не сработали.
В Delphi для дублирования функционала множества return'ов придется использовать связки if-else (в данном случае это не составить проблем)
4. 2.0f, 4.0f - литералы с плавающей точкой типа float. Если бы было просто 2 и 4 - это были бы целые литералы, 2.0 и 4.0 - тоже литералы с плавающей точкой, но (по умолчанию) типа double. Добавление символа f в литерал с плавающей точкой сообщает, что он имеет тип float.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 24.09.2010, 18:52   #3
Nazar1994
Пользователь
 
Аватар для Nazar1994
 
Регистрация: 25.10.2009
Сообщений: 75
По умолчанию

Спасибо Гром.
Когда считал етот алгоритм на бумаге то 2.0f считал за 2(значит верно считал ).
Нераскрытым остается только пункт 2
Nazar1994 вне форума Ответить с цитированием
Старый 29.09.2010, 18:48   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

не проверял но похоже что использован следующий алгоритм

r^2 = x^2 + y^2 //уравнение окружности с центом точке координат
y =k*x +m //уравнение прямой на которой лежит отрезок

отсюда r^2 = x^2 +( k*x +m )^2
далее проверяем есть ли корни у данного уравнения (пересечение прямой и окружности)
и находятся ли они на нашем отрезке.

P,S, точнее использовано уравнение прямой проходящей через две заданные точки далее подстановка, решение, проверка.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 29.09.2010 в 18:55.
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi. Как записать, что родительский класс-перемещающийся отрезок? Kurai Помощь студентам 0 28.04.2010 21:23
Как нарисовать отрезок. deadh5n1 Помощь студентам 1 20.04.2010 23:24
Как вращать отрезок stscolt Помощь студентам 2 11.09.2009 23:26
как отсортировать массив под данный отрезок и как минимум и максимум из него найти SIEGER Паскаль, Turbo Pascal, PascalABC.NET 1 20.11.2008 08:58