Геометру и программисту :-)

Можно обсуждать любые темы, хотя флудить тоже не стоит! :)
Post Reply
User avatar
Dalai
Equilibris Core Team
Equilibris Core Team
Posts: 2797
Joined: Sat Apr 02, 2005 17:38
Contact:

Геометру и программисту :-)

Post by Dalai »

Здравствуйте, мои маленькие и большие любители евклидовой геометрии, а также декартовых и полярных систем координат :D

Есть задачка, ради умственной гимнастики :hz:, но и с реальным применением, о котором мы пока умолчим. ;)

Есть плоская фигура, пусть квадрат, но не важно. Это континент. На нем расположены страны. Пока непонятно, как именно расположены :???:. Короли :king: стоят вокруг вас и просят выделить надел. Ну понятно, что королей не 9, не 16 и не 25, чтобы поделить всем поровну одинаковыми клеточками. Да и вообще непонятно, сколько их там... Поэтому нарезать надо наделов примерное количество, сопоставимых размеров, с неровными границами и в идеале - каким-нить случайным образом, чтобы обделенные короли вас просто не зарезали королевским церемониальным кинжалом :knight: в порыве зависти к более удачливым :clower: коллегам.

У вас в распоряжении - "попка-дурак", который, если его пнуть, выдает случайные числа от 1 до 1000, линейка для черчения многокилометровых прямых линий, не уступающий ей в размерах циркуль, счеты и знания геометрии. Ай, ладно, дам еще таблицы Брадиса :read:, совсем отпуск получится, ну ничего ::)

Опишите алгоритм, как вы будете выполнять такую задачу. Если чего еще надо - просите, может и выдам. Но помните - короли - еще те психи :napoleon:, если какой-нить кусочек окажется спорным, или наоборот, никому не достанется - дипломатия не поможет. :cry:
Web-designer wanted. "Once a knight, always a knight, but once a King is once too often!" (c) Sir Bella of Eastmarch
User avatar
Accolon
Level 24 Hero
Level 24 Hero
Posts: 2564
Joined: Mon Jul 04, 2005 03:07

Post by Accolon »

Похоже, любители свою любофф пропылы. :)
Похмельнемся тады. :beer:

Задачку я бы решал таким образом. По числу королей посылаем гонцов изучать доставшийся $) для делёжки континент. Попка дурак решает, откуда каждый гонец начнет свой путь. Но гонцы они не обычные. Они умеют двоится. А самый первый может даже троится. Двоятся они тогда, когда пройдя день пути (со всеми пенальти) по карте в направлении, подсказанном попкой дураком (с отклонением не менее нуля и не более 90 градусов по Цельсию :) от предыдущего) и учитывая проходимость в данном направлении (т.е., если попка дурак говорит "иди строго на север", а строго на север непроходимые горы или океан, то пытаемся обогнуть их по кратчайшему пути), разбивают лагерь, говоря: "Вот здесь можно быть верстовому столбу короля нашего, т.к. гонцов жадных соседей-королей пока не встретили". И изучают так гонцы континент, пока соседей не встретят, раздваиваясь после каждого лагеря. А когда встретят соседей или зайдут в тупик, то не идут дальше. Жадно и нетерпеливо ждут короли своих гонцов. И собрав сведения от них о всех разбитых ими привалов, выбирают для столицы наиболее удаленный и от соседей и тупиков лагерь-привал, чтоб начать наводить порядки на доставшейся территории железным кулаком и коварством магии. К границам государств, подальше от столиц жадных королей, собираются все, кто хочет жить свободно. Столица поддерживает короля в лице алигмента его, а какой расы будут ближайшие два или один город, решает попка дурак. Но не может быть ближайший к столице город противником или нейтральным к нему. И варвары всегда найдут варваров, а остальным придется вступать в альянс, навязанный капризами попки дурака. Если решит попка дурак, что ближайший к столице лагерь будет городом одного алигмента с ним, то другой ближайший к столице лагерь станет просто пристанищем для существ или жилищем грифонов или вампиров и даже драконов, охраняющими свои сокровища. Если лагерь будет городом-союзником, то другой ближайший лагерь будет также союзником столице, но другой расы.
User avatar
Efirus
Equilibris Beta-Tester
Equilibris Beta-Tester
Posts: 59
Joined: Wed May 04, 2005 15:42
Location: Москва

