RetroAvatarsをHSPに移植する
大会も終わったことだし、アルゴリズムばっかりやるのからは少し離れて何かプログラムを作ることにした。
そこで、いまRetro Avatars - Radium Softwareで以前紹介されていたRetro AvatarsをHSPで書こうとしている。
Retro Avatarsは文字列からレトロなキャラクターを生成するソフトで、C++のソースも公開されている。
ソースを読みつつ作っていたけれど、キャラクターの顔を整える"enhanceFace"のところがよくわからない。
これがないと生成されるキャラクターがちゃらんぽらんになっちゃうから、大事なところなんだけれど……。
途中経過(149行)
#define W 12 #define H 12 #define EMPTY_COL 0 #define SOLID_COL 255 #define EYES_COL 1 screen 0, 250, 250 titleStr = "TANINI" size = length(titleStr) dim g, 14, 14 code = 0 randomize(0) repeat 32 code = code + (peek(titleStr,cnt\size)*rnd(3071)\1024) loop randomize(code) R = rnd(3263)\192 + 64 G = rnd(3263)\192 + 64 B = rnd(3263)\192 + 64 color 0, 0, 0 : boxf *initGraph repeat 14 i = cnt repeat 14 g.i.cnt = EMPTY_COL loop loop *createGraph repeat H, 1 y = cnt repeat W, 1 x = cnt c = 158 if( rnd(3203)\356 > c ){ g.y.x = EMPTY_COL } else { g.y.x = SOLID_COL } loop loop *removeNoise dim xt1, 8 : dim yt1, 8 xt1 = -1, 0, 1, -1, 1, -1, 0, 1 yt1 = -1, -1, -1, 0, 0, 1, 1, 1 dim xt2, 4 : dim yt2, 4 xt2 = 0, 1, 0, -1 yt2 = -1, 0, 1, 0 repeat 4 for y, 1, H+1, 1 for x, 1, W+1, 1 if( g.y.x == EMPTY_COL ){ p = 0 for i, 0, 8, 1 y0 = y+yt1.i : x0 = x+xt1.i p = p + g.y0.x0 next if p >= SOLID_COL*8 { g.y.x = SOLID_COL } if( g.(y-1).x==SOLID_COL && g.(y+1).x==SOLID_COL ){ if( g.(x-1).x!=SOLID_COL && g.(x+1).x!=SOLID_COL ){ if ( rnd(3274)\5>2 ){ g.y.x = SOLID_COL } } } if( g.(y-1).x==SOLID_COL && g.(y+1).x==SOLID_COL ){ if( g.(x-1).x==SOLID_COL && g.(x+1).x==SOLID_COL ){ if( rnd(3274)\5>2 ){ g.y.x = SOLID_COL } } } } next next for y, 1, H+1, 1 for x, 1, W+1, 1 if( g.y.x == SOLID_COL ){ p = 0 for i, 0, 8, 1 y0 = y+yt1.i : x0 = x+xt1.i p = p + g.y0.x0 next if p <= 0 { g.y.x = EMPTY_COL } } next next loop *enhanceFace hx = W/2-1 for y, 1, H/2,1 tmp = hx-1 if( g.y.tmp == EMPTY_COL ){ g.y.tmp = EYES_COL } tmp = hx-2 if( g.y.tmp == EMPTY_COL ){ g.y.tmp = EYES_COL } next *mirror x_sym = 1 : y_sym = 0 for y, 1, H+1, 1 for x, 1, W/2+1, 1 p = g.y.x x0 = W-x+1 if x_sym == 1 : g.y.x0 = p next next *draw repeat H, 1 y = cnt repeat W, 1 x = cnt if( g.y.x == SOLID_COL || g.y.x == EYES_COL ){ color R, G, B } else { color 0, 0, 0 } boxf 10+x*10, 10+y*10, 10+x*10+10, 10+y*10+10 loop loop