Diagramma di Voronoi

Algoritmi, discussioni sulle possibili implementazioni, matematica, fisica e tutti gli argomenti correlati alla programmazione
Rispondi
DeathSeller1
Newbie
Messaggi: 16
Iscritto il: 16/01/2018, 16:40
Uso: GM:Studio 2
Contatta:

Diagramma di Voronoi

Messaggio da DeathSeller1 »

Ciao a tutti, è da un po' che non passo di qua, tanto che ho dovuto creare un nuovo account per mancanza di password. :spat:

In questi ultimi mesi ho creato in GML diversi algoritmi per creare una mappa top down procedurale. Tutto molto bello per imparare qualcosa in più, ma alla fine mi sono reso conto che ho bisogno di un qualcosa in più, soprattutto sotto l'aspetto estetico finale.

Quello che voglio è sfruttare il diagramma di Voronoi per creare isole in mezzo all'oceano simili a queste.

Ho tentato in molti modi di creare una algoritmo valido (sto parlando di Voronoi, un passo alla volta, altri problemi verranno dopo, ma prima voglio risolvere questo), ma non ci sono riuscito, eppure sembra semplice. Il mio problema è che conosco approfonditamente solo il GML. In questa pagina si trova un algoritmo per tutti i linguaggi che non so leggere.

Qualcuno può darmi una dritta/aiuto su come convertire uno di questi script?

Nel mio progetto ho già i punti che ho creato con un semplicissimo algoritmo ideato al volo. La view misura 768*768 divisa in celle da 64*64. Ogni cella ha all'interno un punto in posizione casuale.

Thanks in advance.

Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: Diagramma di Voronoi

Messaggio da Jak »

Di voronoi non so ma in genere per fare terreni procedurali va benissimo un'algotitmo di random qualunque. Al massimo lo adatti più avanti aggiungendo il voronoi.
Senza bestemmiare troppo devi andare per strati sempre più dettagliati come puoi capire semplicemente guardando le figure qui:
http://devmag.org.za/2009/04/25/perlin-noise/
Più la mappa è dettagliata meno questa influirà nell'effetto finale.
Il layer meno dettagliato avrà un'altezza massima molto grande così da poter simulare le montagne. Viceversa quella più dettagliata avrà una altezza massima ridottissima e servirà a simulare sassi ed increspature.
Quando hai prodotto i vari "strati" ti basterà fare una semplice somma per ottenere il risultato finale
Anche il codice descritto qui è molto breve e perlopiù copiabile quasi 1:1 in gml.

Mentre scrivevo mi son ricordato che ho già implementato tempo fa un'algoritmo di noise 2D molto veloce e provvisto di valori intermedi, nel quale gli passi coordinate x ed y. Tutto ciò che bisogna fare è stratificarlo come nel link precedente.

Funzione di inizializzazione da usare una volta ad inizio gioco (usata per prestazioni)

Codice: Seleziona tutto

///@author		Giacomo Marton
///@version		1.0.0


///@description			Initializes the permutation table for the simplex noise functions

//You should call this script once before using any "simplex_noise" function