Post by Efirus »

Ну вообще-то очень многое зависит от фигуры, которую надо делить. Если это ода из правильных фигур, то еще можно поломать голову, а если - какая нибудь произвольная загогулина, то ничего хорощего получиться не может... Это я говорю как геометр, потому что програмист из меня ни в зуь нногой :D
Да будет Свет! Да сгинет Тьма! Да воспылают рвением сердца!!!

Да будет Тьма! Да сгинет Свет! Да предадутся грешники порокам!!!
User avatar
Dalai
Equilibris Core Team
Equilibris Core Team
Posts: 2797
Joined: Sat Apr 02, 2005 17:38
Contact:

Post by Dalai »

2 Efirus
Ну вообще-то очень многое зависит от фигуры, которую надо делить. Если это ода из правильных фигур, то еще можно поломать голову, а если - какая нибудь произвольная загогулина, то ничего хорощего получиться не может
Ладно, шутки в сторону. Есть фигура - многоугольник, у которой известно количество вершин и их координаты. Определенность, таким образом, полная.

2 Accolon
Очень интересно. Жаль, что я слишком непонятно сформулировал условие. В результате ты стал решать задачу с чуть более поздней отметки. Тем не менее, интересно.
Один, вопрос: почему первый гонец умеет троиться, когда остальные - только двоиться?

2 All
Континент нам достался неразмеченный. Наша задача - не только раздать что есть, а сначала назначить, где будет трава, где песок, а где - непрохдимые горы или широкие реки. Идеально поровну делить не нужно. Нужно, скорее, создать профиль континента. Задача "поделить все на всех" пусть будет второстепенной пока.
Web-designer wanted. "Once a knight, always a knight, but once a King is once too often!" (c) Sir Bella of Eastmarch
User avatar
Accolon
Level 24 Hero
Level 24 Hero
Posts: 2564
Joined: Mon Jul 04, 2005 03:07

Post by Accolon »

Dalai: Один, вопрос: почему первый гонец умеет троиться, когда остальные - только двоиться?

Потому что троясь первым, мы охватываем достаточное количество направлений изучения континента - три. А остальным, в этом случае, достаточно двоится, потому что двигаться они будут именно в сторону непознанных земель. В общем, можно покрыть весь изучаемый континент сетью из треугольников и каждый лагерь такого исследование будет узелком в этой сети. Узелком, в который входит один луч и из которого выходят два луча дальнейшего изучения. Эти два луча дальнейшего изучения могут быть строго под углами в 60 и -60 градусов по отношению к лучу, входящему в узел. А могут быть и с рандомной бякой-поправкой, этих идеальных 60 градусов, но не настолько большой, чтоб возвращаться вспять или пересекаться со вторым лучом исследования. Я не знаю, стоит ли вводить в данную схему рандом для корректировки угла лучей дальнейшего исследования. Но рандом в первоначальные три луча исследования вводить стоит: задать рандомное направление для распространение лучей этой трехлучевой звезды. И для увеличения точности исследования континента, нужно задавать не дневной путь (20 клеток), а три-пять клеток. А иначе проход в некоторых ущельях можно будет просто незаметить.
Dalai: Континент нам достался неразмеченный. Наша задача - не только раздать что есть, а сначала назначить, где будет трава, где песок, а где - непроходимые горы или широкие реки. Идеально поровну делить не нужно. Нужно, скорее, создать профиль континента.

В свое время баловались профилями ландшафтов. :) Кстати, в игрушках серии WarLords, извечного конкурента серии Героев, неплохие схемы построения рандомных карт. Для наглядности начну с двумерного ландшафта.

1. Берем отрезок случайной длины в некоторых рамках и строим его под случайным углом в некоторых пределах по отношению к нулевому уровню. Для определения первоначального положения отрезка над нулевым уровнем Zo (зет нулевое) используем случайное число, которое должно находится в некоторых границах Zmin, Zmax. Затем определяем случайную длину отрезка d, также находящееся в некоторых пределах. И, наконец, определяем угол t, который может быть отрицательным или положительным, по отношению к Zo, которое также является некоторой направленной осью под углом в нуль градусов. Если очередной отрезок своей конечной точкой выходит за Zmin или Zmax, то знак угла t меняем на противоположный. Добавлю, что длина d не должна превышать (abs(Zmin)+abs(Zmax))/2, а иначе при некоторых углах и длинах отрезка d произойдет зацикливание: программа начнет безуспешно менять знак угла t на противоположный, а отрезок не впишется ни в Zmin, ни в Zmax.

