![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Коллижн луча и окружности
Все о наиболее популярных коллиженах есть здесь http://www.geometrictools.com/LibMat...ersection.html там на С++ но нужно практически только математика, она думаю будет понятна ![]() Луч - Круг смотрим это: Wm5IntrLine2Circle2.cpp
__________________
interplanety |
|
|||||
|
Цитата:
private inline function lineIntersects(target:Target, clickX:Float, clickY:Float):Bool { var raySizeX:Float = clickX - _hunter.x; var raySizeY:Float = clickY - _hunter.y; var raySize:Float = Math.sqrt(raySizeX * raySizeX + raySizeY * raySizeY); var rayCos:Float = raySizeX / raySize; var raySin:Float = raySizeY / raySize; // Проекция перпендикуляра от центра цели на луч // Оно же может использоваться как расстояние от охотника до объекта var rayProection = rayCos * (_target.x - _hunter.x) + raySin * (_target.y - _hunter.y); if (rayProection < 0) { // Цель находится за спиной return false; } // Проекция координат цели на перпендикуляр к лучу var normalProection = raySin * (_target.x - _hunter.x) - rayCos * (_target.y - _hunter.y); if (Math.abs(normalProection) > _target.radius) { // Цель не касается луча return false; } return true; } Последний раз редактировалось expl; 27.05.2012 в 21:49. |
|
|||||
|
Задача сводится к:
1) пересечению отрезков, это, я думаю очевидно 2) Оптимизации перебора отрезков В качестве оптимизации можно разбить видимое пространство на квадраты. К каждому квадрату приписывать массив объектов, содержащихся в них. Луч (который вообще-то можно сделать отрезком) в любом случае будет пересекать лишь часть квадратов. То есть берем квадраты, получаем общий список объектов на этих квадратах и эти объекты проверяем на пересечение с "лазером". Проверить пересечение отрезком можно так: - проверить на пересечение прямоугольники, описывающие отрезки - проверить что обе точки одного отрезка находятся по разные стороны другого отрезка
__________________
...вселенская грусть |
|
|||||
|
Modus ponens
|
Цитата:
Если мишеней не много (не много, это порядка сотни), то писать алгоритмы сортировки и разбиения на кластеры, построение деревьев и т.п. - я думаю, себя не оправдает. Но если бы это была карта звездного неба в натуральную величину то наверное имело бы смысл например, проверять на попадание постепенно, сдвигая границу, по которой проверять горизонтально или вертикально. Как только зафиксировано попадение - можно быть уверенным, что оно ближе всего к стреляющему. Но для этого во время движения все мишени нужно было бы пересортировывать так. И тут нужно смотреть что чаще меняется, и избегать его менять ![]() Цитата:
__________________
Hell is the possibility of sanity |
|
|||||
|
Цитата:
|
![]() |
![]() |
Часовой пояс GMT +4, время: 21:53. |
|
|
« Предыдущая тема | Следующая тема » |
|
|