|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Sep 2005
Адрес: Минск
Сообщений: 389
|
Условие попадания точки внутрь прямоугольника
Господа, подскажите красивое решение для следующей задачки.
Дано: координаты центра прямоугольника, угол поворота прямоугольника, а также его ширина и высота. Также даны координаты точки. Необходимо составить лаконичное условие проверки - лежит ли точка внутри прямоугольника. Как-то не гуглится совсем, хотя задачка с первого взгляда совсем простая. Заранее спасибо.
__________________
Игра "Пушкин" |
|
|||||
Просто "поверните" точку на тот же угол и сравните её x,y с width,height.
Повернуть можно так: 1. Найти дистанцию точки от центра прямоугольника. 2. Получить новые x,y из дистанции, умноженной на косинус и синус нужного угла. Ну а дальше, просто сравните эти x, y на выход за width, heigth соответственно. var a:Number = 2.1; // Угол поворота прямоугольника в радианах var p:Point = new Point(15, 90); // Координаты точки от центра прямоугольника var dist:Number = Math.sqrt(p.x*p.x + p.y*p.y); var p2:Point = new Point(Math.cos(a) * dist, Math.sin(a) * dist); // Координаты точки от центра прямоугольника, в "его" угле поворота. А ещё, если у вас дисплей объекты, можно использовать их готовые методы: globalToLocal(), localToGlobal()
__________________
Дети не должны знать о своих родителях |
|
|||||
Регистрация: Sep 2005
Адрес: Минск
Сообщений: 389
|
Очень круто, большое спасибо. К сожалению, это JS код (без удобных globalToLocal(), localToGlobal()), а я по-старинке хожу за советом на любимый форум.
__________________
Игра "Пушкин" |
|
|||||
Цитата:
http://math.stackexchange.com/questi...de-a-rectangle вот вторая ссылка с другим решением http://stackoverflow.com/questions/2...ctangle-or-not третья http://martin-thoma.com/how-to-check...e-a-rectangle/ Могу накидать ещё) Или подсказать что вбить в гугл |
|
|||||
Регистрация: Sep 2005
Адрес: Минск
Сообщений: 389
|
Все 3 ссылки ведут на решения такой же задачи, но при других вводных данных. Соответственно, имеют другие подходы и способы решения. Меня интересовал как раз такой простой способ, как был подсказан выше.
__________________
Игра "Пушкин" |
|
|||||
Здесь в теме не написано какие есть вводные данные и что из себя представляет этот прямоугольник
Хотя если тут прямоугольник, то рассчитать предворительно координаты его вершин, зная угол поворота, ширину и высоту, не составит никаких проблем. А дальше уже применить одно их этих решений |
|
|||||
Регистрация: Sep 2005
Адрес: Минск
Сообщений: 389
|
Цитата:
Смысл мне вводить в алгоритм дополнительные рассчеты вершин, чтобы применить в итоге еще более ресурсоемкий подход? Добавлено через 4 часа 20 минут Проверил предложенный алгоритм, но что-то он у меня странно работает. В зависимости от угла поворота прямоугольника срабатывает либо только большая сторона, либо только меньшая. В итоге точка просчитывает попадание в радиус от сработавшей стороны. Ниже приведу примерно то, как я это реализовывал, возможно, кто-то заметит ошибку: var rAng:Number = 0.24; // Угол поворота прямоугольника в радианах var xBound = 20; // Ширина прямоугольника деленная на 2 var yBound = 60; // Высота прямоугольника деленная на 2 var pDotNull:Point = new Point(156, 91); // Координаты точки от начала координат var pRecNull:Point = new Point(26, -11); // Координаты центра прямоугольника от начала координат // Считаю относительные координаты точки по отношению к прямоугольнику var pDotRect:Point = new Point(156 - 26, 91 + 11); // Считаю расстояние var dist:Number = Math.sqrt(130*130 + 102*102); // Координаты точки по отношению к центру прямоугольника с учетом поворота прямоугольника var p2:Point = new Point(Math.cos(rAng) * dist, Math.sin(rAng) * dist); // Проверяю точку на условие попадания в прямоугольник if(Math.abs(p2.x) <= xBound && Math.abs(p2.y) <= yBound) { trace("inside!") }
__________________
Игра "Пушкин" |
|
|||||
import flash.geom.Point; var rAng:Number = 2; // Угол поворота прямоугольника в радианах var xBound = 20; // Ширина прямоугольника деленная на 2 var yBound = 60; // Высота прямоугольника деленная на 2 var pDotNull:Point = new Point(110, 110); // Координаты точки от начала координат var pRecNull:Point = new Point(100, 110); // Координаты центра прямоугольника от начала координат var dx:Number = pRecNull.x - pDotNull.x; var dy:Number = pRecNull.y - pDotNull.y; var dist:Number = Math.sqrt(dx*dx + dy*dy); var pDotResult:Point = new Point(Math.cos(rAng) * dist, Math.sin(rAng) * dist); if(pDotResult.x > xBound || pDotResult.x < -xBound || pDotResult.y > yBound || pDotResult.y < -yBound) trace("Outside!"); else trace("Inside!");
__________________
Дети не должны знать о своих родителях |
|
|||||
Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
|
весь смысл - перевести систему координат точки - глобальную, в систему координат повернутого прямоугольника, а далее проверяем стандартным способом (по ширине и высоте прямоугольника)
Последний раз редактировалось Isfet; 05.10.2015 в 10:48. |
|
|||||
Регистрация: Sep 2005
Адрес: Минск
Сообщений: 389
|
Цитата:
Добавлено через 29 минут Задача решена! Нужно было добавить несколько дополнительных действий в алгоритм: // Найти угол по dx, dy var ang = Math.atan2(dy, dx); // При подсчете обновленных координат использовать разницу углов var pDotResult:Point = new Point(Math.cos(ang - rAng) * dist, Math.sin(ang - rAng) * dist); Может кому пригодится на будущее! Добавлено через 49 минут //////////////////////////////////////////////////////////////////////////////////////////////// Пришла идея усложнить задачу: 1. Представьте, что и прямоугольник и точка постоянно движутся в пространстве (это допущение в целом никак не влияет на прошлые расчеты) 2. Точка в итоге задана координатами, направлением (углом) движения и скоростью 3. Необходимо, чтобы при касании с прямоугольником точка меняла свое направление, как будто она отскочила от одной из сторон. Ну т.е. отразилась, как луч света от зеркальной поверхности. P. S. Первое, что пришло в голову - просто менять угол на противоположный, т.е. Однако данный подход работает только при определенных углах поворота прямоугольника и определенном направлении движения точки. Может у кого-то созреют идеи в каком направлении можно еще "копать"...
__________________
Игра "Пушкин" |
Часовой пояс GMT +4, время: 11:45. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|