From 0eb6ce70981deb5b711f49c77930c49181f59d95 Mon Sep 17 00:00:00 2001 From: tomsmeding Date: Sat, 3 Oct 2015 14:18:27 +0200 Subject: =?UTF-8?q?=C2=AF\=5F(=E3=83=84)=5F/=C2=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- engine.cpp | 73 ++++++++++++++++++++++++++++++++++++++++++- flogo.cpp | 103 +++++++++++++++++++++++++++++++++++++++++++------------------ flogo.h | 12 +++++++ 3 files changed, 157 insertions(+), 31 deletions(-) create mode 100644 flogo.h diff --git a/engine.cpp b/engine.cpp index 2f4fb79..7e178ff 100644 --- a/engine.cpp +++ b/engine.cpp @@ -1,9 +1,80 @@ #include +#include +#include +#include +#include +#include +#include +#include "flogo.h" #include "engine.h" using namespace std; +bool iswordstartchar(char c){return isalpha(c)||c=='_'||c=='.'||c==':';} +bool iswordchar(char c){return iswordstartchar(c)||isdigit(c);} +bool isoperator(char c){return strchr("+-*/=<>()[]",c)!=NULL;} + +vector tokenise(const char *str){ + vector tkns; + const char *p=str; + while(true){ + while(*p&&isspace(*p))p++; + if(!*p)break; + if(*p==';'){ + while(*p&&*p!='\n')p++; + continue; + } + string s; + if(iswordstartchar(*p)){ + do s+=*p++; + while(*p&&iswordchar(*p)); + } else if(isdigit(*p)){ + bool havedot=false; + do { + if(*p=='.'){ + if(!havedot)havedot=true; + else break; + } else if(!isdigit(*p))break; + s+=*p++; + } while(*p); + } else if(*p=='"'){ + while(*p&&!isspace(*p))s+=*p++; + } else if(isoperator(*p))s+=*p++; + else { + cerr<<"UNKNOWN CHAR <"<<*p<<'>'< tkns=tokenise(str); + const int ntkns=tkns.size(); + for(i=0;i=ntkns)assert(false); + const int n=stoi(tkns[i+1]); + const int newx=turtle.x+n*sin(turtle.dir*M_PI/180),newy=turtle.y-n*cos(turtle.dir*M_PI/180); + drawline(turtle.x,turtle.y,newx,newy); + turtle.x=newx; turtle.y=newy; + drawturtle(); + i++; + } else if(tkns[i]=="left"||tkns[i]=="lt"){ + if(i+1>=ntkns)assert(false); + const int n=stoi(tkns[i+1]); + turtle.dir-=n; + drawturtle(); + i++; + } else if(tkns[i]=="right"||tkns[i]=="rt"){ + if(i+1>=ntkns)assert(false); + const int n=stoi(tkns[i+1]); + turtle.dir+=n; + drawturtle(); + i++; + } else if(tkns[i]=="bye")exit(0); + } } diff --git a/flogo.cpp b/flogo.cpp index 28b754b..acb03ca 100644 --- a/flogo.cpp +++ b/flogo.cpp @@ -1,5 +1,9 @@ #include +#include #include +#include +#include + #include #include #include @@ -11,13 +15,11 @@ #include #include +#include "flogo.h" #include "engine.h" using namespace std; -const int WIDTH=1000,HEIGHT=1000; - - Fl_Window *window; Fl_Scroll *drawscroll; Fl_Box *drawimagebox,*turtleimagebox; @@ -28,34 +30,78 @@ Fl_Button *evaluatebutton; uchar *imagebuf,*turtlebuf; +Turtle turtle; + -const uchar* someimg(void){ - uchar *buf=new uchar[3*WIDTH*HEIGHT]; - int x,y; - for(y=0;yabs(x2-x1); + if(steep){ + swap(x1,y1); + swap(x2,y2); + } + if(x1>x2){ + swap(x1,x2); + swap(y1,y2); + } + deltax=x2-x1; + deltay=abs(y2-y1); + error=deltax/2; + if(y1uncache(); + window->redraw(); +} + +void drawturtle(void){ + memset(turtlebuf,0,WIDTH*HEIGHT*2*sizeof(uchar)); + const double raddir=turtle.dir*M_PI/180; + const int x1=turtle.x-15*cos(raddir), //left-bottom + y1=turtle.y-15*sin(raddir), + x2=turtle.x+15*cos(raddir), //right-bottom + y2=turtle.y+15*sin(raddir), + x3=turtle.x+15*sin(raddir), //top + y3=turtle.y-15*cos(raddir); + bresenham(x1,y1,x2,y2,turtlebuf+1,1,2,255); + bresenham(x2,y2,x3,y3,turtlebuf+1,1,2,255); + bresenham(x3,y3,x1,y1,turtlebuf+1,1,2,255); + turtleimage->uncache(); + window->redraw(); +} + + void maincallback(Fl_Widget*,void*){ if(Fl::event()==FL_SHORTCUT&&Fl::event_key()==FL_Escape)return; exit(0); } -void cmdinputcallback(Fl_Widget *wid){ - Fl_Input *inp=(Fl_Input*)wid; - histbrowser->insert(histbrowser->size(),inp->value()); - histbrowser->bottomline(histbrowser->size()); - logocommand(inp->value()); - inp->value(NULL); -} - void evaluatebuttoncallback(Fl_Widget*){ + if(cmdinput->value()[0]=='\0')return; histbrowser->insert(histbrowser->size(),cmdinput->value()); histbrowser->bottomline(histbrowser->size()); logocommand(cmdinput->value()); @@ -69,28 +115,26 @@ void histcallback(Fl_Widget *wid){ int main(int argc,char **argv){ window=new Fl_Window(1016,700,"FLogo"); - Fl_Group::current(0); //manual adding to widgets - imagebuf=new uchar[WIDTH*HEIGHT*3]; //RGB - memset(imagebuf,255,WIDTH*HEIGHT*3*sizeof(uchar)); + imagebuf=new uchar[WIDTH*HEIGHT*4]; //RGB(A) + memset(imagebuf,255,WIDTH*HEIGHT*4*sizeof(uchar)); turtlebuf=new uchar[WIDTH*HEIGHT*2]; //GA memset(turtlebuf,0,WIDTH*HEIGHT*2*sizeof(uchar)); drawscroll=new Fl_Scroll(0,0,window->w(),window->h()-150); drawimagebox=new Fl_Box(0,0,WIDTH,HEIGHT); - drawimage=new Fl_RGB_Image(imagebuf,WIDTH,HEIGHT); + drawimage=new Fl_RGB_Image(imagebuf,WIDTH,HEIGHT,4); drawimagebox->image(drawimage); - drawscroll->add(drawimagebox); turtleimagebox=new Fl_Box(0,0,WIDTH,HEIGHT); turtleimage=new Fl_RGB_Image(turtlebuf,WIDTH,HEIGHT,2); turtleimagebox->image(turtleimage); - drawscroll->add(turtleimagebox); - window->add(drawscroll); + drawscroll->end(); + drawscroll->scroll_to(max(0,WIDTH-drawscroll->w())/2,max(0,HEIGHT-drawscroll->h())/2); + drawturtle(); cmdinput=new Fl_Input(0,window->h()-25,window->w()-150,25); cmdinput->when(FL_WHEN_ENTER_KEY|FL_WHEN_NOT_CHANGED); - cmdinput->callback(cmdinputcallback); - window->add(cmdinput); + cmdinput->callback(evaluatebuttoncallback); evaluatebutton=new Fl_Button(cmdinput->x()+cmdinput->w(),cmdinput->y(),80,cmdinput->h(),"Evaluate"); evaluatebutton->callback(evaluatebuttoncallback); @@ -98,7 +142,6 @@ int main(int argc,char **argv){ histbrowser=new Fl_Select_Browser(0,drawscroll->y()+drawscroll->h(),cmdinput->w(),cmdinput->y()-(drawscroll->y()+drawscroll->h())); histbrowser->callback(histcallback); - window->add(histbrowser); histbrowser->add(""); //add blank line window->resizable(drawscroll); diff --git a/flogo.h b/flogo.h new file mode 100644 index 0000000..f5b1065 --- /dev/null +++ b/flogo.h @@ -0,0 +1,12 @@ +#pragma once + +const int WIDTH=1000,HEIGHT=1000; + +struct Turtle{ + double x=WIDTH/2,y=HEIGHT/2,dir=0; //dir in degrees, URDL +}; + +extern Turtle turtle; + +void drawturtle(void); +void drawline(int x1,int y1,int x2,int y2); -- cgit v1.2.3