Сейчас 10:19:53 Вторник, 26 ноября, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 2 из 2
  • «
  • 1
  • 2
Модератор форума: PUVer, SirNikolas, Ty3uK  
пара вопросов
EdiTTORRДата: Воскресенье, 31 Октября 2010, 12:53:22 | Сообщение # 26
8 уровень
Группа: Проверенные
Сообщений: 585
Награды: 0
Репутация: 147
Блокировки:
Quote (|DUОS|)
Если не будете ругать за хеш, то могу что-то предложить :)

Сомневаюсь что в наше время за такое не наругают. <_<
SirNikolas, bj_lastCreatedUnit идея хорошая, сам давно практикую использование глобалок из Blizzard.j в своих целях, их там много, это лучше чем хеш.


Местами здесь.
 

kurtdnДата: Воскресенье, 31 Октября 2010, 18:20:33 | Сообщение # 27
7 уровень
Группа: Проверенные
Сообщений: 374
Награды: 0
Репутация: 45
Блокировки:
SirNikolas, +
 

[DUОS]Дата: Воскресенье, 31 Октября 2010, 19:50:57 | Сообщение # 28
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
EdiTTORR,
А я предлагал функу, причём никакого хеша.


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


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

DarkVaderДата: Воскресенье, 31 Октября 2010, 21:00:31 | Сообщение # 29
7 уровень
Группа: Проверенные
Сообщений: 357
Награды: 0
Репутация: 95
Блокировки:
Quote (SirNikolas)
можно со всех 3 сторон проверку делать и мертвых зон не будет

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

 

kurtdnДата: Понедельник, 01 Ноября 2010, 17:12:21 | Сообщение # 30
7 уровень
Группа: Проверенные
Сообщений: 374
Награды: 0
Репутация: 45
Блокировки:
такс,народ,а как просчитывать угол мужду тремя точками?ато непонятно чето :o

Добавлено (01-11-2010, 17:12)
---------------------------------------------
зы.и еще тут кое какая проблемка возникла.все функции работают только если треугольник abc например bca уже не катит,тк стороны меняются,как в таком случае сделать так,чтоб нижний левый тотем был всегда вершиной а ,нижний правый был всегда вершиной с ? я думаю это делается сравнением координат

 

DarkVaderДата: Понедельник, 01 Ноября 2010, 20:48:45 | Сообщение # 31
7 уровень
Группа: Проверенные
Сообщений: 357
Награды: 0
Репутация: 95
Блокировки:
Quote (kurtdn)
чтоб нижний левый тотем был всегда вершиной а ,нижний правый был всегда вершиной с ?

в смысле? если у тебя треуголник создается последователной расстановкой тотемов, то не проще ли сделать первы тотем будет вершиной а , второй тотем вершиной б, а третий ц, и делай что угодно, в чем проблема?

 

Master12Дата: Понедельник, 01 Ноября 2010, 20:50:39 | Сообщение # 32
8 уровень
Группа: Проверенные
Сообщений: 775
Награды: 0
Репутация: 184
Блокировки:
Quote (SirNikolas)
можно со всех 3 сторон проверку делать и мертвых зон не будет

Мне кстати тоже интерестно было бы


Говори, что бы я тебя увидел.

 

kurtdnДата: Понедельник, 01 Ноября 2010, 22:40:30 | Сообщение # 33
7 уровень
Группа: Проверенные
Сообщений: 374
Награды: 0
Репутация: 45
Блокировки:
Master12, с трех сторон очень удобно,я делал так: (abc - треугольник n - юнит)
bac <= nac
acb <= acn
bca <= bcn
мополучается так чтоесли точка n будет лежать на одной из сторон : ab/bc/ac то угол между точкой n относительно прилежащей стороны будет равен углу между двумя прилежащими сторонами,а если он бужет больше,то точка n вне треугольника)
DarkVader, сейчас у меня именно так,как ты говоришь,но втом то и дело,вдруг ктото захочет их не попорядку расставить и в зеркальном направлении,будет немного не хорошо