//the permutation table
global._GMMath_int_PERMUTATION[511] = 180;
global._GMMath_int_PERMUTATION[0] = 151;
global._GMMath_int_PERMUTATION[1] = 160;
global._GMMath_int_PERMUTATION[2] = 137;
global._GMMath_int_PERMUTATION[3] = 91;
global._GMMath_int_PERMUTATION[4] = 90;
global._GMMath_int_PERMUTATION[5] = 15;
global._GMMath_int_PERMUTATION[6] = 131;
global._GMMath_int_PERMUTATION[7] = 13;
global._GMMath_int_PERMUTATION[8] = 201;
global._GMMath_int_PERMUTATION[9] = 95;
global._GMMath_int_PERMUTATION[10] = 96;
global._GMMath_int_PERMUTATION[11] = 53;
global._GMMath_int_PERMUTATION[12] = 194;
global._GMMath_int_PERMUTATION[13] = 233;
global._GMMath_int_PERMUTATION[14] = 7;
global._GMMath_int_PERMUTATION[15] = 225;
global._GMMath_int_PERMUTATION[16] = 140;
global._GMMath_int_PERMUTATION[17] = 36;
global._GMMath_int_PERMUTATION[18] = 103;
global._GMMath_int_PERMUTATION[19] = 30;
global._GMMath_int_PERMUTATION[20] = 69;
global._GMMath_int_PERMUTATION[21] = 142;
global._GMMath_int_PERMUTATION[22] = 8;
global._GMMath_int_PERMUTATION[23] = 99;
global._GMMath_int_PERMUTATION[24] = 37;
global._GMMath_int_PERMUTATION[25] = 240;
global._GMMath_int_PERMUTATION[26] = 21;
global._GMMath_int_PERMUTATION[27] = 10;
global._GMMath_int_PERMUTATION[28] = 23;
global._GMMath_int_PERMUTATION[29] = 190;
global._GMMath_int_PERMUTATION[30] = 6;
global._GMMath_int_PERMUTATION[31] = 148;
global._GMMath_int_PERMUTATION[32] = 247;
global._GMMath_int_PERMUTATION[33] = 120;
global._GMMath_int_PERMUTATION[34] = 234;
global._GMMath_int_PERMUTATION[35] = 75;
global._GMMath_int_PERMUTATION[36] = 0;
global._GMMath_int_PERMUTATION[37] = 26;
global._GMMath_int_PERMUTATION[38] = 197;
global._GMMath_int_PERMUTATION[39] = 62;
global._GMMath_int_PERMUTATION[40] = 94;
global._GMMath_int_PERMUTATION[41] = 252;
global._GMMath_int_PERMUTATION[42] = 219;
global._GMMath_int_PERMUTATION[43] = 203;
global._GMMath_int_PERMUTATION[44] = 117;
global._GMMath_int_PERMUTATION[45] = 35;
global._GMMath_int_PERMUTATION[46] = 11;
global._GMMath_int_PERMUTATION[47] = 32;
global._GMMath_int_PERMUTATION[48] = 57;
global._GMMath_int_PERMUTATION[49] = 177;
global._GMMath_int_PERMUTATION[50] = 33;
global._GMMath_int_PERMUTATION[51] = 88;
global._GMMath_int_PERMUTATION[52] = 237;
global._GMMath_int_PERMUTATION[53] = 149;
global._GMMath_int_PERMUTATION[54] = 56;
global._GMMath_int_PERMUTATION[55] = 87;
global._GMMath_int_PERMUTATION[56] = 174;
global._GMMath_int_PERMUTATION[57] = 20;
global._GMMath_int_PERMUTATION[58] = 125;
global._GMMath_int_PERMUTATION[59] = 136;
global._GMMath_int_PERMUTATION[60] = 171;
global._GMMath_int_PERMUTATION[61] = 168;
global._GMMath_int_PERMUTATION[62] = 68;
global._GMMath_int_PERMUTATION[63] = 175;
global._GMMath_int_PERMUTATION[64] = 74;
global._GMMath_int_PERMUTATION[65] = 165;
global._GMMath_int_PERMUTATION[66] = 71;
global._GMMath_int_PERMUTATION[67] = 134;
global._GMMath_int_PERMUTATION[68] = 139;
global._GMMath_int_PERMUTATION[69] = 48;
global._GMMath_int_PERMUTATION[70] = 27;
global._GMMath_int_PERMUTATION[71] = 166;
global._GMMath_int_PERMUTATION[72] = 77;
global._GMMath_int_PERMUTATION[73] = 146;
global._GMMath_int_PERMUTATION[74] = 158;
global._GMMath_int_PERMUTATION[75] = 231;
global._GMMath_int_PERMUTATION[76] = 83;
global._GMMath_int_PERMUTATION[77] = 111;
global._GMMath_int_PERMUTATION[78] = 229;
global._GMMath_int_PERMUTATION[79] = 122;
global._GMMath_int_PERMUTATION[80] = 60;
global._GMMath_int_PERMUTATION[81] = 211;
global._GMMath_int_PERMUTATION[82] = 133;
global._GMMath_int_PERMUTATION[83] = 230;
global._GMMath_int_PERMUTATION[84] = 220;
global._GMMath_int_PERMUTATION[85] = 105;
global._GMMath_int_PERMUTATION[86] = 92;
global._GMMath_int_PERMUTATION[87] = 41;
global._GMMath_int_PERMUTATION[88] = 55;
global._GMMath_int_PERMUTATION[89] = 46;
global._GMMath_int_PERMUTATION[90] = 245;
global._GMMath_int_PERMUTATION[91] = 40;
global._GMMath_int_PERMUTATION[92] = 244;
global._GMMath_int_PERMUTATION[93] = 102;
global._GMMath_int_PERMUTATION[94] = 143;
global._GMMath_int_PERMUTATION[95] = 54;
global._GMMath_int_PERMUTATION[96] = 65;
global._GMMath_int_PERMUTATION[97] = 25;
global._GMMath_int_PERMUTATION[98] = 63;
global._GMMath_int_PERMUTATION[99] = 161;
global._GMMath_int_PERMUTATION[100] = 1;
global._GMMath_int_PERMUTATION[101] = 216;
global._GMMath_int_PERMUTATION[102] = 80;
global._GMMath_int_PERMUTATION[103] = 73;
global._GMMath_int_PERMUTATION[104] = 209;
global._GMMath_int_PERMUTATION[105] = 76;
global._GMMath_int_PERMUTATION[106] = 132;
global._GMMath_int_PERMUTATION[107] = 187;
global._GMMath_int_PERMUTATION[108] = 208;
global._GMMath_int_PERMUTATION[109] = 89;
global._GMMath_int_PERMUTATION[110] = 18;
global._GMMath_int_PERMUTATION[111] = 169;
global._GMMath_int_PERMUTATION[112] = 200;
global._GMMath_int_PERMUTATION[113] = 196;
global._GMMath_int_PERMUTATION[114] = 135;
global._GMMath_int_PERMUTATION[115] = 130;
global._GMMath_int_PERMUTATION[116] = 116;
global._GMMath_int_PERMUTATION[117] = 188;
global._GMMath_int_PERMUTATION[118] = 159;
global._GMMath_int_PERMUTATION[119] = 86;
global._GMMath_int_PERMUTATION[120] = 164;
global._GMMath_int_PERMUTATION[121] = 100;
global._GMMath_int_PERMUTATION[122] = 109;
global._GMMath_int_PERMUTATION[123] = 198;
global._GMMath_int_PERMUTATION[124] = 173;
global._GMMath_int_PERMUTATION[125] = 186;
global._GMMath_int_PERMUTATION[126] = 3;
global._GMMath_int_PERMUTATION[127] = 64;
global._GMMath_int_PERMUTATION[128] = 52;
global._GMMath_int_PERMUTATION[129] = 217;
global._GMMath_int_PERMUTATION[130] = 226;
global._GMMath_int_PERMUTATION[131] = 250;
global._GMMath_int_PERMUTATION[132] = 124;
global._GMMath_int_PERMUTATION[133] = 123;
global._GMMath_int_PERMUTATION[134] = 5;
global._GMMath_int_PERMUTATION[135] = 202;
global._GMMath_int_PERMUTATION[136] = 38;
global._GMMath_int_PERMUTATION[137] = 147;
global._GMMath_int_PERMUTATION[138] = 118;
global._GMMath_int_PERMUTATION[139] = 126;
global._GMMath_int_PERMUTATION[140] = 255;
global._GMMath_int_PERMUTATION[141] = 82;
global._GMMath_int_PERMUTATION[142] = 85;
global._GMMath_int_PERMUTATION[143] = 212;
global._GMMath_int_PERMUTATION[144] = 207;
global._GMMath_int_PERMUTATION[145] = 206;
global._GMMath_int_PERMUTATION[146] = 59;
global._GMMath_int_PERMUTATION[147] = 227;
global._GMMath_int_PERMUTATION[148] = 47;
global._GMMath_int_PERMUTATION[149] = 16;
global._GMMath_int_PERMUTATION[150] = 58;
global._GMMath_int_PERMUTATION[151] = 17;
global._GMMath_int_PERMUTATION[152] = 182;
global._GMMath_int_PERMUTATION[153] = 189;
global._GMMath_int_PERMUTATION[154] = 28;
global._GMMath_int_PERMUTATION[155] = 42;
global._GMMath_int_PERMUTATION[156] = 223;
global._GMMath_int_PERMUTATION[157] = 183;
global._GMMath_int_PERMUTATION[158] = 170;
global._GMMath_int_PERMUTATION[159] = 213;
global._GMMath_int_PERMUTATION[160] = 119;
global._GMMath_int_PERMUTATION[161] = 248;
global._GMMath_int_PERMUTATION[162] = 152;
global._GMMath_int_PERMUTATION[163] = 2;
global._GMMath_int_PERMUTATION[164] = 44;
global._GMMath_int_PERMUTATION[165] = 154;
global._GMMath_int_PERMUTATION[166] = 163;
global._GMMath_int_PERMUTATION[167] = 70;
global._GMMath_int_PERMUTATION[168] = 221;
global._GMMath_int_PERMUTATION[169] = 153;
global._GMMath_int_PERMUTATION[170] = 101;
global._GMMath_int_PERMUTATION[171] = 155;
global._GMMath_int_PERMUTATION[172] = 167;
global._GMMath_int_PERMUTATION[173] = 43;
global._GMMath_int_PERMUTATION[174] = 172;
global._GMMath_int_PERMUTATION[175] = 9;
global._GMMath_int_PERMUTATION[176] = 129;
global._GMMath_int_PERMUTATION[177] = 22;
global._GMMath_int_PERMUTATION[178] = 39;
global._GMMath_int_PERMUTATION[179] = 253;
global._GMMath_int_PERMUTATION[180] = 19;
global._GMMath_int_PERMUTATION[181] = 98;
global._GMMath_int_PERMUTATION[182] = 108;
global._GMMath_int_PERMUTATION[183] = 110;
global._GMMath_int_PERMUTATION[184] = 79;
global._GMMath_int_PERMUTATION[185] = 113;
global._GMMath_int_PERMUTATION[186] = 224;
global._GMMath_int_PERMUTATION[187] = 232;
global._GMMath_int_PERMUTATION[188] = 178;
global._GMMath_int_PERMUTATION[189] = 185;
global._GMMath_int_PERMUTATION[190] = 112;
global._GMMath_int_PERMUTATION[191] = 104;
global._GMMath_int_PERMUTATION[192] = 218;
global._GMMath_int_PERMUTATION[193] = 246;
global._GMMath_int_PERMUTATION[194] = 97;
global._GMMath_int_PERMUTATION[195] = 228;
global._GMMath_int_PERMUTATION[196] = 251;
global._GMMath_int_PERMUTATION[197] = 34;
global._GMMath_int_PERMUTATION[198] = 242;
global._GMMath_int_PERMUTATION[199] = 193;
global._GMMath_int_PERMUTATION[200] = 238;
global._GMMath_int_PERMUTATION[201] = 210;
global._GMMath_int_PERMUTATION[202] = 144;
global._GMMath_int_PERMUTATION[203] = 12;
global._GMMath_int_PERMUTATION[204] = 191;
global._GMMath_int_PERMUTATION[205] = 179;
global._GMMath_int_PERMUTATION[206] = 162;
global._GMMath_int_PERMUTATION[207] = 241;
global._GMMath_int_PERMUTATION[208] = 81;
global._GMMath_int_PERMUTATION[209] = 51;
global._GMMath_int_PERMUTATION[210] = 145;
global._GMMath_int_PERMUTATION[211] = 235;
global._GMMath_int_PERMUTATION[212] = 249;
global._GMMath_int_PERMUTATION[213] = 14;
global._GMMath_int_PERMUTATION[214] = 239;
global._GMMath_int_PERMUTATION[215] = 107;
global._GMMath_int_PERMUTATION[216] = 49;
global._GMMath_int_PERMUTATION[217] = 192;
global._GMMath_int_PERMUTATION[218] = 214;
global._GMMath_int_PERMUTATION[219] = 31;
global._GMMath_int_PERMUTATION[220] = 181;
global._GMMath_int_PERMUTATION[221] = 199;
global._GMMath_int_PERMUTATION[222] = 106;
global._GMMath_int_PERMUTATION[223] = 157;
global._GMMath_int_PERMUTATION[224] = 184;
global._GMMath_int_PERMUTATION[225] = 84;
global._GMMath_int_PERMUTATION[226] = 204;
global._GMMath_int_PERMUTATION[227] = 176;
global._GMMath_int_PERMUTATION[228] = 115;
global._GMMath_int_PERMUTATION[229] = 121;
global._GMMath_int_PERMUTATION[230] = 50;
global._GMMath_int_PERMUTATION[231] = 45;
global._GMMath_int_PERMUTATION[232] = 127;
global._GMMath_int_PERMUTATION[233] = 4;
global._GMMath_int_PERMUTATION[234] = 150;
global._GMMath_int_PERMUTATION[235] = 254;
global._GMMath_int_PERMUTATION[236] = 138;
global._GMMath_int_PERMUTATION[237] = 236;
global._GMMath_int_PERMUTATION[238] = 205;
global._GMMath_int_PERMUTATION[239] = 93;
global._GMMath_int_PERMUTATION[240] = 222;
global._GMMath_int_PERMUTATION[241] = 114;
global._GMMath_int_PERMUTATION[242] = 67;
global._GMMath_int_PERMUTATION[243] = 29;
global._GMMath_int_PERMUTATION[244] = 24;
global._GMMath_int_PERMUTATION[245] = 72;
global._GMMath_int_PERMUTATION[246] = 243;
global._GMMath_int_PERMUTATION[247] = 141;
global._GMMath_int_PERMUTATION[248] = 128;
global._GMMath_int_PERMUTATION[249] = 195;
global._GMMath_int_PERMUTATION[250] = 78;
global._GMMath_int_PERMUTATION[251] = 66;
global._GMMath_int_PERMUTATION[252] = 215;
global._GMMath_int_PERMUTATION[253] = 61;
global._GMMath_int_PERMUTATION[254] = 156;
global._GMMath_int_PERMUTATION[255] = 180;
global._GMMath_int_PERMUTATION[256] = 151;
global._GMMath_int_PERMUTATION[257] = 160;
global._GMMath_int_PERMUTATION[258] = 137;
global._GMMath_int_PERMUTATION[259] = 91;
global._GMMath_int_PERMUTATION[260] = 90;
global._GMMath_int_PERMUTATION[261] = 15;
global._GMMath_int_PERMUTATION[262] = 131;
global._GMMath_int_PERMUTATION[263] = 13;
global._GMMath_int_PERMUTATION[264] = 201;
global._GMMath_int_PERMUTATION[265] = 95;
global._GMMath_int_PERMUTATION[266] = 96;
global._GMMath_int_PERMUTATION[267] = 53;
global._GMMath_int_PERMUTATION[268] = 194;
global._GMMath_int_PERMUTATION[269] = 233;
global._GMMath_int_PERMUTATION[270] = 7;
global._GMMath_int_PERMUTATION[271] = 225;
global._GMMath_int_PERMUTATION[272] = 140;
global._GMMath_int_PERMUTATION[273] = 36;
global._GMMath_int_PERMUTATION[274] = 103;
global._GMMath_int_PERMUTATION[275] = 30;
global._GMMath_int_PERMUTATION[276] = 69;
global._GMMath_int_PERMUTATION[277] = 142;
global._GMMath_int_PERMUTATION[278] = 8;
global._GMMath_int_PERMUTATION[279] = 99;
global._GMMath_int_PERMUTATION[280] = 37;
global._GMMath_int_PERMUTATION[281] = 240;
global._GMMath_int_PERMUTATION[282] = 21;
global._GMMath_int_PERMUTATION[283] = 10;
global._GMMath_int_PERMUTATION[284] = 23;
global._GMMath_int_PERMUTATION[285] = 190;
global._GMMath_int_PERMUTATION[286] = 6;
global._GMMath_int_PERMUTATION[287] = 148;
global._GMMath_int_PERMUTATION[288] = 247;
global._GMMath_int_PERMUTATION[289] = 120;
global._GMMath_int_PERMUTATION[290] = 234;
global._GMMath_int_PERMUTATION[291] = 75;
global._GMMath_int_PERMUTATION[292] = 0;
global._GMMath_int_PERMUTATION[293] = 26;
global._GMMath_int_PERMUTATION[294] = 197;
global._GMMath_int_PERMUTATION[295] = 62;
global._GMMath_int_PERMUTATION[296] = 94;
global._GMMath_int_PERMUTATION[297] = 252;
global._GMMath_int_PERMUTATION[298] = 219;
global._GMMath_int_PERMUTATION[299] = 203;
global._GMMath_int_PERMUTATION[300] = 117;
global._GMMath_int_PERMUTATION[301] = 35;
global._GMMath_int_PERMUTATION[302] = 11;
global._GMMath_int_PERMUTATION[303] = 32;
global._GMMath_int_PERMUTATION[304] = 57;
global._GMMath_int_PERMUTATION[305] = 177;
global._GMMath_int_PERMUTATION[306] = 33;
global._GMMath_int_PERMUTATION[307] = 88;
global._GMMath_int_PERMUTATION[308] = 237;
global._GMMath_int_PERMUTATION[309] = 149;
global._GMMath_int_PERMUTATION[310] = 56;
global._GMMath_int_PERMUTATION[311] = 87;
global._GMMath_int_PERMUTATION[312] = 174;
global._GMMath_int_PERMUTATION[313] = 20;
global._GMMath_int_PERMUTATION[314] = 125;
global._GMMath_int_PERMUTATION[315] = 136;
global._GMMath_int_PERMUTATION[316] = 171;
global._GMMath_int_PERMUTATION[317] = 168;
global._GMMath_int_PERMUTATION[318] = 68;
global._GMMath_int_PERMUTATION[319] = 175;
global._GMMath_int_PERMUTATION[320] = 74;
global._GMMath_int_PERMUTATION[321] = 165;
global._GMMath_int_PERMUTATION[322] = 71;
global._GMMath_int_PERMUTATION[323] = 134;
global._GMMath_int_PERMUTATION[324] = 139;
global._GMMath_int_PERMUTATION[325] = 48;
global._GMMath_int_PERMUTATION[326] = 27;
global._GMMath_int_PERMUTATION[327] = 166;
global._GMMath_int_PERMUTATION[328] = 77;
global._GMMath_int_PERMUTATION[329] = 146;
global._GMMath_int_PERMUTATION[330] = 158;
global._GMMath_int_PERMUTATION[331] = 231;
global._GMMath_int_PERMUTATION[332] = 83;
global._GMMath_int_PERMUTATION[333] = 111;
global._GMMath_int_PERMUTATION[334] = 229;
global._GMMath_int_PERMUTATION[335] = 122;
global._GMMath_int_PERMUTATION[336] = 60;
global._GMMath_int_PERMUTATION[337] = 211;
global._GMMath_int_PERMUTATION[338] = 133;
global._GMMath_int_PERMUTATION[339] = 230;
global._GMMath_int_PERMUTATION[340] = 220;
global._GMMath_int_PERMUTATION[341] = 105;
global._GMMath_int_PERMUTATION[342] = 92;
global._GMMath_int_PERMUTATION[343] = 41;
global._GMMath_int_PERMUTATION[344] = 55;
global._GMMath_int_PERMUTATION[345] = 46;
global._GMMath_int_PERMUTATION[346] = 245;
global._GMMath_int_PERMUTATION[347] = 40;
global._GMMath_int_PERMUTATION[348] = 244;
global._GMMath_int_PERMUTATION[349] = 102;
global._GMMath_int_PERMUTATION[350] = 143;
global._GMMath_int_PERMUTATION[351] = 54;
global._GMMath_int_PERMUTATION[352] = 65;
global._GMMath_int_PERMUTATION[353] = 25;
global._GMMath_int_PERMUTATION[354] = 63;
global._GMMath_int_PERMUTATION[355] = 161;
global._GMMath_int_PERMUTATION[356] = 1;
global._GMMath_int_PERMUTATION[357] = 216;
global._GMMath_int_PERMUTATION[358] = 80;
global._GMMath_int_PERMUTATION[359] = 73;
global._GMMath_int_PERMUTATION[360] = 209;
global._GMMath_int_PERMUTATION[361] = 76;
global._GMMath_int_PERMUTATION[362] = 132;
global._GMMath_int_PERMUTATION[363] = 187;
global._GMMath_int_PERMUTATION[364] = 208;
global._GMMath_int_PERMUTATION[365] = 89;
global._GMMath_int_PERMUTATION[366] = 18;
global._GMMath_int_PERMUTATION[367] = 169;
global._GMMath_int_PERMUTATION[368] = 200;
global._GMMath_int_PERMUTATION[369] = 196;
global._GMMath_int_PERMUTATION[370] = 135;
global._GMMath_int_PERMUTATION[371] = 130;
global._GMMath_int_PERMUTATION[372] = 116;
global._GMMath_int_PERMUTATION[373] = 188;
global._GMMath_int_PERMUTATION[374] = 159;
global._GMMath_int_PERMUTATION[375] = 86;
global._GMMath_int_PERMUTATION[376] = 164;
global._GMMath_int_PERMUTATION[377] = 100;
global._GMMath_int_PERMUTATION[378] = 109;
global._GMMath_int_PERMUTATION[379] = 198;
global._GMMath_int_PERMUTATION[380] = 173;
global._GMMath_int_PERMUTATION[381] = 186;
global._GMMath_int_PERMUTATION[382] = 3;
global._GMMath_int_PERMUTATION[383] = 64;
global._GMMath_int_PERMUTATION[384] = 52;
global._GMMath_int_PERMUTATION[385] = 217;
global._GMMath_int_PERMUTATION[386] = 226;
global._GMMath_int_PERMUTATION[387] = 250;
global._GMMath_int_PERMUTATION[388] = 124;
global._GMMath_int_PERMUTATION[389] = 123;
global._GMMath_int_PERMUTATION[390] = 5;
global._GMMath_int_PERMUTATION[391] = 202;
global._GMMath_int_PERMUTATION[392] = 38;
global._GMMath_int_PERMUTATION[393] = 147;
global._GMMath_int_PERMUTATION[394] = 118;
global._GMMath_int_PERMUTATION[395] = 126;
global._GMMath_int_PERMUTATION[396] = 255;
global._GMMath_int_PERMUTATION[397] = 82;
global._GMMath_int_PERMUTATION[398] = 85;
global._GMMath_int_PERMUTATION[399] = 212;
global._GMMath_int_PERMUTATION[400] = 207;
global._GMMath_int_PERMUTATION[401] = 206;
global._GMMath_int_PERMUTATION[402] = 59;
global._GMMath_int_PERMUTATION[403] = 227;
global._GMMath_int_PERMUTATION[404] = 47;
global._GMMath_int_PERMUTATION[405] = 16;
global._GMMath_int_PERMUTATION[406] = 58;
global._GMMath_int_PERMUTATION[407] = 17;
global._GMMath_int_PERMUTATION[408] = 182;
global._GMMath_int_PERMUTATION[409] = 189;
global._GMMath_int_PERMUTATION[410] = 28;
global._GMMath_int_PERMUTATION[411] = 42;
global._GMMath_int_PERMUTATION[412] = 223;
global._GMMath_int_PERMUTATION[413] = 183;
global._GMMath_int_PERMUTATION[414] = 170;
global._GMMath_int_PERMUTATION[415] = 213;
global._GMMath_int_PERMUTATION[416] = 119;
global._GMMath_int_PERMUTATION[417] = 248;
global._GMMath_int_PERMUTATION[418] = 152;
global._GMMath_int_PERMUTATION[419] = 2;
global._GMMath_int_PERMUTATION[420] = 44;
global._GMMath_int_PERMUTATION[421] = 154;
global._GMMath_int_PERMUTATION[422] = 163;
global._GMMath_int_PERMUTATION[423] = 70;
global._GMMath_int_PERMUTATION[424] = 221;
global._GMMath_int_PERMUTATION[425] = 153;
global._GMMath_int_PERMUTATION[426] = 101;
global._GMMath_int_PERMUTATION[427] = 155;
global._GMMath_int_PERMUTATION[428] = 167;
global._GMMath_int_PERMUTATION[429] = 43;
global._GMMath_int_PERMUTATION[430] = 172;
global._GMMath_int_PERMUTATION[431] = 9;
global._GMMath_int_PERMUTATION[432] = 129;
global._GMMath_int_PERMUTATION[433] = 22;
global._GMMath_int_PERMUTATION[434] = 39;
global._GMMath_int_PERMUTATION[435] = 253;
global._GMMath_int_PERMUTATION[436] = 19;
global._GMMath_int_PERMUTATION[437] = 98;
global._GMMath_int_PERMUTATION[438] = 108;
global._GMMath_int_PERMUTATION[439] = 110;
global._GMMath_int_PERMUTATION[440] = 79;
global._GMMath_int_PERMUTATION[441] = 113;
global._GMMath_int_PERMUTATION[442] = 224;
global._GMMath_int_PERMUTATION[443] = 232;
global._GMMath_int_PERMUTATION[444] = 178;
global._GMMath_int_PERMUTATION[445] = 185;
global._GMMath_int_PERMUTATION[446] = 112;
global._GMMath_int_PERMUTATION[447] = 104;
global._GMMath_int_PERMUTATION[448] = 218;
global._GMMath_int_PERMUTATION[449] = 246;
global._GMMath_int_PERMUTATION[450] = 97;
global._GMMath_int_PERMUTATION[451] = 228;
global._GMMath_int_PERMUTATION[452] = 251;
global._GMMath_int_PERMUTATION[453] = 34;
global._GMMath_int_PERMUTATION[454] = 242;
global._GMMath_int_PERMUTATION[455] = 193;
global._GMMath_int_PERMUTATION[456] = 238;
global._GMMath_int_PERMUTATION[457] = 210;
global._GMMath_int_PERMUTATION[458] = 144;
global._GMMath_int_PERMUTATION[459] = 12;
global._GMMath_int_PERMUTATION[460] = 191;
global._GMMath_int_PERMUTATION[461] = 179;
global._GMMath_int_PERMUTATION[462] = 162;
global._GMMath_int_PERMUTATION[463] = 241;
global._GMMath_int_PERMUTATION[464] = 81;
global._GMMath_int_PERMUTATION[465] = 51;
global._GMMath_int_PERMUTATION[466] = 145;
global._GMMath_int_PERMUTATION[467] = 235;
global._GMMath_int_PERMUTATION[468] = 249;
global._GMMath_int_PERMUTATION[469] = 14;
global._GMMath_int_PERMUTATION[470] = 239;
global._GMMath_int_PERMUTATION[471] = 107;
global._GMMath_int_PERMUTATION[472] = 49;
global._GMMath_int_PERMUTATION[473] = 192;
global._GMMath_int_PERMUTATION[474] = 214;
global._GMMath_int_PERMUTATION[475] = 31;
global._GMMath_int_PERMUTATION[476] = 181;
global._GMMath_int_PERMUTATION[477] = 199;
global._GMMath_int_PERMUTATION[478] = 106;
global._GMMath_int_PERMUTATION[479] = 157;
global._GMMath_int_PERMUTATION[480] = 184;
global._GMMath_int_PERMUTATION[481] = 84;
global._GMMath_int_PERMUTATION[482] = 204;
global._GMMath_int_PERMUTATION[483] = 176;
global._GMMath_int_PERMUTATION[484] = 115;
global._GMMath_int_PERMUTATION[485] = 121;
global._GMMath_int_PERMUTATION[486] = 50;
global._GMMath_int_PERMUTATION[487] = 45;
global._GMMath_int_PERMUTATION[488] = 127;
global._GMMath_int_PERMUTATION[489] = 4;
global._GMMath_int_PERMUTATION[490] = 150;
global._GMMath_int_PERMUTATION[491] = 254;
global._GMMath_int_PERMUTATION[492] = 138;
global._GMMath_int_PERMUTATION[493] = 236;
global._GMMath_int_PERMUTATION[494] = 205;
global._GMMath_int_PERMUTATION[495] = 93;
global._GMMath_int_PERMUTATION[496] = 222;
global._GMMath_int_PERMUTATION[497] = 114;
global._GMMath_int_PERMUTATION[498] = 67;
global._GMMath_int_PERMUTATION[499] = 29;
global._GMMath_int_PERMUTATION[500] = 24;
global._GMMath_int_PERMUTATION[501] = 72;
global._GMMath_int_PERMUTATION[502] = 243;
global._GMMath_int_PERMUTATION[503] = 141;
global._GMMath_int_PERMUTATION[504] = 128;
global._GMMath_int_PERMUTATION[505] = 195;
global._GMMath_int_PERMUTATION[506] = 78;
global._GMMath_int_PERMUTATION[507] = 66;
global._GMMath_int_PERMUTATION[508] = 215;
global._GMMath_int_PERMUTATION[509] = 61;
global._GMMath_int_PERMUTATION[510] = 156;
Funzione per ottenere un valore nel range 0-1 dandogli coordinate x ed y (da scalare per ogni strato)

