Нужен алгоритм попроще:
Есть x1-y1,x2-y2, ... xn-yn координаты поселений игрока.
Определить входит ли внутрь этой территории произвольно взятые координаты X-Y.
Территория
Сообщений 1 страница 18 из 18
Поделиться12008-06-24 12:58:35
Поделиться22008-06-24 18:40:57
Чей алгоритм будет вставлен в проект получит хорошее вознаграждение ресурсами в игре.
Поделиться32008-06-25 14:20:34
Понадобицца:
Функция расстояния м-у точками
d(x1,y1,x2,y2)=sqrt((x1-x2)**2+(y1-y2)**2))
Функция полупериметра треугольника с длинами сторон a,b,c
p(a,b,c)=(a+b+c)/2
Функция площади треугольника с длинами сторон a,b,c
s(a,b,c)=
{
p=p(a,b,c);
s=sqrt(p*(p-a)*(p-b)*(p-c))
}
Фукция попадания точки x0,y0 в площадь треугольника (x1,y1,x2,y2,x3,y3)
find(x0,y0,x1,y1,x2,y2,x3,y3)
{
d1=d(x0,y0,x1,y1);
d2=d(x0,y0,x2,y2);
d3=d(x0,y0,x3,y3);
h12=d(x1,y1,x2,y2);
h13=d(x1,y1,x3,y3);
h23=d(x2,y2,x3,y3);
S0=s(h12,h13,h23);
S12=s(h12,d1,d2);
S13=s(h13,d1,d3);
S23=s(h23,d2,d3);
если S0=S12+S13+S23=> true точка входит
иначе false
}
если количество координат поселений больше 3
то проверять попадание для точек 1,2,3... затем 1,2,4... затем 1,2,5... итд до 1,2,N
Если хотя бы для одной проверки ф-я попдания в площадь треугольника вернет true - точка x0,y0 внутри поселения.
Поделиться42008-06-25 15:01:31
Если хотя бы для одной проверки ф-я попдания в площадь треугольника вернет true - точка x0,y0 внутри поселения.
Wou.... Красиво... на первый взгляд должно работать....
твой реф номер 132?
Какое вознаграждение хочешь? Заказывай.
Поделиться52008-06-26 01:02:42
реф номер 132.
Денег (в тч игровых или прочих ресов и комплектующих) заказывать банально.
В отместку можешь подсобить временем, например, Атомными электростанциями уровня эдак 20 на моих колониях.
Думаю, красота оных сооружений будет достойной моих усилий...
ЗЫ. Крастоа решения в первую очередь зависит от четкости поставленной задачи..
Поделиться62008-06-26 01:41:46
Атомными электростанциями уровня эдак 20
Жесть....
Давайте останемся в рамках правил НЗ.
А то если проводить аналогию с жизнью.
НР (Новый русский) - скока тебе денжат подкинуть?
Оппонент - Да деньжат просить банально, вот тут мерсы я слышал есть шестисотые, так подгони мне девятисотый мерс.
PS.
Чей алгоритм будет вставлен в проект получит хорошее вознаграждение ресурсами в игре.
Поделиться72008-06-26 08:19:21
Если хотя бы для одной проверки ф-я попдания в площадь треугольника вернет true - точка x0,y0 внутри поселения.
to Pocak реф 132 зачисленно 100000Cr за формулу
to Artppm реф 371 зачислено 50000Cr за честность, веру в справедливость, за то что напомнил про ту заплатку про которую он знает, и косвенное участие в быстром нахождении нужной формулы...
Поделиться82008-06-26 08:29:11
Спасибо!!!
Пошел Бухать))))
Поделиться92008-06-26 10:04:16
Спасибо! Подумав, согласился, что из рамок лучше никого не выпускать. Пойду поднимать Атомную энергетику вручную...
Поделиться102008-06-26 12:03:15
да красивое решение
Поделиться112008-07-02 09:03:04
если количество координат поселений больше 3
то проверять попадание для точек 1,2,3... затем 1,2,4... затем 1,2,5... итд до 1,2,N
Неверное решение!
Поделиться122008-07-02 10:48:06
Pocak написал(а):если количество координат поселений больше 3то проверять попадание для точек 1,2,3... затем 1,2,4... затем 1,2,5... итд до 1,2,NНеверное решение!
Есть другое и оно правильней для любого многоугольника.
Проверка на вхождение точки в многоуггольник почти готово.
Пока работаем над создание максимальной ЗК с масива точек!
Поделиться132008-07-02 15:06:30
Ну да... Недоработочка-с.. Извинияюсь.. На то и коллективный разум, дабы выискивать оные оплошности... Думаю, правильно зациклить по всем вариантам треугольников труда не составит. Долго - но надежно...
ЗЫ. Призовые, надеюсь, возвращать не придется мне... Потрачено уже почти все..
Поделиться142008-07-02 19:27:07
есть еще один вариант.
на пальцах: проводим линию от i-той вершины ко всем остальным, и к тестируемой точке.
строим уравнение прямой линии, находим коэфициенты k (угол наклона) y=k x +b для всех линий
если коэфициент для точки лежит в пределах (больше равно и меньше равно) от минимального коэффициента до максимального, то относительно этой точки i искомая лежит внутри фигуры.
продолжаем для всех точек. если в какой-то точка лежит вне - то проверяемая точка не принадлежит. если для всех принадлежит - то да. точка внутри.
но процедура годится только для выпуклых многоугольников, например треугольников.
простой алгоритм
к = (y_1-y_2)/(x_1-x_2)
но есть проблемка, когда линия вертикальна, тогда получается бесконечность, что программа плохо обработает, нужно делать проверку и в ручную присваивать какое-то значение, которое при сравнении заменит бесконечность.
разбивая на все возможные треугольники (как и в первом варианте алгоритма) прогоняется до тех пор, пока не будет получен положительный ответ на принадлежность точки треугольнику. если везде отрицательно - то непринадлежит.
зы. типа умничаю, иков то хочется
Поделиться152008-07-03 08:44:23
Призовые, надеюсь, возвращать не придется мне...
20% вознаграждения снято.
Поделиться162008-07-03 08:44:36
на пальцах:
на пальцах не надо.
Алгоритм на каком либо языке программирования.
Поделиться172008-07-03 11:45:41
фукция нахождения коэффицента к от 2 точек
find_k(x1,y1,x2,y2):=
{
if x1==x2 then k=(y1-y2)*10000000
else к = (y1-y2)/(x1-x2)
}
организуем циклы
flag=false boolean;
for i=1 to n-2 do {
for j=i+1 to n-1 {
for k=j+1 to n {
if (i!=j)&&(j!=k)&&(i!=k) then { // проверка для 1 треугольника.
//для первой вершины
k1=find_k(x_i,y_i,x_j,y_j);
k2=find_k(x_i,y_i,x_k,y_k);
k3=find_k(x_i,y_i,X,Y);
if k1<k2 then {max_K=k1; min_K=k2}
else {max_K=k2; min_K=k1};
if (k1==k2==k3)or(max_k>=k3>=min_k) then {}// точка возможно принадлежит, продолжаем дальше
else {}// не принадлежит, продолжаем цикл , ушли из проверки этого треугольника
//для второй вершины
k1=find_k(x_j,y_j,x_i,y_i);
k2=find_k(x_j,y_j,x_k,y_k);
k3=find_k(x_j,y_j,X,Y);
if k1<k2 then {max_K=k1; min_K=k2}
else {max_K=k2; min_K=k1};
if (k1==k2==k3)or(max_k>=k3>=min_k) then {flag=true}// точка принадлежит треугольнику (заканчиваем все циклы)
else {}// не принадлежит треугольнику, идем в другой, продолжаем циклы
}}}}
если по итогом всех циклов flag даст значение true то точка принадлежит
Отредактировано vvv (2008-07-03 21:47:11)
Поделиться182008-07-26 19:37:04
Формула отображения месторождений в ЗК поменяна на правильную. (немного доработанный алгоритм от Pocak)
Проверяем у всех ли поля 0 и 1 уровней в пределах ЗК.
PS. ЗК - территория ограниченная поселениями игрока (НЕ порталами)