Сообщение отредактировал kurtdn - Понедельник, 01 Ноября 2010, 22:50:19
 

SirNikolasДата: Среда, 03 Ноября 2010, 08:28:43 | Сообщение # 34
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
DarkVader, еще неизвестно, у кого лучше. Ты предлагаешь вот так:
Code
function IsPointInTriangleBy2Angles takes real x1, real y1, real x2, real y2, real x3, real y3, real x, real y returns boolean
     local real Atang1 = Atan2(y2 - y1, x2 - x1)
     local real Atang2 = Atan2(y1 - y2, x1 - x2)
     local real angle1 = Atang1 - Atan2(y3 - y1, x3 - x1)
     local real angle2 = Atang2 - Atan2(y3 - y2, x3 - x2)
     local real angleN1 = Atang1 - Atan2(y - y1, x - x1)
     local real angleN2 = Atang2 - Atan2(y - y2, x - x2)
     if angle1 < .0 then
         set angle1 = -angle1
     endif
     if angle2 < .0 then
         set angle2 = -angle2
     endif
     if angleN1 < .0 then
         set angleN1 = -angleN1
     endif
     if angleN2 < .0 then
         set angleN2 = -angleN2
     endif
     if angle1 > 3.1415926536 then
         set angle1 = 6.2831853072 - angle1
     elseif angle2 > 3.1415926536 then
         set angle2 = 6.2831853072 - angle2
     endif
     if angleN1 > 3.1415926536 then
         set angleN1 = 6.2831853072 - angleN1
     elseif angleN2 > 3.1415926536 then
         set angleN2 = 6.2831853072 - angleN2
     endif
     return (angleN1 <= angle1) and (angleN2 <= angle2)
endfunction
У тебя здесь шесть вызовов функции Atan2, да и сам способ на пять строк длиннее.
Quote (SirNikolas)
можно со всех 3 сторон проверку делать и мертвых зон не будет
Кстати, это не я сказал, а Sargaraseron.


 

DarkVaderДата: Вторник, 09 Ноября 2010, 01:17:23 | Сообщение # 35
7 уровень
Группа: Проверенные
Сообщений: 357
Награды: 0
Репутация: 95
Блокировки:
Quote (SirNikolas)
DarkVader, еще неизвестно, у кого лучше. Ты предлагаешь вот так:

Ну во первых конкретного кода я не предлагал=) Да и вызовов Аtan2 в моем способе всего 4, да и собственно не принципиально.
Поломал немного голову, что я только не перепробовал используя геометрию и аналитическую геометрию, но короч все лажа, вспомнил о координатах, решил поискать закономерности=))) но стоило добавить немного гугла=))) и вот имба функция=)

Функция берет юнита и возвращает логическую, если юнит внутри то возвращает да, если иначе то нет.

Code

function Trigon takes unit u  returns boolean
local real array a
  set a[1] = ((GetUnitX(udg_TrigonUnit[1]) - GetUnitX(u)) * (GetUnitY(udg_TrigonUnit[2])- GetUnitY(udg_TrigonUnit[1]))) - (( GetUnitX(udg_TrigonUnit[2]) - GetUnitX(udg_TrigonUnit[1])) * (GetUnitY(udg_TrigonUnit[1]) - GetUnitY(u)))
  set a[2] = ((GetUnitX(udg_TrigonUnit[2]) - GetUnitX(u)) * (GetUnitY(udg_TrigonUnit[3])- GetUnitY(udg_TrigonUnit[2]))) - (( GetUnitX(udg_TrigonUnit[3]) - GetUnitX(udg_TrigonUnit[2])) * (GetUnitY(udg_TrigonUnit[2]) - GetUnitY(u)))
  set a[3] = ((GetUnitX(udg_TrigonUnit[3]) - GetUnitX(u)) * (GetUnitY(udg_TrigonUnit[1])- GetUnitY(udg_TrigonUnit[3]))) - (( GetUnitX(udg_TrigonUnit[1]) - GetUnitX(udg_TrigonUnit[3])) * (GetUnitY(udg_TrigonUnit[3]) - GetUnitY(u)))
   if ( a[1] > 0 and a[2] > 0 and a[3] > 0) then
    return true
   elseif( a[1] < 0 and a[2] < 0 and a[3] < 0) then
    return true
   else
    return false
   endif
