Sommario: puoi proporre un algoritmo matematico su un piano di pixel che genererà un'immagine moderatamente interessante, preferibilmente una che nel complesso assomiglia a qualcosa?Generazione di immagini moderatamente interessanti
La storia finora:
C'era una volta ho deciso, nel tentativo di ridurre i rifiuti del ciclo sul mio (certamente troppo) numerosi computer, e di cui per generare immagini in un moderatamente interessante moda ; utilizzando un PRNG e una matematica intelligente per creare immagini che nel complesso, assomigliano a qualcosa di.
O almeno, quello era il piano. A quanto pare, la matematica intelligente richiede di essere un matematico intelligente; questo non lo sono.
A un certo punto sono arrivato a un metodo che preferiva le linee rette (dato che generalmente sono le componenti di cui è fatto il nostro mondo), forse troppo forte. Il risultato è moderatamente interessante; assomigliano, forse, le griglie della città, come ad esempio:
City grids, maybe? http://totlandweb.info/imggen.out.png
Ora per la domanda corretta: Dato il codice sorgente di questo piccolo programma; puoi migliorarlo e proporre un metodo che dia risultati un po 'più interessanti? (ad esempio non le griglie della città, ma forse le facce, gli animali, la geografia, cosa hai)
Questo è anche inteso come una sorta di sfida; Suppongo e come tale ho impostato alcune regole completamente arbitrarie e ugualmente opzionali:
I commenti nel codice dicono tutto davvero. Suggerimenti e "soluzioni" dovrebbero modificare l'algoritmo stesso, non il framework circostante, eccetto per correggere gli errori che impediscono la compilazione del campione.
Il codice deve essere compilato in modo pulito con un compilatore C di emissione standard. (Se l'esempio fornita non, oops! Dimmi, e io preparo. :)
Il metodo dovrebbe, anche se ancora una volta, questo è facoltativo, non hanno bisogno di aiuto da suscitare tuo quartiere matematica amichevole libreria, e nel complesso utilizzare un (P) RNG come il suo canale di input dati primario .
Solutions dovrebbe probabilmente essere consegnabile, semplicemente tirando fuori tutto ciò che è tra le linee snip (quelli che dicono non si deve modificare al di sopra e al di sotto, rispettivamente), con una dichiarazione per l'effetto di ciò che è necessario aggiungere in particolare al preambolo.
Edit: A volte è facile dimenticare che persone su internet non possono leggere la mia mente ; ma ci vai. Il programma dovrebbe richiedere un minimo di intervento umano in la generazione delle immagini, tranne che per valutare i risultati e scegliere i migliori .
Il codice richiede un compilatore C e libpng da compilare; Non sono del tutto sicuro che il compilatore MinGW fornisca le necessità, ma sarei sorpreso se non lo facesse. Per Debian è necessario il pacchetto libpng-dev e per Mac OS X è necessario gli strumenti XCode.
Il codice sorgente può essere downloaded here.
Avviso: Codice massivo sfocatura in arrivo!
// compile with gcc -o imggen -lpng imggen.c
// optionally with -DITERATIONS=x, where x is an appropriate integer
// If you're on a Mac or using MinGW, you may have to fiddle with the linker flags to find the library and includes.
#include <stdio.h>
#include <stdlib.h>
#include <png.h>
#ifdef ITERATIONS
#define REPEAT
#endif // ITERATIONS
// YOU MAY CHANGE THE FOLLOWING DEFINES
#define WIDTH 320
#define HEIGHT 240
// YOU MAY REPLACE THE FOLLOWING DEFINES AS APPROPRIATE
#define INK 16384
void writePNG (png_bytepp imageBuffer, png_uint_32 width, png_uint_32 height, int iteration) {
char *fname;
asprintf(&fname, "out.%d.png", iteration);
FILE *fp = fopen(fname, "wb");
if (!fp) return;
png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
png_infop info_ptr = png_create_info_struct(png_ptr);
png_init_io(png_ptr, fp);
png_set_filter(png_ptr, PNG_FILTER_TYPE_DEFAULT, PNG_FILTER_NONE);
png_set_compression_level(png_ptr, Z_BEST_COMPRESSION);
png_set_IHDR(png_ptr, info_ptr, width, height, 8,
PNG_COLOR_TYPE_GRAY, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
png_set_rows(png_ptr, info_ptr, imageBuffer);
png_set_invert_mono(png_ptr); /// YOU MAY COMMENT OUT THIS LINE
png_write_png(png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, NULL);
png_destroy_write_struct(&png_ptr, &info_ptr);
fclose(fp);
free(fname);
}
int main (int argc, const char * argv[]) {
png_uint_32 height = HEIGHT, width = WIDTH;
int iteration = 1;
#ifdef REPEAT
for (iteration = 1; iteration <= ITERATIONS; iteration++) {
#endif // REPEAT
png_bytepp imageBuffer = malloc(sizeof(png_bytep) * height);
for (png_uint_32 i = 0; i < height; i++) {
imageBuffer[i] = malloc(sizeof(png_byte) * width);
for (png_uint_32 j = 0; j < width; j++) {
imageBuffer[i][j] = 0;
}
}
/// CUT ACROSS THE DASHED LINES
/// -------------------------------------------
/// NO EDITING ABOVE THIS LINE; EXCEPT AS NOTED
int ink = INK;
int x = rand() % width, y = rand() % height;
int xdir = (rand() % 2)?1:-1;
int ydir = (rand() % 2)?1:-1;
while (ink) {
imageBuffer[y][x] = 255;
--ink;
xdir += (rand() % 2)?(1):(-1);
ydir += (rand() % 2)?(1):(-1);
if (ydir > 0) {
++y;
} else if (ydir < 0) {
--y;
}
if (xdir > 0) {
++x;
} else if (xdir < 0) {
--x;
}
if (x == -1 || y == -1 || x == width || y == height || x == y && x == 0) {
x = rand() % width; y = rand() % height;
xdir = (rand() % 2)?1:-1;
ydir = (rand() % 2)?1:-1;
}
}
/// NO EDITING BELOW THIS LINE
/// -------------------------------------------
writePNG(imageBuffer, width, height, iteration);
for (png_uint_32 i = 0; i < height; i++) {
free(imageBuffer[i]);
}
free(imageBuffer);
#ifdef REPEAT
}
#endif // REPEAT
return 0;
}
Nota: Anche se questa domanda non in senso stretto sembra "responsabili" in quanto tale; Credo ancora che possa dare origine a qualche modo di risposta "giusta". Può essere.
Buona caccia.
Edit (di nuovo): Il codice sorgente per i percorsi di Bezier semplicistici utilizzati nella mia risposta (leggi in basso) si possono trovare here e here.
+1 per una bella domanda ;-) – ChristopheD
@ChristopheD: Grazie; Ho passato un po 'di tempo a scriverlo. :) –
Disegna la Mona Lisa (non ho notato alcun requisito di "casualità" – mbeckish