#define TURTLE_SIZE 4 #define TURTLE_SPEED_STEP 2 #define ANGLES 35 F64 angles[ANGLES]={ -2*ã/1,-2*ã/2,-2*ã/3,-2*ã/4,-2*ã/5, -2*ã/6,-2*ã/8,-2*ã/9,-2*ã/10, -2*ã/12,-2*ã/15,-2*ã/18,-2*ã/20, -2*ã/24,-2*ã/30,-2*ã/36,-2*ã/40, 0, 2*ã/40,2*ã/36,2*ã/30,2*ã/24, 2*ã/20,2*ã/18,2*ã/15,2*ã/12, 2*ã/10,2*ã/9,2*ã/8,2*ã/6, 2*ã/5,2*ã/4,2*ã/3,2*ã/2,2*ã/1 }; class Turtle { F64 x,y,z,speed,é,w; I64 dé_idx; CColorROPU16 edge,middle; Bool ends,first; } tt; U0 TurtlePlot(CDC *dc,Turtle *t,CColorROPU16 edge,CColorROPU16 middle) { F64 w=t->w/2.0-1; if (w<0) w=0; dc->color=middle; GrLine3(dc,t->x+w*Cos(t->é+ã/2),t->y+w*Sin(t->é+ã/2),t->z, t->x+w*Cos(t->é-ã/2),t->y+w*Sin(t->é-ã/2),t->z); w=t->w/2.0; dc->color=edge; GrPlot3(dc,t->x+w*Cos(t->é+ã/2),t->y+w*Sin(t->é+ã/2),t->z); GrPlot3(dc,t->x+w*Cos(t->é-ã/2),t->y+w*Sin(t->é-ã/2),t->z); } U0 TurtleMicroMove(Turtle *t,F64 dt) { t->x+=dt*t->speed*Cos(t->é); t->y+=dt*t->speed*Sin(t->é); t->é=Wrap(t->é+dt*angles[t->dé_idx]); } U0 TurtleEnd(CDC *dc,Turtle *t,CColorROPU16 edge,CColorROPU16 middle,F64 é) { F64 r,x,y2; Turtle t2; if (r=t->w) { MemCpy(&t2,t,sizeof(Turtle)); //Save x=0; while (TRUE) { t->x+=1/r*Cos(é); t->y+=1/r*Sin(é); x+=1/r; y2=r*r-4*x*x; if (y2>=0) { t->w=Sqrt(y2); TurtlePlot(dc,t,edge,middle); } else break; } MemCpy(t,&t2,sizeof(Turtle)); } } U0 TurtleMove(CDC *dc,Turtle *t,CColorROPU16 edge,CColorROPU16 middle) { I64 i,l=16*AbsI64(t->w+1)*AbsI64(t->speed+1); if (t->ends && t->first) TurtleEnd(dc,t,edge,middle,t->é+ã); t->first=FALSE; for (i=0;iends) TurtleEnd(dc,t,edge,middle,t->é); } U0 TurtleInit(Turtle *t) { MemSet(t,0,sizeof(Turtle)); t->x=Fs->pix_width>>1; t->y=Fs->pix_height>>1; t->z=5; t->edge=BLACK; t->middle=YELLOW; t->dé_idx=ANGLES/2; t->first=TRUE; t->ends=TRUE; } U0 DrawIt(CTask *,CDC *dc) { Turtle t2; MemCpy(&t2,&tt,sizeof(Turtle)); GrPrint(dc,0,0,"Layer:%f Speed:%f é:%5.1f dé:%5.1f Width:%f", tt.z,tt.speed,tt.é*180/ã,angles[tt.dé_idx]*180/ã,tt.w); TurtleMove(dc,&t2,RED,LTRED); dc->color=LTRED; GrLine(dc,t2.x+TURTLE_SIZE*Cos(t2.é+ã/2),t2.y+TURTLE_SIZE*Sin(t2.é+ã/2), t2.x+TURTLE_SIZE*Cos(t2.é-ã/2),t2.y+TURTLE_SIZE*Sin(t2.é-ã/2)); GrLine(dc,t2.x+TURTLE_SIZE*Cos(t2.é+ã/2),t2.y+TURTLE_SIZE*Sin(t2.é+ã/2), t2.x+TURTLE_SIZE*Cos(t2.é), t2.y+TURTLE_SIZE*Sin(t2.é)); GrLine(dc,t2.x+TURTLE_SIZE*Cos(t2.é-ã/2),t2.y+TURTLE_SIZE*Sin(t2.é-ã/2), t2.x+TURTLE_SIZE*Cos(t2.é), t2.y+TURTLE_SIZE*Sin(t2.é)); } U0 SetMenu() { I64 i; U8 buf[STR_LEN]; CMenuEntry *tmpse; for (i=0;i<=9;i++) { StrPrint(buf,"Settings/Layer%d",i); if (tmpse=MenuEntryFind(Fs->cur_menu,buf)) { if (i==tt.z) tmpse->checked=TRUE; else tmpse->checked=FALSE; } } if (tmpse=MenuEntryFind(Fs->cur_menu,"Settings/Ends")) { if (tt.ends) tmpse->checked=TRUE; else tmpse->checked=FALSE; } } U0 Lattice() { Bool aim=FALSE; I64 arg1,arg2; CDC *dc=DCAlias; DCDepthBufAlloc(dc); MenuPush( "File {" " Abort(,CH_SHIFT_ESC);" " Exit(,CH_ESC);" "}" "Play {" " Restart(,'\n');" " Step(,CH_SPACE);" " Accelerator(,,SC_CURSOR_UP);" " Break(,,SC_CURSOR_DOWN);" " Left(,,SC_CURSOR_LEFT);" " Right(,,SC_CURSOR_RIGHT);" "}" "Settings {" " Color(,'c');" " Wider(,'+');" " Narrower(,'-');" " Ends(,'e');" " Layer0(,'0');" " Layer1(,'1');" " Layer2(,'2');" " Layer3(,'3');" " Layer4(,'4');" " Layer5(,'5');" " Layer6(,'6');" " Layer7(,'7');" " Layer8(,'8');" " Layer9(,'9');" "}" ); SettingsPush; //See $LK,"SettingsPush",A="MN:SettingsPush"$ AutoComplete; WinBorder; WinMax; DocCursor; DocClear; TurtleInit(&tt); SetMenu; Fs->win_inhibit=WIG_TASK_DFT-WIF_FOCUS_TASK_MENU -WIF_SELF_FOCUS-WIF_SELF_GRAB_SCROLL; Fs->draw_it=&DrawIt; try { while (TRUE) { switch (GetMsg(&arg1,&arg2,1<=TURTLE_SPEED_STEP) tt.speed-=TURTLE_SPEED_STEP; break; } break; case '0'...'9': tt.z=arg1-'0'; SetMenu; break; case 'c': tt.middle=PopUpColor("Mid Color\n\n"); tt.edge =PopUpColor("Edge Color\n\n"); break; case 'e': tt.ends=!tt.ends; break; case '+': tt.w++; break; case '-': if (tt.w) tt.w--; break; case '\n': DCFill(dc); TurtleInit(&tt); SetMenu; break; case CH_ESC: case CH_SHIFT_ESC: goto lt_done; case CH_SPACE: TurtleMove(dc,&tt,tt.edge,tt.middle); break; } } } lt_done: GetMsg(,,1<