Codice: Seleziona tutto

///@author		Giacomo Marton
///@version		1.0.0


///@description					Returns the interpolation of two inputs by the given amount with an easing function
///@param	{Real} x			Specifies the value to be used to seed the noise function
///@param	{Real} y			Specifies the value to be used to seed the noise function
///@return	{Real}

//The return values are always in the range [0.0,1.0]
//They are repeatable, in that a particular input value will always produce the same return value


var n0, n1, n2;

var s = (argument0 + argument1) * 0.366025403;
var i = floor(argument0 + s);
var j = floor(argument1 + s);

var t = (i + j) * 0.211324865;
var x0 = argument0 - (i - t);
var y0 = argument1 - (j - t);


var i1, j1;
if (x0 > y0) {i1 = 1; j1 = 0;}
else {i1 = 0; j1 = 1;}


var x1 = x0 - i1 + 0.211324865;
var y1 = y0 - j1 + 0.211324865;
var x2 = x0 - 0.57735027;
var y2 = y0 - 0.57735027;


var ii = i mod 256;
var jj = j mod 256;


var t0 = 0.5 - x0*x0 - y0*y0;
if (t0 < 0) n0 = 0;
else
{
    t0 *= t0;
    
    var h = global._GMMath_int_PERMUTATION[ii + global._GMMath_int_PERMUTATION[jj]] & 7;
    var u, v;
    if (h < 4) {u = x0; v = y0;}
    else {u = y0; v = x0;}
    
    var final_val;
    if ((h & 1) != 0) {final_val = -u;}
    else {final_val = u;}
    if ((h & 2) != 0) {final_val += -2*v;}
    else {final_val += 2*v;}
    
    n0 = t0 * t0 * final_val; 
}

