www.newearth.ru

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » www.newearth.ru » Основной » Территория


Территория

Сообщений 1 страница 18 из 18

1

Нужен алгоритм попроще:
Есть x1-y1,x2-y2, ... xn-yn координаты поселений игрока.
Определить входит ли внутрь этой территории произвольно взятые координаты X-Y.

+1

2

Чей алгоритм будет вставлен в проект получит хорошее вознаграждение ресурсами в игре.

+1

3

Понадобицца:
Функция расстояния м-у точками
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 внутри поселения.

+1

4

Pocak написал(а):

Если хотя бы для одной проверки ф-я попдания в площадь треугольника вернет true - точка x0,y0 внутри поселения.

Wou.... Красиво... на первый взгляд должно работать....
твой реф номер 132?
Какое вознаграждение хочешь? Заказывай.

0

5

реф номер 132.
Денег (в тч игровых или прочих ресов и комплектующих) заказывать банально.
В отместку можешь подсобить временем, например, Атомными электростанциями уровня эдак 20 на моих колониях.
Думаю, красота оных сооружений будет достойной моих усилий...
ЗЫ. Крастоа решения в первую очередь зависит от четкости поставленной задачи..:)

0

6

Pocak написал(а):

Атомными электростанциями уровня эдак 20

Жесть....
Давайте останемся в рамках правил НЗ.

А то если проводить аналогию с жизнью.
НР (Новый русский) - скока тебе денжат подкинуть?
Оппонент - Да деньжат просить банально, вот тут мерсы я слышал есть шестисотые, так подгони мне девятисотый мерс.
:)

PS.

admin написал(а):

Чей алгоритм будет вставлен в проект получит хорошее вознаграждение ресурсами в игре.

0

7

Pocak написал(а):

Если хотя бы для одной проверки ф-я попдания в площадь треугольника вернет true - точка x0,y0 внутри поселения.

to Pocak реф 132 зачисленно 100000Cr за формулу

to Artppm реф 371 зачислено 50000Cr за честность, веру в справедливость, за то что напомнил про ту заплатку про которую он знает, и косвенное участие в быстром нахождении нужной формулы...

0

8

Спасибо!!!
Пошел Бухать))))

0

9

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

0

10

да красивое решение ;)

0

11

Pocak написал(а):

если количество координат поселений больше 3
то проверять попадание для точек 1,2,3... затем 1,2,4... затем 1,2,5... итд до 1,2,N

Неверное решение!

0

12

admin написал(а):

Pocak написал(а):если количество координат поселений больше 3то проверять попадание для точек 1,2,3... затем 1,2,4... затем 1,2,5... итд до 1,2,NНеверное решение!

Есть другое и оно правильней для любого многоугольника.
Проверка на вхождение точки в многоуггольник почти готово.
Пока работаем над создание максимальной ЗК с масива точек! :glasses:

0

13

Ну да... Недоработочка-с.. Извинияюсь.. На то и коллективный разум, дабы выискивать оные оплошности... Думаю, правильно зациклить по всем вариантам треугольников труда не составит. Долго - но надежно...:)
ЗЫ. Призовые, надеюсь, возвращать не придется мне... Потрачено уже почти все..:)

0

14

есть еще один вариант.

на пальцах: проводим линию от i-той вершины ко всем остальным, и к тестируемой точке.
строим уравнение прямой линии, находим коэфициенты k (угол наклона) y=k x +b для всех линий
если коэфициент для точки лежит в пределах (больше равно и меньше равно) от минимального коэффициента до максимального, то относительно этой точки i искомая лежит внутри фигуры.

продолжаем для всех точек. если в какой-то точка лежит вне - то проверяемая точка не принадлежит. если для всех принадлежит - то да. точка внутри.

но процедура годится только для выпуклых многоугольников, например треугольников.

простой алгоритм
к = (y_1-y_2)/(x_1-x_2)

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

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

зы. типа умничаю, иков то хочется :)

0

15

Pocak написал(а):

Призовые, надеюсь, возвращать не придется мне...

20% вознаграждения снято.

0

16

vvv написал(а):

на пальцах:

на пальцах не надо.
Алгоритм на каком либо языке программирования.

0

17

фукция нахождения коэффицента к от 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)

0

18

Формула отображения месторождений в ЗК поменяна на правильную. (немного доработанный алгоритм от Pocak)
Проверяем у всех ли поля 0 и 1 уровней в пределах ЗК.
PS. ЗК - территория ограниченная поселениями игрока (НЕ порталами)

0


Вы здесь » www.newearth.ru » Основной » Территория