У меня такой вопрос как разбить фигуры на прямоугольники?
возьмем такую ситуацию, что вам заранее известна форма, и имеются точки. нужно разбить фигуру на прямоугольники (rect), дело в том что саму область-фигуру не добавишь в регион. По любому надо разбивать на ректы. Ими проще проверять лежит ли точка внутри ректа или нет, чем какая то фигура.
Я уже многое сделал, у меня система находит эту фигуру. И надо после разбить на ректы.
Вот пример уже имеются 6 точек p1-p6, могу найти p7-p8. Теперь надо как-то собрать ректы (на глазок понятно что там 3, а то и меньше 2). надо как-то написать алгоритм, что эти отрезки образовали ректы
Фигуры могут быть любой формы
находил такой вопрос вот здесь, но ответа не нашел. алгоритм просто нужен

Вот конечный вариант. Переделал на хэш-таблицу
Исправил многие подвисы - большая часть которых эта строки. Именно строки вызывают подвисы. Они не только в дебагах, но в ExecuteFunc, строковое название молнии и пр. И теперь молнии могу миллиардами создавать без проблем. Я тексты строк все сохранил в бд. Без этого почему у юнитов анимация ходьбы поддергивалась.
Теперь все работает как надо и как часики. Единственная зараза - когда строю несколько деревней, потом вылетает чего-то с критом. Но это происходит очень и очень редко. где-то с шансом 0.05%. Возможно либо работаю с несуществующими объектами либо пытаюсь выгрузить из хэша не существующие данные. У вара какие то проблемы.
Пробовал вставить проверки GetHandleId(object) > 0 или HaveSavedReal или HaveSavedHandle - теперь сохранять карту не хочет. Пробую снова написать код

Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
27
DracoL1ch, оно почему-то зацикливается. Короче проблема в loop, не может выйти из цикла. Насчитывает счетчик за 590. Какие то проверки не работают значит. Переделать надо тут. Неизвестно почему, это невидимое. Наверн дело в регионе. Баг работает единожды в едином случае. Этот участок не успевает поделиться и добавиться. Если забить на это, и купить участок в другом месте. Потом там же работает нормально.
Vlod, да. не только это.
возможно и есть решения и проще.
эх. как это объяснить.
короче идея в том, чтобы можно было покупать участки земель. каждый игрок может иметь по несколько регионов, а мб и более десятки регионов.
регионы привязываются к определенным главным зданиям: хижина старейшины - деревня фермера, рядом с морем можно переделать в рыбацкую деревню, или деревню лесорубов
крепость - форпост у границы,
шахта - горнодобывающее поселение
когда заканчивается строительство, то дается начальный прямоугольный участок. Участок главного здания мб измениться, если рядом рядом участок принадлежит другому региону. Главные здания не должны строится близ друг друга, у них есть определенный радиус для развития.
На этом регионе проще отследить: строительство, заход противника, ии
эти регионы можно развивать, они могут разрастаться. То есть можно было бы покупать землю через меню главного здания. То есть там обычная игрушечная ферма, пустышка-здание с эффектом москитов, чтобы можно было ставить не только на свободный участок для стройки, но и на месте клифов, море и пр.
Решил я поделить на прямоугольные участки. Так как легче добавлять в регионы. Но этим есть проблемы, может лишнее добавлять. Также поделив на ректы, можно еще подсчитать площадь участка. Кстати у меня это идеально работает деление. С этим проблем нет. Есть другое, это система не работает как часы
кстати пробовал вместо регионов массив вершин ректов юзать. Но пока что это в зачатке находится. Написал пока не рабочий кож
18
Почему не подходит способ: поделить пространство на минимальные квадраты и помечать занятые?
30
Steal nerves, генеришь сетку, потом группируешь клетки в квадраты
27
Vlod, я кажется понял. Создаем квадратики мин 32x32 или хотя бы 64x64. Но это скока надо квадратов наделать в карте 64x64. С учетом того, что 1x1 в карте это 128x128. Опять алгоритмы придумывать, попробую пока со старым кодом вымучиться. Если не пойдет совсем уж, возьму на заметку
Кстати пробовал массивами точек группировать, но код уж получился ужасным
код
function IsPointInArea takes real x, real y, integer number, integer area returns boolean
local integer max = udg_number_of_areas[number] //максимальное число областей (регионов) у игрока
local integer a = (area-1)*100
local boolean b = false
if max == 0 then //если у игрока нет ни одной области, значит, точка ни на чем не модет лежать
    return false
endif
if number == 0 then
    loop
        exitwhen a>udg_CountRect_p1[area] or b //число ректов в регионе
        set b = PointInRect1(x,y,udg_rect_minx_p1[a], udg_rect_maxx_p1[a], udg_rect_miny_p1[a], udg_rect_maxy_p1[a])
        set a = a + 1
    endloop
endif
return b
endfunction
function IsPointInAreaOfPlayer takes real x, real y, integer number returns boolean
//МИНИ-ОБЗОР: Регионы (area) привязываются к главному зданию рыбацкой деревни, поместья, замка на окраине, фермы, горнодобывающего поместья и пр
//Сами деревни и поместья будут принадлежать определенным игрокам, следовательно, и регионы принадлежат тоже игрокам
//Регионы разделяются на более мелкие прямоугольные формы (ректы).
local integer max = udg_number_of_areas[number] //максимальное число областей (регионов) у игрока
local integer i = 0
local integer a
local boolean b = false
if max == 0 then //если у игрока нет ни одной области, значит, точка ни на чем не модет лежать
    return false
endif


if number == 0 then
loop
    exitwhen i>max or b
    set a = (udg_CountRect_p1[i]-1)*100
    if a>= 0 then
        loop
            exitwhen a>udg_CountRect_p1[i] or b //число ректов в регионе
            set b = PointInRect1(x,y,udg_rect_minx_p1[a], udg_rect_maxx_p1[a], udg_rect_miny_p1[a], udg_rect_maxy_p1[a])
            set a = a + 1
        endloop
    endif
    set i = i + 1
endloop


endif

return b
endfunction
function IsPointInRegionVillage takes real x, real y returns boolean
local integer i = 0
local boolean b = false
loop
    exitwhen i>11 or b
    if GetPlayerSlotState(Player(i)) == PLAYER_SLOT_STATE_PLAYING  then
        //call DisplayDebugTextToPlayer("красный игрок играет" )
        set b = IsPointInAreaOfPlayer(x,y,i)
    endif
    set i = i + 1
endloop

return b
endfunction
18
1. 8190 хватает на 90х90 ячеек. Существуют расширенные массивы, а в новых версиях ограничение приподняли. Используйте встроенную хеш-таблицу как двумерный массив, если этого не достаточно.
Это самый простой, но объемный по памяти метод. Исходил из того, что прямоугольные области у вас не удаляются/выделяются по несколько раз в секунду.
2. Также прямоугольные области можно представить в виде двух точек. Тогда для определения принадлежности точки нужно проверять во всех доступных регионах или использовать более сложную структуру хранения.
27
все нашел очень много мелких ошибок. и исправил.
исправил циклы, забыл поставить чистку и из этого цикл не завершал.
уменьшил кол-во шага. и пр
я не везде проставил в нативке call RegionAddRect(re, minx,miny,maxx-32,maxy-32
и многое другое. теперь работает. правда очень много дебагов и проверочных молнии, текстагов и поэтому подлагивает. если код в порядок привести будет норм. пока не закрываю тему. тк не знаю мб баги выявятся новые.
я еще не начинал пробовать как будет несколько регионов работать.


хотел спросить. существует ли лимит на число молнии? сколько могу создавать молнии
Загруженные файлы
38
Вы 4 дня не можете решить элементарную задачу?
Делается это просто - надо реализовать понятие "прямоугольник" (= 2 точки) и операции булева вычитания
И можно будет вычитать что угодно сколько угодно раз.
Вот реализация для 2д ректа stackoverflow.com/questions/25116092/boolean-operations-on-2d-re...
24
Вы 4 дня не можете решить элементарную задачу?
Не 4 дня, а 9 месяцев. При этом, задача вполне решена самим варом, нужно только правильно воспользоваться тем что есть.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.