endfunction

короче проще и быстрее не придумаешь в данном случае=) TrigonUnit[1 - 3] это тотемы, u это юнит по которому ведется проверка
a[1], a[2], a[3] - это имба формулы, до конца не понял почему так=)
если все a[1 - 3] одного знака значит юнит внутри, если иначе - он вне, конечно если одно из а равно 0 то юнит будет находиться на одной из сторон, но в варе такой ситуации небудет, но если это важно то можно учесть и это.

вот посидел еще 20 минут и смастерил пример на основе этой функции.

треуголник

не надо только указывать некоторые bj функции и несколько утечек, я знаю где они =Р
просто не старался особо, да и в лом было и это только пример работы функции.

 

SirNikolasДата: Вторник, 09 Ноября 2010, 14:24:50 | Сообщение # 36
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Убедил! Лови плюс! Но твою функцию можно еще чуть-чуть упростить:
Code
function Trigon takes real x1, real y1, real x2, real y2, real x3, real y3, real x, real y returns boolean
        local boolean b = (x2 - x) * (y3 - y2) - (x3 - x2) * (y2 - y) >= .0
        return ((x1 - x) * (y2 - y1) - (x2 - x1) * (y1 - y) >= .0) == b and b == ((x3 - x) * (y1 - y3) - (x1 - x3) * (y3 - y) >= .0)
endfunction
А можно подробнее, как ты нашел эти a и почему именно при одинаковых знаках точка лежит в треугольнике?




Сообщение отредактировал SirNikolas - Среда, 10 Ноября 2010, 12:40:26
 

DarkVaderДата: Вторник, 09 Ноября 2010, 16:45:05 | Сообщение # 37
7 уровень
Группа: Проверенные
Сообщений: 357
Награды: 0
Репутация: 95
Блокировки:
Quote (SirNikolas)
можно еще чуть-чуть упростить:

я туплю или ты не учел что они могут быть все отрицательными?=))) задание сразу через координаты тоже имеет свои плюсы=))) но мне кажется задать юнита проще=))) но если в общем виде для разных спелов юнитов и тд. то через координаты нужно.

Quote (SirNikolas)
А можно подробнее, как ты нашел эти a и почему именно при одинаковых знаках точка лежит в треугольнике?

Ну нашел как я говорю по поиску) Почему формулы имеют такой вид и почему должны быть одного знака я не знаю, есть много догадок но они не подтвержденные, а там где я это нашел теоретической части небыло были только формулы, а жаль=)

 

SirNikolasДата: Вторник, 09 Ноября 2010, 17:03:29 | Сообщение # 38
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Quote (DarkVader)
я туплю или ты не учел, что они могут быть все отрицательными?=)))
Скорее всего, первое. Я написал:
Code
return (a[1] >= 0) == (a[2] >= 0) and (a[2] >= 0) == (a[3] >= 0)
То есть, если они все отрицательные, то (a[1] >= 0) == false; (a[2] >= 0) == false; (a[3] >= 0) == false;
false == false and false == false - условие истинно.




Сообщение отредактировал SirNikolas - Среда, 10 Ноября 2010, 12:35:55
 

DarkVaderДата: Вторник, 09 Ноября 2010, 17:33:17 | Сообщение # 39
7 уровень
Группа: Проверенные
Сообщений: 357
Награды: 0
Репутация: 95
Блокировки:
SirNikolas, а ок, вроде понял=)
 

  • Страница 2 из 2
  • «
  • 1
  • 2
Поиск:

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