Так, отрезок за отрезком, выстраиваем основной профиль ландшафта. Чем меньше максимально-возможная длина отрезка и угол его наклона по отношению к Zo, тем более гладкий ландшафт получим. Если хотим "континент", окруженный водой, то стартовую точку первого отрезка и конечную точку последнего отрезка, принудительно задаем ниже Zo. Если хотим озеро или море в середине "континента", то средние точки задаем ниже Zo и делаем для нескольких отрезков "дна" небольшое изменение для угла t.

2. Более замороченный, но и более универсальный метод: берем линию Zo и начинаем ее деформировать, давя на неё из случайных точек над Zo и под Zo. Это приведет к образованию "гор" и "впадин".

Случай 2 хорош тем, что его модель легко распространить на плоскость: бросаем на плоскость и под плоскость случайное количество точек приложения силы со случайной величиной, чтобы, деформируя плоскость, получить ландшафт. Замечу, что ландшафт не обязательно получить за один проход, но лучше будет изначально сформировать основу, а затем уточнять её такими же случайными бросками силы, но с меньшей величиной силы воздействия. Далее точки приложения силы соединяем друг с другом линиями так, чтоб они образовывали треугольники: т.е., соединяем линиями три ближайших точки. Получившийся, из плоскости Zo, трехмерный ландшафт, делим на равные по высоте слои при помощи плоскостей, параллельных Zo: получим изометрические линии, как на географических картах, только куда более грубые, но нам и этого хватит. И слои, попадающие в один из диапазонов по высоте, заполним: глубокой водой, мелководьем, рифами и отмелями, песком или болотом или озером или расплавленной лавой, степью или пустыней или остывшей лавой или лиственным лесом, хвойным лесом, камнями или холмами или предгорьями, высокими горами, снежными пиками и извергающимися вулканами. Используя рандом, решим, что где будет находится: снег, песок, лава, каменная почва, проклятой землей и болотами. При этом учтём связки, например: болото не может граничить с лавой; песок пустыни не может граничить с плодородной почвой. И на плодородной почве лиственные деревья, яркие цветы и трава должны быть чаще хвойных деревьев, блеклых цветов и травы. Под некоторые деревья накидаем бяк, похожих на зеленые моховые извилистые грязные лужи (vegetation - moss). Под другие: цветы. Под третьи: грибы. На кусты кое-где рассадим птиц. На озера запустим уток, лягушек, крокодилов. Взрастим камыш, кувшинки и лотос. Где много лягушек - мало крокодилов и уток. Где много уток - мало крокодилов. Где много камыша - кувшинки реже и, значит, почти не цветут. На плодородную почву накидаем грядок и крестьянских домов. К домам подсадим петухов и свиней. Крестьяне, разводящие свиней, должны садить овощи; тогда как разводящие птиц - зерно.

Затем, на континенте рисуем водяные реки: начинают путь свой в горах или родником и впадают в болота, океан, озера. Так же и с реками лавы: начинают путь свой с вулкана или озера лавы и исчезают в красных расщелинах или лавовых озерах. А вот дороги надо строить от замков к замкам и шахтам. Многие двеллинги лучше ставить обособленно или вдоль дороги, чем вести дороги к ним. К сокровищницам могут быть заросшие дороги (например, кладбище). Но дорога к драконнице или башне магов, жаждущих уединения, должны быть достаточно большой редкостью.

Что касается соседства различных декоративных элементов друг с другом, то лучше альянсы для растений, животных, почвы и прочего, брать из множества таблиц (или одной большой таблицы), где каждому элементу соответствует вероятность соседства с ним другого элемента. Например, если свиньи будут постоянно рыться в пшенице, то интуитивно это будет напрягать. Но наглая свинья, единственная из нескольких карт, умудрившаяся залезть в пшеницу, будет восприниматься как достопримечательность ландшафта. :) Для дорог так же должны быть вероятностные таблицы. Связка дорогой замка с замком наиболее велика, но не единица. Также нужны таблицы вероятностей разного типа дорог для разных связок. Замок с замком скорее всего будет связывать мощеная дорога, а для ферм достаточно глиняной.
User avatar
Dalai
Equilibris Core Team
Equilibris Core Team
Posts: 2797
Joined: Sat Apr 02, 2005 17:38
Contact:

Post by Dalai »

2 Accolon
Блеск! Давай углубляться :)

Итак, первый гонец становится на случайную точку на континенте или на его границе? Я так понимаю, что первое. Потом он троится, каждый из лучей периодически двоится. Так?
Узелком, в который входит один луч и из которого выходят два луча дальнейшего изучения.
Похоже. что так.

Только непонятно следующее:
В общем, можно покрыть весь изучаемый континент сетью из треугольников и каждый лагерь такого исследование будет узелком в этой сети.
Как ты перейдешь к треугольникам? Если я все правльно понял, то распространение гонцов похоже на рост трещины. Но все гладко, пока идут первые трещины. Потом они могут начать пересекать ранее проложенные маршруты, и наступит бардак. Поясни.
А могут быть и с рандомной бякой-поправкой, этих идеальных 60 градусов, но не настолько большой, чтоб возвращаться вспять или пересекаться со вторым лучом исследования.
Имхо, недостижимо. Если возвратов не будет - будет покрыта не вся территория, а если возвраты будут - они должны возвращаться точно в лагеря. Ровно 60 градусов будет выглядеть неестественно, поэтому место рандому должно быть.
Для наглядности начну с двумерного ландшафта.
Дальше ты рисуешь принцип создания рандомной карты высот? И ее можно использовать либо для полноценного рельефа, либо просто для определения суши и моря, так?

Если первое - то что в 4-х, что даже в трехмерных 5-х :) высота точки не имеет никакого значения. Только немного эстетики.
Более замороченный, но и более универсальный метод
Этот метод использовался для искривления прямых границ между зонами при генерации карт в 3-х героях.
Используя рандом, решим, что где будет находится: снег, песок, лава, каменная почва, проклятой землей и болотами. При этом учтём связки, например: болото не может граничить с лавой; песок пустыни не может граничить с плодородной почвой. И на плодородной почве лиственные деревья, яркие цветы и трава должны быть чаще хвойных деревьев, блеклых цветов и травы. Под некоторые деревья накидаем бяк, похожих на зеленые моховые извилистые грязные лужи (vegetation - moss). Под другие: цветы. Под третьи: грибы. На кусты кое-где рассадим птиц. На озера запустим уток, лягушек, крокодилов. Взрастим камыш, кувшинки и лотос. Где много лягушек - мало крокодилов и уток. Где много уток - мало крокодилов. Где много камыша - кувшинки реже и, значит, почти не цветут. На плодородную почву накидаем грядок и крестьянских домов. К домам подсадим петухов и свиней. Крестьяне, разводящие свиней, должны садить овощи; тогда как разводящие птиц - зерно.

Затем, на континенте рисуем водяные реки: начинают путь свой в горах или родником и впадают в болота, океан, озера. Так же и с реками лавы: начинают путь свой с вулкана или озера лавы и исчезают в красных расщелинах или лавовых озерах. А вот дороги надо строить от замков к замкам и шахтам. Многие двеллинги лучше ставить обособленно или вдоль дороги, чем вести дороги к ним. К сокровищницам могут быть заросшие дороги (например, кладбище). Но дорога к драконнице или башне магов, жаждущих уединения, должны быть достаточно большой редкостью.

Что касается соседства различных декоративных элементов друг с другом, то лучше альянсы для растений, животных, почвы и прочего, брать из множества таблиц (или одной большой таблицы), где каждому элементу соответствует вероятность соседства с ним другого элемента. Например, если свиньи будут постоянно рыться в пшенице, то интуитивно это будет напрягать. Но наглая свинья, единственная из нескольких карт, умудрившаяся залезть в пшеницу, будет восприниматься как достопримечательность ландшафта. Для дорог так же должны быть вероятностные таблицы. Связка дорогой замка с замком наиболее велика, но не единица. Также нужны таблицы вероятностей разного типа дорог для разных связок. Замок с замком скорее всего будет связывать мощеная дорога, а для ферм достаточно глиняной.
Просто приятно было читать :) Красота! ::)
Web-designer wanted. "Once a knight, always a knight, but once a King is once too often!" (c) Sir Bella of Eastmarch
User avatar
Accolon
Level 24 Hero
Level 24 Hero
Posts: 2564
Joined: Mon Jul 04, 2005 03:07

