Во время разработки своего сервера, возник вопрос по векторам в 3D пространстве, но тк у меня по геометрии оценка с тройки на двойку, то надеюсь на вашу помощь. Два вектора выходят из одной точки (например M). Мне известны координаты этой точки и угол между векторами (назовем его буквой c). Так-же есть у меня длина векторов. А надо найти координаты концов этих векторов (пусть концы мы назовем A и B). Вот, картинку накатал для примера:
Надеюсь поможет кто нибуть
Сообщение отредактировал PrettySweetie - Суббота, 29.12.2012, 15:03
PrettySweetie, у меня тоже полная беда с геометрией, но по тому, что дано, нихера найти не выйдет, будет куча координат, так как если картинку зеркально представить, данные получается те-же, а именно длина векторов, начальная точка и угол, однако координаты будут сосем другие.
Приватно никого не консультирую, моды также не пишу, ни так, ни за деньги. Моя ICQ 675715, пишу только с неё. Все остальные Роачи фейки, ничего я не продаю и продавать не буду, вас разводят.
Я не правильно сформулировал оказывается, сейчас глянул в код, вот что еще надо уточнить: 1. 2D а не 3D вектора (не заметил сразу, что всего 2 координаты) 2. Есть поворот всего этого дела относительно мира ГТА. То-есть я вообще-то делаю зону видимости НПЦ. Может кто знает как вычислить это дело?
Сообщение отредактировал PrettySweetie - Суббота, 29.12.2012, 17:06
То что ты описан в начале, вообще каша. У тебя есть угол между A и B, но изначального направления A или B и в какую сторону отклонения между ними ты не указываешь. В таком случае будет невозможно получить координаты точек A или B.
Если ты делаешь зону видимости НПЦ, то нахрен тебе вообще координаты A и B? Тебе нужно проверять угол между НПЦ и игроком и сравнивать его в нужном тебе диапазоне. Ну и расстояние разумеется проверять ))) Если быть точней расстояние проверять лучше в первую очередь.
AirKite, я в мта хочу для этого создать colPolygon Там надо координаты как минимум трех точек, для зоны зреня нпц я думаю подойдет трегольник. А просто проверка угла мне не подойдет P.S. да, я понял потом свою проблему, и дописал, что так же есть и начальное направление (rotation в гта)
Добавлено (30.12.2012, 16:10) --------------------------------------------- Все, вычислил. Вот как это работает в МТА: Точка A: x+40*math.cos(math.rad(rot+60)), y+40*math.sin(math.rad(rot+60)) Точка B: x+40*math.cos(math.rad(rot+120)), y+40*math.sin(math.rad(rot+120))
x,y - координаты M, rot - угол поворота в мире ГТА.
В данном случае, если я правильно понимаю, "зона зрения" будет с углом в 60 градусов и дальность в 40 единиц. Может кому-нить пригодится.
Сообщение отредактировал PrettySweetie - Суббота, 29.12.2012, 17:45
В плане проверки видимости это бы подошло т.к. проверка по сути идентична, по крайне мере если ты создаёшь невидимый полигон и проверяешь нахождение игрока в этом полигоне это хуже в плане оптимизации.
Тебе нужно проверять угол между НПЦ и игроком и сравнивать его в нужном тебе диапазоне
О боже, какой когнитивный диссонанс! И что ты проверишь зная одни углы?))
Собственно ТС был на правильном пути. По сути нам требуется замкнуть получившийся угол для получения треугольника. Оба вектора MA, MB будут равными. После того, как будет получен треугольник, используя примитивную линейную алгебру, определим, находится ли игрок в периметре полученного треугольника.
Во-первых: для того, чтобы пустить векторы из точки M на какое-то расстояние d со смещением a (в градусах) относительно луча поворота игрока нам потребуются сами координаты точки M и поворот по оси аппликат (z). Пусть координаты точки M ( x, y ) и поворот по аппликат az. Тогда две другие вершины треугольника, образующие векторы MA, MB будут иметь следующие координаты:
x_2 = ( x + ( d * floatsin( ( -( az + ( a / 2 ) ) ), degrees ) ) ); y_2 = ( y + ( d * floatcos( ( -( az + ( a / 2 ) ) ), degrees ) ) ); x_3 = ( x + ( d * floatsin( ( -( az - ( a / 2 ) ) ), degrees ) ) ); y_3 = ( y + ( d * floatcos( ( -( az - ( a / 2 ) ) ), degrees ) ) );
И теперь осталось дело за малым. Проверить лежит ли какая-то точка P в пределах периметра нашего треугольника. Тут на помощь придет линейная алгебра: векторное/псевдоскалярное произведение.
Где pos – произвольная точка P. Если все три произведения разностей будут иметь идентичный знак, то соответственно точка лежит в области нашего треугольника, если хотя бы одна из трех точек равна нулю, то точка P лежит на ребрах треугольника, иначе не лежит.
Вот сама функция http://pastebin.com/D2Wr9biM (P.S: написал на скорую руку) Для аппликаты (пространства) сам думаю сможешь сделать: проверить разностную величину между ботом и игроком, также может возникнуть ситуация, когда угол выходит за рамки одного периода, в таком случае вычитай – 360 гр. Математика - царица наук.
Русскоязычныи портал о MTA/GTA-IV-MP | http://multi-theft-auto.ru
Сообщение отредактировал toneysix - Воскресенье, 03.03.2013, 01:06