Сейчас 17:23:34 Пятница, 19 апреля, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: PUVer, SirNikolas, Ty3uK  
Форум о Warcraft 3 » Раздел для картостроителей » Вопросы по картостроению » пара вопросов (вычисление положения юнита,создание в точке приказа)
пара вопросов
kurtdnДата: Четверг, 28 Октября 2010, 16:48:02 | Сообщение # 1
7 уровень
Группа: Проверенные
Сообщений: 374
Награды: 0
Репутация: 45
Блокировки:
1)подскажите как просчитать наличие юнита ,в центре между другими юнитами

2)как безутечно создать юнита в точке приказа?
 

SirNikolasДата: Четверг, 28 Октября 2010, 17:06:16 | Сообщение # 2
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Quote (kurtdn)
1) Подскажите, как просчитать наличие юнита в центре между другими юнитами?
В данном случае - с помощью области.
Quote (kurtdn)
2)как безутечно создать юнита в точке приказа?
Custom script: call CreateUnit(player, unitid, GetOrderPointX(), GetOrderPointY(), face)


 

kurtdnДата: Четверг, 28 Октября 2010, 17:30:27 | Сообщение # 3
7 уровень
Группа: Проверенные
Сообщений: 374
Награды: 0
Репутация: 45
Блокировки:
SirNikolas, но нужно так,чтобы если он выйдет за пределы треугольника,то считалось что он уже не в области...
просто треукольник может быть любой почти,как его расставишь,это тотемы
как записать приказ в локалку?
например для вичисления координат юнита делаем так:
set u = GetUnitX(u)
как для приказа сделать тоже самое?
 

SirNikolasДата: Четверг, 28 Октября 2010, 17:44:53 | Сообщение # 4
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Quote (kurtdn)
Как записать приказ в локалку?
Code
local integer i = GetIssuedOrderId()
А у тебя всегда ровно три тотема? Ладно, сейчас поломаю над этим голову.


 

kurtdnДата: Четверг, 28 Октября 2010, 17:56:41 | Сообщение # 5
7 уровень
Группа: Проверенные
Сообщений: 374
Награды: 0
Репутация: 45
Блокировки:
SirNikolas, в том случае котором нужно мне - всегда три)
 

DarkVaderДата: Пятница, 29 Октября 2010, 02:27:55 | Сообщение # 6
7 уровень
Группа: Проверенные
Сообщений: 357
Награды: 0
Репутация: 95
Блокировки:
kurtdn, вот есть способ, вот картинка для примера

abc твой треуголник, для всех действий триггера вводишь проверку условия:

1) расстояние от точки а до позиции юнита меньше или равно r
2) угол между юнитом и точкой а больше угла между точками а и b, но не более угла между а и с

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

Добавлено (29-10-2010, 02:27)
---------------------------------------------
Кстати вместо проверки расстояния, можно делать проверку еще одного угла относительно с или b и тогда треуголник будет использоваться полностью

Прикрепления: 5631592.jpg (31.4 Kb)
 

DarkVaderДата: Пятница, 29 Октября 2010, 05:41:29 | Сообщение # 7
7 уровень
Группа: Проверенные
Сообщений: 357
Награды: 0
Репутация: 95
Блокировки:
Вот тебе проверка по двум углам, треуголник полностью задействован( обозначен штриховкой)

Прикрепления: 5354664.jpg (35.8 Kb)
 

kurtdnДата: Пятница, 29 Октября 2010, 13:56:29 | Сообщение # 8
7 уровень
Группа: Проверенные
Сообщений: 374
Награды: 0
Репутация: 45
Блокировки:
ухты,вотэто мего..впринципе любая из них подойдет...
зы. аты не знаешь как выстроить преграды например в виде дудасов от точки б до с допустим?
 