Post by Accolon »

Dalai: Итак, первый гонец становится на случайную точку на континенте или на его границе? Я так понимаю, что первое. Потом он троится, каждый из лучей периодически двоится. Так?
Случайная точка может попасть на границу континента, но мы не будем заставлять гонцов начинать свой путь именно с границы. Их закинули десантом :) на континент. Думаю, лучше будет, если гонцы начнут свой путь не совсем с границ карты, а в некотором удалении от них.
Dalai: Как ты перейдешь к треугольникам? Если я все правильно понял, то распространение гонцов похоже на рост трещины. Но все гладко, пока идут первые трещины. Потом они могут начать пересекать ранее проложенные маршруты, и наступит бардак. Поясни.
1. Я и ошибся и неясно выразился. С тремя лучами изначальными и двоящимися в последствии, континент будет покрываться шестиугольниками (исправил ошибку). И маршруты гонцов-исследователей с высоты птичьего полета будут напоминать пчелиные соты. Для простоты лучше пока выкинуть рандом (к нему достаточно просто вернуться) и считать, что длина лучей фиксирована и двоятся они по отношению к изначальному направлению их родителя на минус шестьдесят и плюс шестьдесят градусов (исправил неясность) или на 120 градусов по отношению друг к другу. Если лучи одного цвета встречаются друг с другом, то они сливаются, образуя один, до следующего лагеря. Потом опять разделяются. Но нам нужны не лучи, а узлы, которые они образуют. Потому что эти узлы суть верстовые столбы и для охватываемой площади владений и для проходимой армией местности. Если вводим рандом, то под "встречей" понимаем не идеализированное попадание гонцов в некоторую точку, а их встречу в некоторой окрестности или видимости. Тогда стоянки будут представлять из себя не точки, а заданную круглую площадь встречи, из которой выходит один луч. Думаю, что диаметр площади встречи для рандома должен быть не меньше минимально допустимой рандомной длины луча.
Итак: если стоянка образована одним лучом, то из нее выходят два; если образована встречей двух, то из нее выходит один луч, который впоследствии будет двоится, если не встретит своих.
2. Задачи с формированием и освоением континента лучше решать совместно. Треугольники у меня крутились в голове, потому что это наиболее универсальная фигура для моделирования поверхности. Берем плоскость, делим ее на равносторонние треугольники. Случайно определяем несколько точек (А) основного рельефа континента из узлов соприкосновения вершин треугольников и начинаем давить на плоскость будущего континента. Оставшиеся узлы треугольной сети пересчитываем под (А) так, чтоб они лежали на плоскости, образованной тремя ближайшими к данному узлу точками множества (А). Далее уменьшаем величину сил воздействия и определяем множество точек (В), для которого также пересчитываем все оставшиеся точки-узлы. Думаю, достаточно сделать эту процедуру еще один раз для (С). Количество точек (С) предлагаю сделать в три раза большим (В), а количество точек (В) в три раза большим (А). Количество узлов, подчиненных (С), в три раза больше (С). Например, если для (А) количество точек будет равно 17, то для (В) == 51, для (С) == 153 и оставшихся не менее 459. Итого: не менее 680 точек-узлов (сетки 27 x 27, наверное, недостаточно). Множествам (А), (В), (С) и оставшимся допустимо пересекаться, т.е. одна и та же точка-узел может быть во всех четырех множествах.
2.а. Замечу, что направление силы давления может быть не строго вертикальным. Только разброс направлений предлагаю считать не по равномерной вероятности, а Гауссовой. Для этого достаточно отклонение от вертикального давления представить в виде суммы составляющих случайных чисел. Например, если хотим, чтоб направление давления не превышало 15 градусов от строго-вертикального, то для каждой составляющей угла вектора направления можно посчитать сумму пяти рандомных чисел от минус 3 до плюс 3 градусов. Тогда искомый градус не будет превышать плюс 15 и будет не менее минус 15 градусов. Если есть желание большей случайности, то можно сложить не пять раз по три градуса, а три по пять или два по семь с половиной. Такие же соображения относятся и к величине силы: если она попала в слой для поверхности воды и равнин, то не должна вылезти за него ни в виде впадины, ни в виде горы. По крайней мере, таковое должно быть редким, украшающим явлением, а не обычным безобразием.
2.б. Треугольники формируемого материка, площадь которых будет заметно отличаться то площади остальных треугольников, верные кандидаты для: вулканов; гейзеров; озер из лавы или воды; трещин; переходов в лабиринты подземелья; рифов и водоворотов; родников, как источников рек. Для этого можно отобрать N-ое количество треугольников с максимальной площадью и в зависимости от высоты их по отношению к нулевому уровню решить, что они из себя будут представлять на карте.
3. Имея в массиве рельеф континента (координаты точки-узла и еще высота и еще расстояния до шести ближайших точек) можно использовать это так же и для поиска путей по нему и для определения местоположения столиц и замков на карте. Двигаемся по континенту, скача по узловым точкам и не выходя из слоя, относящегося к равнинам, и, считаем дни достижения границ карты или встречи с посланными соперника. Далее определяем для столицы место, равноудаленное от границ карты и/или от соперников. Так же можно попробовать сложить длины путей гонцов всех цветов и разделить общую длину на количество цветов-участников. После уменьшаем эту усредненную длину для формирования нейтральных зон и делим её пополам. Вот и будет это расстоянием от границы карты до столицы плюс-минус случай.
Dalai: Дальше ты рисуешь принцип создания рандомной карты высот? И ее можно использовать либо для полноценного рельефа, либо просто для определения суши и моря, так?
Вообще для всего. Для определения, можно ли гору поставить в этом конкретном месте и какую именно или достаточно положить большой камень. Для определения проходимого пути и формирования дорог и русла рек. Для определения наиболее вероятного семейства растений (напр., ели любят предгорье, лиственные - равнины, сосны - русла рек). Для определения типа почвы, а значит, и цветов или грибов или мха. Можно учесть и для алигмента нейтральных монстров и замков. Например, бехемозы любят каменистую почву, т.к. вязнут в болоте и т.д.
VKB
Equilibris Programmer
Equilibris Programmer
Posts: 6
Joined: Mon Jun 06, 2005 11:01