var t1 = 0.5 - x1*x1 - y1*y1;
if (t1 < 0) n1 = 0;
else
{
    t1 *= t1;
    
    var h = global._GMMath_int_PERMUTATION[ii + i1 + global._GMMath_int_PERMUTATION[jj + j1]] & 7;
    var u, v;
    if (h < 4) {u = x1; v = y1;}
    else {u = y1; v = x1;}
    
    var final_val;
    if ((h & 1) != 0) {final_val = -u;}
    else {final_val = u;}
    if ((h & 2) != 0) {final_val += -2*v;}
    else {final_val += 2*v;}
    
    n1 = t1 * t1 * final_val;
}

var t2 = 0.5 - x2*x2 - y2*y2;
if( t2 < 0) n2 = 0;
else
{
    t2 *= t2;
    
    var h = global._GMMath_int_PERMUTATION[ii + 1 + global._GMMath_int_PERMUTATION[jj + 1]] & 7;
    var u, v;
    if (h < 4) {u = x2; v = y2;}
    else {u = y2; v = x2;}
    
    var final_val;
    if ((h & 1) != 0) {final_val = -u;}
    else {final_val = u;}
    if ((h & 2) != 0) {final_val += -2*v;}
    else {final_val += 2*v;}
    
    n2 = t2 * t2 * final_val;
}

