/* * Graphics library */ #include #include #include #include #include #include "library.hh" #include "graphics.hh" #include "output.hh" static int checkneededline(Onscreen a, Onscreen b) { double xd= a.x - b.x; double yd= a.y - b.y; int n= (int)ceil(sqrt(xd*xd+yd*yd)*100.0); return n>0 ? n : 1; } void Cell::display(Output& o) { int nn[4]; int totalnn= 0; for (int i=0; i<4; i++) { nn[i]= checkneededline(p[i],p[(i+1)&3]); totalnn+= nn[i]; } Point *array= new Point[totalnn]; Point *inarrayp= array; for (i=0; i<4; i++) { for (int a=0; aindex(); for (int fragment= used-1; fragment >= 0 && index < fragments[fragment]->entries[0].index; fragment--); if (fragment < 0) { Fragment *nf= insertfragment(0); nf->used= 1; nf->entries[0].index= index; nf->entries[0].cell= it; return; } for (int entry= 0; entry < fragments[fragment]->used && index > fragments[fragment]->entries[entry].index; entry++); if (fragments[fragment]->used >= fragmentsize) { Fragment *nf= insertfragment(fragment+1); nf->used= fragmentsize>>1; fragments[fragment]->used -= nf->used; memcpy(nf->entries, fragments[fragment]->entries + fragments[fragment]->used, nf->used*sizeof(Entry)); if (entry >= fragments[fragment]->used) { entry-= fragments[fragment]->used; fragment++; } } memmove(fragments[fragment]->entries + entry+1, fragments[fragment]->entries + entry, sizeof(Entry) * (fragments[fragment]->used - entry)); fragments[fragment]->entries[entry].index= index; fragments[fragment]->entries[entry].cell= it; fragments[fragment]->used++; } SortedCellList::~SortedCellList() { for (int fragment=0; fragmentused; entry++) { delete fragments[fragment]->entries[entry].cell; } delete fragments[fragment]; } free(fragments); } void SortedCellList::display(Output& o) { o.startimage(); for (int fragment=0; fragmentused; entry++) { if (Point::indexvisible(fragments[fragment]->entries[entry].index)) { fragments[fragment]->entries[entry].cell->display(o); } } } o.endimage(); }