SirNikolasДата: Пятница, 29 Октября 2010, 14:10:56 | Сообщение # 9
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Ну вот, меня опередили! Ладно, вот моя версия.
Code
function IsPointInTriangle takes real x1, real y1, real x2, real y2, real x3, real y3, real x, real y returns boolean
     local real array Real
     loop
         exitwhen x1 != x2 and x1 != x3
         set x1 = x1 + 1.
     endloop
     loop
         exitwhen x1 != x2 and x2 != x3
         set x2 = x2 - 1.
     endloop
     set Real[0] = (y1 - y2) / (x1 - x2)
     set Real[1] = y1 - Real[0] * x1
     set Real[2] = (y2 - y3) / (x2 - x3)
     set Real[3] = y2 - Real[2] * x2
     set Real[4] = (y1 - y3) / (x1 - x3)
     set Real[5] = y3 - Real[4] * x3
     set Real[6] = Real[0] * x + Real[1]
     set Real[7] = Real[2] * x + Real[3]
     set Real[8] = Real[4] * x + Real[5]
     if y == Real[6] or y == Real[7] or y == Real[8] then
         return true
     endif
     if (y > Real[6]) == (y3 > Real[0] * x3 + Real[1]) and (y > Real[7]) == (y1 > Real[2] * x1 + Real[3]) and (y > Real[8]) == (y2 > Real[4] * x2 + Real[5]) then
         return true
     endif
     return false
endfunction
Функция принимает координаты вершин треугольника (x1, y1, x2, y2, x3, y3) и координаты искомой точки (x, y) в действительных числах (real), возвращает логическую (boolean). Если две или все три вершины треугольника будут лежать на прямой, параллельной оси OY (вертикальной), то они будут смещены на 1 клетку вправо и влево. Это ничтожно малая величина, но она необходима для расчетов.
Quote (kurtdn)
Как выстроить преграды, например, в виде дудасов от точки б до с, допустим?
Не понял.


 

kurtdnДата: Пятница, 29 Октября 2010, 14:21:32 | Сообщение # 10
7 уровень
Группа: Проверенные
Сообщений: 374
Награды: 0
Репутация: 45
Блокировки:
блин ..я тут подумал что это все катит только для равностороннего треугольника...а если он совсем не симетричный?

Добавлено (29-10-2010, 14:21)
---------------------------------------------
ну чтоб вставить в расстояние от а до б блокеры и преградить тем самым путь

 

SirNikolasДата: Пятница, 29 Октября 2010, 14:35:59 | Сообщение # 11
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
И моя функция, и, насколько я понял, способ DarkVader'а годится для любых треугольников. А про блокираторы я что-то не понял. Тебе нужно, чтобы после входа в треугольник юнит не мог оттуда выйти?

 

kurtdnДата: Пятница, 29 Октября 2010, 14:58:45 | Сообщение # 12
7 уровень
Группа: Проверенные
Сообщений: 374
Награды: 0
Репутация: 45
Блокировки:
да..именно(=но это только немногое что я собираюсь с ним делать
 

SirNikolasДата: Пятница, 29 Октября 2010, 15:21:19 | Сообщение # 13
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Конечно, некрасиво будет, но... Периодом проверяй, когда юнит окажется не в треугольнике и закидывай его обратно.

 

kurtdnДата: Пятница, 29 Октября 2010, 15:40:21 | Сообщение # 14
7 уровень
Группа: Проверенные
Сообщений: 374
Награды: 0
Репутация: 45
Блокировки:
да,это очень уж не красиво)
 

DarkVaderДата: Пятница, 29 Октября 2010, 16:05:04 | Сообщение # 15
7 уровень
Группа: Проверенные
Сообщений: 357
Награды: 0
Репутация: 95
Блокировки:
Quote (kurtdn)
блин ..я тут подумал что это все катит только для равностороннего треугольника...а если он совсем не симетричный?

Сумма всех углов треуголника равна 180 градусов, если ты определишь два угла третий определится сам, это по второму способоу через два угла

А по первому, там вообще значение имеет лишь один угол, но есть минус в виде слепых зон=)

