13:39
ОбновитьСмайлыУправление мини-чатом
МИНИ-ЧАТ
Главная страница!

 



 
          





Рекомендуем:





Последние Файлы GTA 4 Последние Файлы GTA-MP Реклама
Скрипт GTA 4 элементы Watch... 07.09.2014
Ferrari 360 Spider [EPM con... 13.12.2013
Porsche Cayenne Turbo 2012 ... 13.12.2013
Shelby Terlingua Mustang v1... 13.12.2013
Hamann Lamborghini Gallardo... 27.10.2013
[GM] The Big PEN1:LS v2.00 ... 04.12.2017
Dgun (AvnanceRP,SampRP,Dimo... 19.03.2016
SAMP скрипт SX Events (MySQ... 03.03.2016
Карта ASL мэрия для SAMP се... 03.03.2016
AIM для SA-MP 0.3.7 22.02.2016
  • Страница 1 из 1
  • 1
Модератор форума: _Z_  
Координаты конца векторов
PrettySweetieДата: Суббота, 29.12.2012, 14:59 | Сообщение # 1
Местный
Группа: Продвинутые
Сообщений: 704
Награды: 19
Город: Нериак
Репутация: 1221
Замечания: 0%
Статус:
Во время разработки своего сервера, возник вопрос по векторам в 3D пространстве, но тк у меня по геометрии оценка с тройки на двойку, то надеюсь на вашу помощь.
Два вектора выходят из одной точки (например M). Мне известны координаты этой точки и угол между векторами (назовем его буквой c). Так-же есть у меня длина векторов. А надо найти координаты концов этих векторов (пусть концы мы назовем A и B).
Вот, картинку накатал для примера:


Надеюсь поможет кто нибуть :)





Сообщение отредактировал PrettySweetie - Суббота, 29.12.2012, 15:03
AlcoholikДата: Суббота, 29.12.2012, 16:19 | Сообщение # 2
Мастер джэдай
Группа: Администратор
Сообщений: 8299
Награды: 111
Город: Санкт-Петербург
Репутация: 6085
Статус:
PrettySweetie, у меня тоже полная беда с геометрией, но по тому, что дано, нихера найти не выйдет, будет куча координат, так как если картинку зеркально представить, данные получается те-же, а именно длина векторов, начальная точка и угол, однако координаты будут сосем другие.


if(isset($beer)&&isset($girl)) { drink($beer);fuck($girl); }else die();
Мониторинг sa:mp серверов


Приватно никого не консультирую, моды также не пишу, ни так, ни за деньги.
Моя ICQ 675715, пишу только с неё. Все остальные Роачи фейки, ничего я не продаю и продавать не буду, вас разводят.
PrettySweetieДата: Суббота, 29.12.2012, 16:46 | Сообщение # 3
Местный
Группа: Продвинутые
Сообщений: 704
Награды: 19
Город: Нериак
Репутация: 1221
Замечания: 0%
Статус:
RoACh, ну, хоть на том спасибо)

Я не правильно сформулировал оказывается, сейчас глянул в код, вот что еще надо уточнить:
1. 2D а не 3D вектора (не заметил сразу, что всего 2 координаты)
2. Есть поворот всего этого дела относительно мира ГТА.
То-есть я вообще-то делаю зону видимости НПЦ. Может кто знает как вычислить это дело?





Сообщение отредактировал PrettySweetie - Суббота, 29.12.2012, 17:06
AirKiteДата: Суббота, 29.12.2012, 17:25 | Сообщение # 4
Долгожитель
Группа: I'm V.I.P.
Сообщений: 1671
Награды: 21
Город: Новосибирск
Репутация: 2070
Замечания: 0%
Статус:
То что ты описан в начале, вообще каша. У тебя есть угол между A и B, но изначального направления A или B и в какую сторону отклонения между ними ты не указываешь. В таком случае будет невозможно получить координаты точек A или B.

Если ты делаешь зону видимости НПЦ, то нахрен тебе вообще координаты A и B? Тебе нужно проверять угол между НПЦ и игроком и сравнивать его в нужном тебе диапазоне. Ну и расстояние разумеется проверять ))) Если быть точней расстояние проверять лучше в первую очередь.



[1337GAMES] Easy RP
(SAMP SERVER, DEVELOPMENT, NOT SAMP-RP, SMART LIFE)


Jabber: airkite@qip.ru
[Addon] QuickBinder
[FS] Online Players Record


Сообщение отредактировал AirKite - Суббота, 29.12.2012, 17:27
PrettySweetieДата: Воскресенье, 30.12.2012, 16:10 | Сообщение # 5
Местный
Группа: Продвинутые
Сообщений: 704
Награды: 19
Город: Нериак
Репутация: 1221
Замечания: 0%
Статус:
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
AirKiteДата: Среда, 02.01.2013, 01:38 | Сообщение # 6
Долгожитель
Группа: I'm V.I.P.
Сообщений: 1671
Награды: 21
Город: Новосибирск
Репутация: 2070
Замечания: 0%
Статус:
Цитата (PrettySweetie)
А просто проверка угла мне не подойдет

В плане проверки видимости это бы подошло т.к. проверка по сути идентична, по крайне мере если ты создаёшь невидимый полигон и проверяешь нахождение игрока в этом полигоне это хуже в плане оптимизации.



[1337GAMES] Easy RP
(SAMP SERVER, DEVELOPMENT, NOT SAMP-RP, SMART LIFE)


Jabber: airkite@qip.ru
[Addon] QuickBinder
[FS] Online Players Record
toneysixДата: Воскресенье, 03.03.2013, 01:04 | Сообщение # 7
Джэдай
Группа: I'm V.I.P.
Сообщений: 1731
Награды: 77
Город: Салават
Репутация: 1825
Замечания: 0%
Статус:
Цитата
Тебе нужно проверять угол между НПЦ и игроком и сравнивать его в нужном тебе диапазоне

О боже, какой когнитивный диссонанс! И что ты проверишь зная одни углы?))

Собственно ТС был на правильном пути. По сути нам требуется замкнуть получившийся угол для получения треугольника. Оба вектора 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 в пределах периметра нашего треугольника. Тут на помощь придет линейная алгебра: векторное/псевдоскалярное произведение.

new Float: sign[ 3 ];
sign[ 0 ] = ( x - pos[ 0 ] ) * ( y_2 - y ) - ( x_2 - x ) * ( y - pos[ 1 ] );
sign[ 1 ] = ( x_2 - pos[ 0 ] ) * ( y_3 - y_2 ) - ( x_3 - x_2 ) * ( y_2 - pos[ 1 ] );
sign[ 2 ] = ( x_3 - pos[ 0 ] ) * ( y - y_3 ) - ( x - x_3 ) * ( y_3 - pos[ 1 ] );


Где pos – произвольная точка P. Если все три произведения разностей будут иметь идентичный знак, то соответственно точка лежит в области нашего треугольника, если хотя бы одна из трех точек равна нулю, то точка P лежит на ребрах треугольника, иначе не лежит.

if( ( sign[ 0 ] >= 0 && sign[ 1 ] >= 0 && sign[ 2 ] >= 0 ) ||
( sign[ 0 ] <= 0 && sign[ 1 ] <= 0 && sign[ 2 ] <= 0 ) ) return true;


Вот сама функция http://pastebin.com/D2Wr9biM (P.S: написал на скорую руку)
Для аппликаты (пространства) сам думаю сможешь сделать: проверить разностную величину между ботом и игроком, также может возникнуть ситуация, когда угол выходит за рамки одного периода, в таком случае вычитай – 360 гр.
Математика - царица наук.



Русскоязычныи портал о MTA/GTA-IV-MP | http://multi-theft-auto.ru

Сообщение отредактировал toneysix - Воскресенье, 03.03.2013, 01:06
  • Страница 1 из 1
  • 1
Поиск:





 


 


 
Хостинг от uCoz samp.at.ua