Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.13;
Скачать: CL | DM;

Вниз

Генерация 2d карт   Найти похожие ветки 

 
D-Man   (2004-12-15 17:42) [0]

Подскажите кто знает, как случайно разделить имеющийся кусок квадратного 2д пространства на несколько кривых территорий заданного размера. Чтобы  в результате получилось нечто вроде географической карты. Такое есть например в игре Генерал (http://newgame.agava.ru). И вообще подскажите где можно найти материалы по поводу генераторов карт для игр.


 
D-Man   (2004-12-15 20:32) [1]

Чуваки, подскажите хотябы как нарисовать один остров случайной формы, но заданного размера!


 
A22   (2004-12-15 20:57) [2]

построй вписанный в квадрат N-угольник правильный и добавь некоторый рандом в позицию каждой вершины. Ну, может, алгоритм не остановится на простом рандоме, но попробуй оттталкиваться от этого


 
D-Man   (2004-12-15 21:39) [3]

Хорошо бы сделать чтобы его площадь была точно рассчитанной, а так она может получиться с некоторым разбросом


 
тт   (2004-12-16 16:12) [4]

Есть ли на эту тему статьи?


 
Mihey_temporary ©   (2004-12-16 17:23) [5]


> Хорошо бы сделать чтобы его площадь была точно рассчитанной,
> а так она может получиться с некоторым разбросом


Построй правильный (или не правильный) N-угольник нужной тебе площади. Подойдёт и квадрат. Затем выбирай случайно какую-нибудь секущую прямую, для простоты параллельную одной из осей, и сдвигай вдоль неё половинки. И так много раз.


 
TButton ©   (2004-12-16 18:32) [6]

берешь байтовую матрицу NxN
заполняешь нулями
чтобы получить случайную фигуру площади M (M<N*N)
в случайной точке ставишь единицу
далее
for i:=1 to m-1 do
составляешь список ячеек граничащих с теми в которых единица
содержащих ноль
выбираешь из списка случайную и присваиваешь ей единицу

а могу и исходник подкинуть
прога генерировала архипелаг
счас найду


 
TButton ©   (2004-12-16 18:39) [7]

ага нашел
procedure TForm1.SpeedButton1Click(Sender: TObject);
 // собсно выбор случайной точки
 function RandomPoint:TPoint;
 var
   pl, rl: array of TPoint;
   i, j, k: integer;
   s: boolean;
 begin
   // preparing list of all water sectors
   SetLength(pl, 0);
   for i:=0 to 24 do
     for j:=0 to 24 do
     begin
       if map[i, j]=0 then
       begin
         SetLength(pl, high(pl)+2);
         pl[high(pl)].x:=i;
         pl[high(pl)].y:=j;
       end;
     end;
   // nothing - leaving
   if high(pl)=-1 then exit;
   // skaning list
   SetLength(rl, 0);
   for k:=0 to high(pl) do
   begin
     s:=false;
     for i:=pl[k].x-1 to pl[k].x+1 do
       for j:=pl[k].y-1 to pl[k].y+1 do
         if (not(((i<0)or(i>24))or((j<0)or(j>24))))and((i=pl[k].x)or(j=pl[k].y))and(map[i, j]=1)
           then s:=true;
     if s then
     begin
       SetLength(rl, high(rl)+2);
       rl[high(rl)]:=pl[k];
     end;
   end;
   k:=round(random*high(rl));
   result:=rl[k];
 end;
 // функция определяет суммарное количество "водных" клеток
 // на карте
 function WaterCount: integer;
 var
   i, j: integer;
 begin
   result:=0;
   for i:=0 to 24 do
     for j:=0 to 24 do
       if map[i, j]=0 then
         result:=result+1;
   result:=round(result/625*100);
 end;
var
 wc, i, j, n: integer;
 p: TPoint;
begin
 // очистка
 for i:=0 to 24 do
   for j:=0 to 24 do
     map[i, j]:=0;
 // случайное количество исходных точек
 n:=5+random(5);
 for i:=0 to n do
   map[random(25), random(25)]:=1;
 // количество воды 0-100
 wc:=TrackBar1.Position;
 while WaterCount>wc do
 begin
   p:=RandomPoint;
   map[p.x, p.y]:=1;
 end;
 table.Repaint;  
end;


 
D-Man   (2004-12-16 19:24) [8]


> Построй правильный (или не правильный) N-угольник нужной
> тебе площади. Подойдёт и квадрат. Затем выбирай случайно
> какую-нибудь секущую прямую, для простоты параллельную одной
> из осей, и сдвигай вдоль неё половинки. И так много раз.


Спасибо, вроде уловил.

TButton ©   (16.12.04 18:39) [7]
офигенно! щас проверю!

Я вообще вот к чему спрашивал. Не так давно, вдохновившись безумной идеей начал делать 2d игрушку. Жанр Action с элементами RPG. Геймплей мне видится очень похожим на Дьябло. Основная мысль в том, чтобы сделать ее по настоящему случайной, случайный мир, случайные квесты и события, а не иллюзия случайности, как во многих играх. Так вот я застрял на случайном разбиении тайловой карты на зоны (трава, грязь, вода, ...), чтобы в итоге получилась более или менее натуральная местность, наверняка кто-то видел или знает подходящий алгоритм на эту тему.
Кстати специально для этой игрухи я разобрался в том каким образом во 2м War Craft"е рисуется карта, т.е. сочетания травы с землей, деревьев с травой итд и реализовал это в коде. Кому
интересно могу просветить только не побрезгайте сабжем пожалуйста.


 
D-Man   (2004-12-16 20:43) [9]

TButton ©   (16.12.04 18:39) [7]

Блин никак не скомпилирую, можешь мне эту прогу целиком на мыло кинуть?


 
rts111 ©   (2004-12-16 20:52) [10]

Вот нашел.
Копирую модуль целиком.
Если немного переделать получится генератор.

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   procedure FormCreate(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 pic1:tbitmap;
 a:array of pwordarray;

 s:integer=400;
 p1:integer=300000;
 p2:integer=27;
 st:integer=1;

implementation
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var n,i,j,x,y:integer;
begin

for n:=1 to p2 do
a[st+random(s-2*st),st+random(s-2*st)]:=random($ffffff);

for n:=1 to p1 do
begin
 x:=st+random(s-2*st);
 y:=st+random(s-2*st);
 if a[y,x]>83
 then begin
      for j:=y-st to y+st do
      for i:=x-st to x+st do
      if a[j,i]=0 then a[j,i]:=a[y,x]+1;
      end;
end;

canvas.Draw(0,0,pic1);
end;

procedure TForm1.FormCreate(Sender: TObject);
var j,i:integer;
begin
pic1:=tbitmap.Create;
pic1.Width:=s;
pic1.Height:=s;
pic1.PixelFormat:=pf15bit;
setlength(a,s);
for j:=0 to s-1 do a[j]:=pic1.ScanLine[j];
for j:=0 to s-1 do
for i:=0 to s-1 do
a[j,i]:=0;
pic1.Canvas.Brush.Color:=$300000;

end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
pic1.Free;
end;

end.


 
D-Man   (2004-12-16 21:31) [11]

TButton

Разобрался с принципом. Вроде похоже. А еще если размер общей территории сделать побольше, а генерируемую землю ~10%, то получается похоже на реку, только с очень большими территориями (где-то 400х400) уже не очень хорошо.

rts111 ©   (16.12.04 20:52) [10]

аксес виолейшн на строке
a[st+random(s-2*st),st+random(s-2*st)]:=random($ffffff);
расскажи саму идею


 
rts111 ©   (2004-12-16 22:10) [12]

В инспекторе может быть забыл
form1 oncreate назначить процедуру procedure FormCreate(Sender: TObject);


 
D-Man   (2004-12-16 22:25) [13]


> В инспекторе может быть забыл
> form1 oncreate назначить процедуру procedure FormCreate(Sender:
> TObject);

Точно! Спасибо, интересная штука...


 
wiz ©   (2004-12-16 22:40) [14]

не совсем то, что ты просил, но...

Однажды развлекался идеей построения случайной географической карты местности (леса/поля/степи итп...)

в результате одной из проб получился следующий алгоритм:
http://gnar.fatal.ru/land_create.zip

в .pas даны краткие комментарии что происходит
в самой программе выставляем чекбоксы и давим поочерёдно на кнопки (Place, Progress, Smooth...)

штука далека от идеала, но может быть натолкнёт тебя на какие-нибудь интересные мысли?


 
wiz ©   (2004-12-16 22:42) [15]

PS: (совсем забыл) размер zip"а - 8 Kb


 
D-Man   (2004-12-17 00:22) [16]

2 wiz
Я как раз состряпал почти тоже самое, но все равно спасибо


 
wiz ©   (2004-12-17 11:07) [17]

2 D-Man: не за что :)



Страницы: 1 вся ветка

Текущий архив: 2005.03.13;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.073 c
3-1107522327
mefodiy
2005-02-04 16:05
2005.03.13
Создание хранимой процедуры в Oracle в RunTime


4-1106922512
Aleksandr.
2005-01-28 17:28
2005.03.13
Кто ждет результата SendMessage с WM_CopyData?


4-1107264874
stud
2005-02-01 16:34
2005.03.13
проблема с протоколом MODBUS


4-1106907887
MiF
2005-01-28 13:24
2005.03.13
Помогите получить список групп из Active Directory


1-1109559279
rainy_day
2005-02-28 05:54
2005.03.13
ЧТо из себя представляет класс TDCB?