Re: Геометру и программисту :-)

Post by VKB »

Dalai wrote:...Есть плоская фигура, пусть квадрат...
Квадрат - замечательная фигура :D ! Легко и быстро делится на любое число равных кусочков (а не только на 9 и 16 ;) ). Без всяких таблиц Брадиса и даже без Попки-дурака :) .

Ну а если "по делу", то предлагаю такой алгоритм.

Случайно раскидываем королей по квадрату, потом начинается итерационный процесс. Сначала каждому выделяется ближайшая к нему территория. То есть территория придаётся тому королю, который ближе всего к ней расположен. Грубо поделили. Причём границы территорий будут - прямые линии. Потом тем, у кого получилась большая территория её уменьшаем, тем у кого маленькая - увеличиваем.

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

Заканчиваем, когда разница между площадями владений королей станет приемлемо малой.

P.S. Так как конкретная задача у нас, я полагаю, всё же дискретная, то вычислять принаджежность территории будет намного проще в силу её конечности, но зато со сходимостью могут быть некоторые проблемы.

P.P.S. Если королей более менее равномерно распределить по квадрату, то и территории у них будут красивые, компактненькие. Если же где-то будет скученность королей, то границы могут получиться довольно причудливой формы.
User avatar
Accolon
Level 24 Hero
Level 24 Hero
Posts: 2564
Joined: Mon Jul 04, 2005 03:07

Post by Accolon »

VKB: Недостаток такого подхода: мир не будет представляться чем-то глобальным, целостным, единым. И интуитивно это будет отслеживаться и, следовательно, напрягать.

p.s. С 5500 всех. :) 500 ответов буквально $) за неделю.
VKB
Equilibris Programmer
Equilibris Programmer
Posts: 6
Joined: Mon Jun 06, 2005 11:01

Post by VKB »

Accolon wrote:VKB: Недостаток такого подхода: мир не будет представляться чем-то глобальным, целостным, единым. И интуитивно это будет отслеживаться и, следовательно, напрягать.
А поподробнее можно? Что есть глобальность, целостность и единство мира? И почему мой метод не даст такого ощущения? Если имется ввиду то, что границы будут слишком гладкими, неизрезаными, то я конечно согласен, хотя меня это не напрягает.

В любом случае мне кажется проще предварительно распределить территорию с гладкими границами, а потом их изуродовать, чтоб они стали неровными. Например если после распределения каждому королю дать несколько вассалов (их количество будет определять степень изрезанности окончательных границ), случайно раскидать их по его территории, по тому же алгоритму распределить границы между вассалами всех королей, но объеденить кусочки территорий вассалов одного короля. С учётом дискретности при большом количестве вассалов уже будет незаметно, что границы - куски окружностей.

Ещё вариант - алгоритм в игре Генерал. Я в своё время немного играл в неё (http://newgame.agava.ru/eng/g_top10.html) - там как раз и реализован алгортим примерного распределения территорий между государствами, причём именно на квадрате и границы неровные у территорий, площади получаемых государств колеблются в пределах 90-110% (редко дальше) от среднего. Посмотрите - если это устроит, можно попробовать расковырять оттуда алгоритм. Или может быть его автор Дмитрий Гусаров сам исходники отдаст - по-моему он давно генералом не занимается. Писал он его на Дельфи помнится.
User avatar
Accolon
Level 24 Hero
Level 24 Hero
Posts: 2564
Joined: Mon Jul 04, 2005 03:07

Post by Accolon »

VKB: А поподробнее можно? Что есть глобальность, целостность и единство мира? И почему мой метод не даст такого ощущения? Если имеется ввиду то, что границы будут слишком гладкими, неизрезанными, то я конечно согласен, хотя меня это не напрягает.
Похоже, я перепрыгнул. Если ограничиваться рамками поставленной задачи, то все ок - никаких недостатков. Но карта в Героях содержит непроходимые участки, поэтому границы государств лучше установить именно через исследование мира гонцами. Если же ландшафт формировать для каждого государства отдельно, установив его границы, то вся карта будет похожа на лоскутное одеяло: и в этом случае нет целостности. Но для определения границ государств на плоскости без областей исключения (горы, вода, непроходимые элементы карты) твой метод идеален.
VKB
Equilibris Programmer
Equilibris Programmer
Posts: 6
Joined: Mon Jun 06, 2005 11:01

Post by VKB »

Accolon wrote:Похоже, я перепрыгнул. Если ограничиваться рамками поставленной задачи, то все ок - никаких недостатков. Но карта в Героях содержит непроходимые участки, поэтому границы государств лучше установить именно через исследование мира гонцами. Если же ландшафт формировать для каждого государства отдельно, установив его границы, то вся карта будет похожа на лоскутное одеяло: и в этом случае нет целостности. Но для определения границ государств на плоскости без областей исключения (горы, вода, непроходимые элементы карты) твой метод идеален.
Вообще-то изначально шла речь об эвклидовом пространстве :) . Нанесение на карту всяких препятствий и участков разной степени проходимости искажает эвклидову геометрию. Но, в принципе особых проблем я тут не вижу. Мой алгоритм остаётся в силе, только надо по-другому вычислять расстояния на карте. Кстати процесс вычисления расстояний на такой неэвклидовой карте будет включать нечто подобное твоему методу гонцов. Но только никаких рандомов не потребуется. Расстояние между точками - это точно вычислимая (в дискретном случае) величина при известных значениях "проходимости" местности в каждой точке.
User avatar
Accolon
Level 24 Hero
Level 24 Hero
Posts: 2564
Joined: Mon Jul 04, 2005 03:07

Post by Accolon »

VKB: Кстати процесс вычисления расстояний на такой неэвклидовой карте будет включать нечто подобное твоему методу гонцов. Но только никаких рандомов не потребуется. Расстояние между точками - это точно вычислимая (в дискретном случае) величина при известных значениях "проходимости" местности в каждой точке.
Вот о процессе вычисления расстояний на неэвклидовой карте хочется услышать подробнее. Что-то вроде градиентного метода (анализ производных к поверхности)?
Рандом - это лишь один из методов. Он долгий, но точный... после 10000 тыкания в стенку и попадания в лазейку, которую $) не отслеживает равномерная сетка.
VKB
Equilibris Programmer
Equilibris Programmer
Posts: 6
Joined: Mon Jun 06, 2005 11:01