Quote (SirNikolas)
Ну вот, меня опередили! Ладно, вот моя версия.

Как сложно=) Вот как выглядит проверка через углы=)

Code

function Trig_NewTrigger_Actions takes nothing returns boolean
local real array angle
  set angle[1] = Atan2( GetUnitY(наш юнит) - GetUnitY(юнит a), GetUnitX(наш юнит) - GetUnitX( юнит а))* bj_RADTODEG
  set angle[2] = Atan2( GetUnitY(наш юнит) - GetUnitY(юнит c), GetUnitX(наш юнит) - GetUnitX( юнит c))* bj_RADTODEG  
  if( angle[1] > 120 and angle[1] < 180 and angle[2] > 0 and angle[2] < 60) then  
   действия
  else
  действия если условие не выполняется
  endif
endfunction

пример написан для равноугольного треуголника с углами 60 град. По какому принципу определяются углы видно на первой картинке
если треуголник с другими углами просто поставить свои и усе ок=)

Добавлено (29-10-2010, 16:05)
---------------------------------------------
И нету лишнего вызова функции=)

 

kurtdnДата: Пятница, 29 Октября 2010, 16:09:46 | Сообщение # 16
7 уровень
Группа: Проверенные
Сообщений: 374
Награды: 0
Репутация: 45
Блокировки:
DarkVader, я подумал,что слепые зоны будут разными для каждого треугольника...
проблема в том,что точки a/b/c могут быть расставлены как угодно,поетуме нет строгих расстояний между точками
 

DarkVaderДата: Пятница, 29 Октября 2010, 16:16:33 | Сообщение # 17
7 уровень
Группа: Проверенные
Сообщений: 357
Награды: 0
Репутация: 95
Блокировки:
Quote (kurtdn)
ну чтоб вставить в расстояние от а до б блокеры и преградить тем самым путь

просто создай между точками дамми юнитов с физ размером что бы юниты не могли проходить.

P.s никогда так не пробовал , не знаю будет ли он непроходимым без модели=))) но проверить это не сложно=)

Добавлено (29-10-2010, 16:16)
---------------------------------------------

Quote (DarkVader)
DarkVader, я подумал,что слепые зоны будут разными для каждого треугольника... проблема в том,что точки a/b/c могут быть расставлены как угодно,поетуме нет строгих расстояний между точками

Опиши по какому принципу ты создаешь треуголник?

 

kurtdnДата: Пятница, 29 Октября 2010, 16:58:34 | Сообщение # 18
7 уровень
Группа: Проверенные
Сообщений: 374
Награды: 0
Репутация: 45
Блокировки:
DarkVader, треугольник расставляется вручну,как расставишь так и будет.ведь это тотемы,они ставятся вручную игроком)
 

DarkVaderДата: Пятница, 29 Октября 2010, 17:22:14 | Сообщение # 19
7 уровень
Группа: Проверенные
Сообщений: 357
Награды: 0
Репутация: 95
Блокировки:
Quote (kurtdn)
DarkVader, треугольник расставляется вручну,как расставишь так и будет.ведь это тотемы,они ставятся вручную игроком)

ну тогда тоже нет ничего сложного, вместо предустановленных углов ставь макс и мин значения углов относительно точек вершин

а даммиков расставляй тогда когда установится третий тотем=) тут нет ничего сложного=)

Добавлено (29-10-2010, 17:22)
---------------------------------------------
Да и слепых зон не будет если использовать второй способ, да и первый не подходит тебе

 

[DUОS]Дата: Суббота, 30 Октября 2010, 17:05:37 | Сообщение # 20
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
Quote (SirNikolas)
Custom script: call CreateUnit(player, unitid, GetOrderPointX(), GetOrderPointY(), face)

А как ты его потом отловишь?)


НУ И ЧТО ТЕПЕРЬ?


Кликайте на дракошку ;)
 

