|
|
|
|
пара вопросов
|
|
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
Блокировки:
| такс,народ,а как просчитывать угол мужду тремя точками?ато непонятно чето Добавлено (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, а ок, вроде понял=)
|
|
|
|
|
|
|
|
|
|
|