return 40 * (n0 + n1 + n2);
Esempio d'uso non testato:

Codice: Seleziona tutto

valore_pixel = ( simplex_noise_2D(x, y) + (simplex_noise_2D(x/4, y/4) /4) + (simplex_noise_2D(x/16, y/16) / 16) ) /
(1+(1/4) + (1/16)); //Questa ultima divisione serve a far ritornare la somma totale in range 0-1
E lo fai per tutti i pixel. Comincia con una mappa molto piccola tipo 64*64 visto che non è una cosa veloce e testare potrebbe essere traumatico.

I commenti delle funzioni son strutturati per GMS 2. Se ti danno problemi eliminali.
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you

DeathSeller1
Newbie
Messaggi: 16
Iscritto il: 16/01/2018, 16:40
Uso: GM:Studio 2
Contatta:

Re: Diagramma di Voronoi

Messaggio da DeathSeller1 »

Ciao Jak, sei stato davvero gentilissimo e mi scuso se ti ho fatto perdere tempo, forse non mi sono espresso bene.

La generazione procedurale non è un problema. Ho creato io stesso un algoritmo basato sul Diamond Square dove aver provato diversi che non mi hanno soddisfatto. Il risultato è molto soddisfacente, se non fosse che non riesco a farmi entrare in testa come creare un'isola. Per questo chiedevo informazioni su un algoritmo che non conosco (Voronoi), proprio perché, da quello che leggo, è perfetto per fare quello che ho in mente.

Questa qua sotto è un risultato di un algoritmo a cui sto lavorando da stamattina basato su un Diamond Square trovato in rete.
L'immagine finale è il frutto della somma di diversi rumori: altitudine, umidità, temperatura, da cui ne derivano altri tre: bioma, terreno, densità di popolazione.
Da notare che la colorazione è parziale: dove c'è il nero i biomi non sono ancora stati colorati, inoltre alcune sfumature non mi convincono e devo ancora lavorarci.
Immagine

DeathSeller1
Newbie
Messaggi: 16
Iscritto il: 16/01/2018, 16:40
Uso: GM:Studio 2
Contatta:

Re: Diagramma di Voronoi

Messaggio da DeathSeller1 »

Ritorno sull'argomento perché ho creato il diagramma di Voronoi da 0 con GMS2 e ho bisogno di parere di altri per come procedere col passo successivo.

Allo stato attuale ho una situazione simile a questa (se mi servisse colorarla):

Immagine

1) Ho una serie definita di punti
2) Ogni punto fa parte di un'area, quindi ci sono tante aree quanti punti
3) Ogni area è formata da tutti i pixel che sono più vicini ad un punto

Non male, ma ora bisogna andare avanti. Il passaggio successivo è spostare i punti al centro approssimativo dell'Area di appartenenza. Le aree devono rimanere inalterate, solo i punti si devono spostare.

Quindi da una situazione simile a questa:
Immagine
Devo arrivare a questo:
Immagine

Visto che nella mia mappa i punti fanno parte di un'area piuttosto piccola (sono 900 punti in un'area di 512x512), ho pensato di fare semplicemente la media matematica tra i valori x di tutti i pixel per trovare il centro approssimativo della larghezza dell'area e la stessa cosa per le y e l'altezza. Potrebbe funzionare, ma se avete altre idee più precise sono ben accette.

Andando avanti cominciano i problemi seri, proprio come avevo preannunciato nel primo post...

Immagine

Gli obiettivi sono:
a) Come riconoscere le aree sono adiacenti? (tradotto meglio: come posso creare i bordi A-B B-C e C-A dell'immagine qui sopra?)
b) Come posso creare i bordi 1-2 dell'immagine?

Il risultato di questi passaggi dovrebbe essere simile a questo:

Immagine

Ovviamente così come i punti e le aree sono salvati in ds_grid, anche i segmenti che ne risultano dovranno essere in qualche modo salvati e utilizzabili come dati veri e propri.

Qualche idea? Soluzione? Nel frattempo vi ringrazio in anticipo perché mi state sopportando.

Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: Diagramma di Voronoi

Messaggio da Jak »

Per cosa devi fare sta roba nello specifico? Avere dettagli su cosa ti è utile e cosa no e con quale apporssimazione sicuramente aiuta
Ho paura che fare la media porterebbe sfalsare il diagramma di voronoi anche se non ne sono sicuro. Potrebbe essere più utile agire preventivamente ed al posto di fare un random completamente casuale distribuisci i punti su una griglia e poi fai un random su aree delimitate (minore o uguale alla grandezza di una "cella" della griglia) in questo modo avrai uno schema prevalentemente simile alla seconda immagine.
Il risultato finale dovrà essere una maglia come nell'ultima immagine oppure ti serve veramente conoscere il segmento in mezzo come nella penultima?
Se l'obiettivo è l'immagine finale, suppongo per interpolare lavorando in triangoli allora la soluzione più semplice ma dispendiosa è quella di verificare i pixel adiacenti per ogni pixel in modo tale da scoprire quali aree si toccano ed a quel punto si lavora a generare la maglia (abbastanza facile, per ogni collegamento ottenuto verifichi su entrambi i punti se ci sono dei punti in comune che eccetto i bordi sono 2 per ogni collegamento)
...
Adesso che ho letto per benine l'articolo che hai linkato ho più o meno capito che idea hai.
Tornando ai vecchi sistemi se il tuo problema è unicamente quello di creare un'isola ti basta fare una proporzione tra il valore di altezza ottenuto e la distanza da un punto centrale che definisci te. Una sorta di cono oltre il quale ci sarà solo mare e più vicino al centro sarai più probabilità ci saranno di ottenere valori alti provocando un'effetto montagna. Se le sone di massima altezza saranno separate dal centro come nella tua immagine allora la punta dell'isola verà "allungata" provocando un'effetto anche migliore e più simile alle immagini che hai postato. Si potrebbe ulteriormente lavorarci usando proporzioni meno lineari e quindi anzichè fare un cono si può lavorare su mezza sfera (per eventuali easing ci penseremo poi, quelli di sto sito ed anche altri sono già tutti convertiti in GML dal sottoscritto, basta chiedere)
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you

DeathSeller1
Newbie
Messaggi: 16
Iscritto il: 16/01/2018, 16:40
Uso: GM:Studio 2
Contatta:

Re: Diagramma di Voronoi

Messaggio da DeathSeller1 »

Ciao Jak e grazie per la risposta.
Jak ha scritto:Per cosa devi fare sta roba nello specifico? Avere dettagli su cosa ti è utile e cosa no e con quale apporssimazione sicuramente aiuta
Ho paura che fare la media porterebbe sfalsare il diagramma di voronoi anche se non ne sono sicuro.
L'idea è (essere in grado di) replicare il lavoro di questo ragazzo. Trovo che l'aspetto finale sia superlativo e, come scrivi tu più in basso, addirittura migliorabile aggiungendo dei cambiamenti nel dislivello (lo scrive anche lui, alla fine dell'articolo), usando l'easing appunto. Ma questo verrà poi.

La media funziona per quello che mi serve. Mi spiego. Ho creato una griglia quadrata, dentro ogni griglia ho creato un punto (p) in posizione randomica. Ho applicato il (mio, ne vado fiero :asd: ) diagramma di Voronoi, quindi ora ogni pixel fa parte di un'area specifica (un poligono) che è la stessa area del suo punto (p) più vicino. Facendo la media matematica dei valori x e y di ogni pixel di un'area ottengo un valore x e y. Sposto qui il punto (p), solo lui, i poligoni non subiscono cambiamenti, quindi il diagramma di Voronoi (che è stato fatto una sola volta e non verrà più ripetuto!) non viene alterato. L'aspetto dei poligoni non sarà identico a quello dell'articolo, ma è funzionale allo scopo e mi basta.
Jak ha scritto:Il risultato finale dovrà essere una maglia come nell'ultima immagine oppure ti serve veramente conoscere il segmento in mezzo come nella penultima?
Se l'obiettivo è l'immagine finale, suppongo per interpolare lavorando in triangoli allora la soluzione più semplice ma dispendiosa è quella di verificare i pixel adiacenti per ogni pixel in modo tale da scoprire quali aree si toccano ed a quel punto si lavora a generare la maglia (abbastanza facile, per ogni collegamento ottenuto verifichi su entrambi i punti se ci sono dei punti in comune che eccetto i bordi sono 2 per ogni collegamento)
Ho bisogno (anche) di conoscere e salvare (ds_grid ancora, suppongo) quali aree (poligoni) sono adiacenti, tutti i segmenti che dividono le aree (blu nell'immagine, ad esempio serviranno per i fiumi) e tutti i segmenti che collegano i punti di aree adiacenti (quelli rossi). Sono fermo qui.
L'articolo parla di un algoritmo che sfrutta la triangolazione di Delaunay, arabo per me.
Nel caso tu o qualcuno fosse in grado di darmi una mano per capire come funziona sarebbe grandissimo. Altrimenti farò come hai scritto anche se ho molta paura per le prestazioni in quanto i calcoli saranno davvero moltissimi.
Jak ha scritto:Adesso che ho letto per benine l'articolo che hai linkato ho più o meno capito che idea hai.
Tornando ai vecchi sistemi se il tuo problema è unicamente quello di creare un'isola ti basta fare una proporzione tra il valore di altezza ottenuto e la distanza da un punto centrale che definisci te. Una sorta di cono oltre il quale ci sarà solo mare e più vicino al centro sarai più probabilità ci saranno di ottenere valori alti provocando un'effetto montagna. Se le sone di massima altezza saranno separate dal centro come nella tua immagine allora la punta dell'isola verà "allungata" provocando un'effetto anche migliore e più simile alle immagini che hai postato. Si potrebbe ulteriormente lavorarci usando proporzioni meno lineari e quindi anzichè fare un cono si può lavorare su mezza sfera (per eventuali easing ci penseremo poi, quelli di sto sito ed anche altri sono già tutti convertiti in GML dal sottoscritto, basta chiedere)
Esattamente. Appena terminato il "database" dei vari segmenti, il passo successivo dovrebbe essere questo.
All'inizio volevo solo creare un'isola, ma visto quanto è bello questo lavoro, ho deciso di replicare il più possibile.

Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: Diagramma di Voronoi

Messaggio da Jak »

Anche se è molto dispendiosa per ora comincierei a trovare i collegamenti proprio con la soluzione più lenta di controllare tutti i pixel. Per sfruttare metodi più veloci bisognerà cominciare già con la generazione a pensare in modo diverso e non usare minimamente i pixel. Ho qualche idea ma comunque lenta e bisogna lavorarci un pò su, vedrò di spiegarti dopo se sarà effettivamente necessario per prestazioni.
Per triangolare lascia stare delunay ed altri schemi "generici" per la creazione di maglie, lui lo avrà fatto per comodità perchè semplicemente non ha pensato alla soluzione più semplice che ho descritto prima conoscendo già determinate cose, io li ho intravisti ma non abbastanza bene da saper replicare senza smadonnarci su.
Guarda la tua immagine:
Immagine
I lati di ogni triangolo della maglia sono stati creati nel momento in cui trovi i collegamenti da un punto ad un'altro. Per riconoscere a tutti gli effetti un triangolo ti basterà (per ogni punto) prendere un punto a caso, poi sfruttare i collegamenti per trovare i punti collegati, ed infine vedere quali sono i punti in comune tra i due.
Immagine
Parti da un collegamento in verde a caso e trovi il terzo punto verificando quali sono in comune.
Come puoi vedere due punti hanno SEMPRE E SOLO 2 punti in comune, ad eccezione dei bordi che ne hanno soltanto uno.
Ogni volta che trovi una terna di punti produci un triangolo. Per fare l'algoritmo in maneira semplice fai una passata a posteriori dove per ogni triangolo generato verifichi che non ne hai creati altri di uguali (che sfrutta gli stessi punti)
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you

DeathSeller1
Newbie
Messaggi: 16
Iscritto il: 16/01/2018, 16:40
Uso: GM:Studio 2
Contatta:

Re: Diagramma di Voronoi

Messaggio da DeathSeller1 »

Molto interessante. Grazie Jak, stanotte mi ci metto!

Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: Diagramma di Voronoi

Messaggio da Jak »

Son passate quasi 2 settimane ormai. Com'è andata?
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you

Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 6 ospiti