kurtdnДата: Суббота, 30 Октября 2010, 22:07:34 | Сообщение # 21
7 уровень
Группа: Проверенные
Сообщений: 374
Награды: 0
Репутация: 45
Блокировки:
[DUОS], что предложешь?))
 

[DUОS]Дата: Суббота, 30 Октября 2010, 23:07:44 | Сообщение # 22
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
kurtdn,
Если не будете ругать за хеш, то могу что-то предложить :)


НУ И ЧТО ТЕПЕРЬ?


Кликайте на дракошку ;)
 

SargaraseronДата: Воскресенье, 31 Октября 2010, 01:04:48 | Сообщение # 23
3 уровень
Группа: Пользователи
Сообщений: 50
Награды: 0
Репутация: 8
Блокировки:
kurtdn,
каждый юнит добавляешь в группу,
затем через цикл находишь расстояние до каждого из этих 3 юнитов.
Делаешь это так:
Сначала считаешь расстояние всех 3х(той же функцией - рассстояние между точками), затем считаешь по формуле:
2\3*(Длина стороны*1\2 Другой стороны) таким образом полчится точка, затем найдешь расстояние до героя, и если оно будет больше чем та же формула, только 1\3 а не 2\3, то тогда он вышел из треугольника.
Разумеется эта форма сработает если брать в расчет то, что треугольник равносторонний, как ты показал на скриншоте

Добавлено (31-10-2010, 01:04)
---------------------------------------------

Quote (DarkVader)
у этого способа есть меленький недостаток, получаются две небольшие слепые зоны в которой эти условия не удовлетворяются, они обозначены штриховкой, применять или нет смотри сам.

можно со всех 3 сторон проверку делать и мертвых зон не будет
 

[DUОS]Дата: Воскресенье, 31 Октября 2010, 09:54:49 | Сообщение # 24
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
А я бы сделал так.
Использовал бы группы и свою функцию сегмента радиуса:
Code
function GroupEnumUnitsInRadiusSegment takes group g, real cx, real cy, real radius, boolexpr filter, real mina, real maxa returns nothing
     local group gr = CreateGroup()
     local unit u
     local real a
      
     call GroupEnumUnitsInRange(gr,cx,cy,radius,filter)
     call DestroyBoolExpr(filter)
      
     loop
         exitwhen u == null
         set u = FirstOfGroup(gr)
         set a = Atan2(GetWidgetY(u) - cy,GetWidgetX(u) - cx) * .0174532
         if a >= mina and a <= maxa then
             call GroupAddUnit(g,u)
         endif
     endloop
      
     call GroupClear(gr)
     call DestroyGroup(gr)
      
     set gr = null
endfunction

Можно набрать в группу юнитов, используя эту функцию и передав ей в качестве mina угол между вершиной, которая играет роль центральной точки, откуда ведётся набор группы и одной из других вершин, а в качестве maxa - угол между вершиной, которая играет роль центральной точки, откуда ведётся набор группы и третьей вершиной. Радиусом будет служить расстояние между двумя нужными вершинами треугольника.

Функция работает абсолютно с любыми треугольниками.


НУ И ЧТО ТЕПЕРЬ?


Кликайте на дракошку ;)
 

SirNikolasДата: Воскресенье, 31 Октября 2010, 12:18:55 | Сообщение # 25
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Quote (|DUОS|)
А как ты его потом отловишь?)
А кто говорил, что его потом надо будет отлавливать?)
В крайнем случае можно вот так: set bj_lastCreatedUnit = CreateUnit(player, unitid, GetOrderPointX(), GetOrderPointY(), face)
Тогда его можно будет отлавливать в GUI как "(Last created unit)".
Quote (|DUОS|)
Если не будете ругать за хеш, то могу что-то предложить
А что именно? Нам интересно!


 

Форум о Warcraft 3 » Раздел для картостроителей » Вопросы по картостроению » пара вопросов (вычисление положения юнита,создание в точке приказа)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz