Tracer des diagrammes dans un terminal - retour accueil
git clone git://bebou.netlib.re/boxes
Log | Files | Refs | README |
boxes.c (4817B)
1 #define TB_IMPL 2 #include "termbox2.h" 3 4 #define MAX_BOX_NB 100 5 6 struct box { int x; int y; int h; int w; }; 7 struct arrow { int startx; int starty; int endx; int endy; }; 8 struct boxpile { struct box* list; int count; }; 9 struct arrowpile { struct arrow* list; int count; }; 10 11 void drawboxcoord(int x, int y, int w, int h) { 12 if(w<0) { x=x+w; w=-w; } 13 if(h<0) { y=y+h; h=-h; } 14 tb_printf(x+w,y+h,TB_DEFAULT,TB_DEFAULT,"╯"); 15 tb_printf(x+w,y,TB_DEFAULT,TB_DEFAULT,"╮"); 16 tb_printf(x,y+h,TB_DEFAULT,TB_DEFAULT,"╰"); 17 tb_printf(x,y,TB_DEFAULT,TB_DEFAULT,"╭"); 18 for (int i=1;i<w;i++) { 19 tb_printf(x+i,y,TB_DEFAULT,TB_DEFAULT, "─"); 20 tb_printf(x+i,y+h,TB_DEFAULT,TB_DEFAULT, "─"); 21 } 22 for (int i=1;i<h;i++) { 23 tb_printf(x,y+i,TB_DEFAULT,TB_DEFAULT, "│"); 24 tb_printf(x+w,y+i,TB_DEFAULT,TB_DEFAULT, "│"); 25 } 26 tb_printf(0,0,TB_DEFAULT,TB_DEFAULT,"x: %d, y: %d\nw: %d, h: %d",x,y,w,h); 27 } 28 29 void drawbox(struct box b) { drawboxcoord(b.x,b.y,b.w,b.h); } 30 31 void drawarrowcoord(int startx, int starty, int endx, int endy) { 32 int i=0; int j=0; signed int nx; signed int ny; 33 if(endx<startx) nx=-1; else nx=1; 34 if(endy<starty) ny=-1; else ny=1; 35 for(i=0;i<abs(startx-endx);i++) { 36 tb_printf(startx+nx*i,starty+ny*j,0,0,"─"); 37 } 38 if(ny==1 && nx==1) tb_printf(startx+nx*i,starty,0,0,"╮"); 39 else if(ny==1 && nx==-1) tb_printf(startx+nx*i,starty,0,0,"╭"); 40 else if(ny==-1 && nx==1) tb_printf(startx+nx*i,starty,0,0,"╯"); 41 else tb_printf(startx+nx*i,starty,0,0,"╰"); 42 for(int j=1;j<abs(starty-endy);j++) { 43 tb_printf(startx+nx*i,starty+ny*j,0,0,"│"); 44 } 45 tb_printf(endx,endy,0,0,"→"); 46 tb_printf(0,0,TB_DEFAULT,TB_DEFAULT,"start: x%d,y%d, end: x%d,y%d",startx,starty,endx,endy); 47 } 48 49 void drawarrow(struct arrow a) { drawarrowcoord(a.startx,a.starty,a.endx,a.endy); } 50 51 struct arrow createarrow(int startx, int starty, int endx, int endy) { 52 struct arrow a; 53 a.startx=startx; a.starty=starty; a.endx=endx; a.endy=endy; return a; 54 } 55 56 void addarrow(struct arrowpile *arrows, struct arrow a) { 57 arrows->list[arrows->count]=a; 58 arrows->count++; 59 } 60 61 void deletearrow(struct arrowpile *arrows, int index) { 62 for (int i=index;i<arrows->count-1;i++) arrows->list[i]=arrows->list[i+1]; 63 if(arrows->count>0) arrows->count--; 64 } 65 66 struct box createbox(int x, int y, int w, int h) { 67 struct box b; b.x=x; b.y=y; b.w=w; b.h=h; return b; 68 } 69 70 void addbox(struct boxpile *boxes, struct box b) { 71 boxes->list[boxes->count]=b; 72 boxes->count++; 73 } 74 75 void deletebox(struct boxpile *boxes, int index) { 76 for (int i=index;i<boxes->count-1;i++) boxes->list[i]=boxes->list[i+1]; 77 if(boxes->count>0) boxes->count--; 78 } 79 80 int main(int argc, char **argv) { 81 tb_init(); 82 tb_hide_cursor(); 83 tb_set_input_mode(TB_INPUT_ESC | TB_INPUT_MOUSE); 84 int mode=0; 85 struct tb_event ev; 86 struct boxpile boxes; boxes.list=malloc(MAX_BOX_NB*sizeof(struct box)); boxes.count=0; 87 struct arrowpile arrows; arrows.list=malloc(MAX_BOX_NB*sizeof(struct arrow)); arrows.count=0; 88 int curx; int cury; 89 while(1) { 90 tb_clear(); 91 for (int i=0;i<boxes.count;i++) drawbox(boxes.list[i]); 92 for (int i=0;i<arrows.count;i++) drawarrow(arrows.list[i]); 93 tb_printf(0,tb_height()-1,TB_DEFAULT,TB_DEFAULT,"count: %d, mode: %d",boxes.count,mode); 94 tb_present(); 95 tb_poll_event(&ev); 96 switch(ev.ch) { 97 case 97: /*a*/ 98 mode=1; 99 break; 100 case 98: /*b*/ 101 mode=0; 102 break; 103 } 104 switch(ev.key) { 105 case 13: /*Enter*/ 106 tb_shutdown(); 107 free(boxes.list); 108 return 0; 109 case 65512: /*MouseLeft*/ 110 switch(mode) { 111 case 0: 112 if(boxes.count==MAX_BOX_NB) break; 113 curx=ev.x; cury=ev.y; 114 while(ev.key!=65509) { /*MouseRelease*/ 115 tb_clear(); 116 for (int i=0;i<boxes.count;i++) drawbox(boxes.list[i]); 117 for (int i=0;i<arrows.count;i++) drawarrow(arrows.list[i]); 118 drawboxcoord(curx,cury,ev.x-curx,ev.y-cury); 119 tb_present(); 120 tb_poll_event(&ev); 121 } 122 addbox(&boxes,createbox(curx,cury,ev.x-curx,ev.y-cury)); 123 break; 124 case 1: 125 if(arrows.count==MAX_BOX_NB) break; 126 curx=ev.x; cury=ev.y; 127 while(ev.key!=65509) { /*MouseRelease*/ 128 tb_clear(); 129 for (int i=0;i<boxes.count;i++) drawbox(boxes.list[i]); 130 for (int i=0;i<arrows.count;i++) drawarrow(arrows.list[i]); 131 drawarrowcoord(curx,cury,ev.x,ev.y); 132 tb_present(); 133 tb_poll_event(&ev); 134 } 135 addarrow(&arrows,createarrow(curx,cury,ev.x,ev.y)); 136 break; 137 } 138 break; 139 case 26: /*ctrl+z*/ 140 switch(mode) { 141 case 0: 142 deletebox(&boxes,boxes.count-1); 143 break; 144 case 1: 145 deletearrow(&arrows,arrows.count-1); 146 break; 147 } 148 break; 149 case 65511: /*MouseRight*/ 150 for(int i=0;i<boxes.count;i++) 151 if(ev.x==boxes.list[i].x && ev.y==boxes.list[i].y) { 152 deletebox(&boxes,i); 153 break; 154 } 155 break; 156 } 157 } 158 return 0; 159 }