Post by VKB »

Accolon wrote:Вот о процессе вычисления расстояний на неэвклидовой карте хочется услышать подробнее. Что-то вроде градиентного метода (анализ производных к поверхности)?
Рандом - это лишь один из методов. Он долгий, но точный... после 10000 тыкания в стенку и попадания в лазейку, которую $) не отслеживает равномерная сетка.
Можно использовать алгоритм, подобный вычислению кратчайшего пути для шарика в игре LINES.

Исходные условия - все траектории состоят из кусочков прямых, соединяющих соседние точки (по горизонтали, вертикали или диагонали). Расстояния между такими соседними точками однозначно определяются типом местности, наличием и качеством дорог (ну строго говоря ещё влияет родственность территории и pathfinding, но мы это учитывать не будем, хотя можно - алгоритм не сильно усложнится, но я думаю, что это не нужно, потому что это уже характеристика не карты только, а ещё и войска). А дальше последовательно проходим все соседние точки от уже достигнутых и помечаем расстояние, которое мы прошли. Если (что естественно) до какой-то точки мы уже доходили другим путём, то сохраняем там наименьшее значение. Все достигнутые пункты сохраняем в сортированом списке (сортировка естественно по расстоянию). Пункты будут 3-х типов.
1. Полностью обработанные с окончательно вычисленным расстоянием
2. Попавшие в список для обработки (то есть уже достижимые), но с ещё не окончательно утвеждённым расстоянием
3. Пока никак не обработанные.

В начале список 1 пустой, список 2 состоит только из исходной точки и расстояние до неё естественно ровно 0.
Запускаем цикл. На каждом шаге выбираем самую близкую точку из списка 2, перемещаем её в список 1 и добавляем 8 точек вокруг неё в список 2 с соответствующими расстояниями. Если некоторые из этих 8 точек недостижимы (например находятся вне карты или там какое-то препятствие), мы их не добавляем в список. Если добавляемый пункт уже есть в списке 2, мы проверяем, какое там было расстояние от предыдущих траекторий. Если новое меньше, пишем новое, иначе оставляем старое.
Заканчиваем, когда список 2 станет пустым.

Побочный эффект этого алгоритма - можно вычислить не только расстояние между точками, но и геодезическую траекторию, которая будет иметь длину, равную расстоянию между ними.
User avatar
Accolon
Level 24 Hero
Level 24 Hero
Posts: 2564
Joined: Mon Jul 04, 2005 03:07

Post by Accolon »

VKB: В общем, нужно проверять все эти рассуждения практически. Я знаком с программированием под Дос-ом, но под Виндами не программировал. Родной язык паскаль, но щас больше тянет к си. Интересно, есть ли какие виндовозные компиляторы для си или паскаля (дельфи) без всяких извратов с окнами форм, но с поддержкой функций DirectX?
VKB
Equilibris Programmer
Equilibris Programmer
Posts: 6
Joined: Mon Jun 06, 2005 11:01

Post by VKB »

Accolon wrote:VKB: В общем, нужно проверять все эти рассуждения практически. Я знаком с программированием под Дос-ом, но под Виндами не программировал. Родной язык паскаль, но щас больше тянет к си. Интересно, есть ли какие виндовозные компиляторы для си или паскаля (дельфи) без всяких извратов с окнами форм, но с поддержкой функций DirectX?
У меня тоже родной язык паскаль, но на си писать не тянет :-). ДиректИкс не программировал никогда, но насчёт компиляторов "без извратов" как-то не понял :???: . Окна форм - это ж и есть визуальное программирование! Удобно :-). Если мне не надо никаких окон я пишу консольный аппликейшн. На си с этим ещё проще. А директИкс ... без окон ... не знаю. Мне это не надо :-).

P.S. Поверять практически алгоритм конечно нужно. Я изложил лишь схему или идею алгоритма. Но считаю, что этого должно хватить, чтоб уже сделать работающий алгоритм. Мелкие упущения в процессе реализации уточнить будет несложно (например я не указал что в список 2 помимо недостижимых пунктов мы не добавляем и пункты, которые уже попали в список 1, но это же и так понятно из общей идеи)
Post Reply