13 #include "graphics.hh"
16 static int checkneededline(Onscreen a, Onscreen b) {
19 int n= (int)ceil(sqrt(xd*xd+yd*yd)*100.0);
23 void Cell::display(Output& o) {
26 for (int i=0; i<4; i++) {
27 nn[i]= checkneededline(p[i],p[(i+1)&3]);
30 Point *array= new Point[totalnn];
31 Point *inarrayp= array;
33 for (int a=0; a<nn[i]; a++) {
34 double fp= (double)a / nn[i];
35 double fn= (double)(nn[i]-a) / nn[i];
36 *inarrayp++= p[i]*fn + p[(i+1)&3]*fp;
39 o.drawcell(array,totalnn);
43 SortedCellList::Fragment* SortedCellList::insertfragment(int at) {
46 fragments= (Fragment**)realloc(fragments,sizeof(Fragment*)*size);
47 if (!fragments) { perror("realloc"); exit(1); }
49 memmove(fragments+at+1, fragments+at, sizeof(Fragment*)*(used-at));
51 Fragment *nf= new Fragment;
56 void SortedCellList::insert(Cell *it) {
57 double index= it->index();
58 for (int fragment= used-1;
59 fragment >= 0 && index < fragments[fragment]->entries[0].index;
62 Fragment *nf= insertfragment(0);
64 nf->entries[0].index= index;
65 nf->entries[0].cell= it;
69 entry < fragments[fragment]->used &&
70 index > fragments[fragment]->entries[entry].index;
72 if (fragments[fragment]->used >= fragmentsize) {
73 Fragment *nf= insertfragment(fragment+1);
74 nf->used= fragmentsize>>1;
75 fragments[fragment]->used -= nf->used;
77 fragments[fragment]->entries + fragments[fragment]->used,
78 nf->used*sizeof(Entry));
79 if (entry >= fragments[fragment]->used) {
80 entry-= fragments[fragment]->used;
84 memmove(fragments[fragment]->entries + entry+1,
85 fragments[fragment]->entries + entry,
86 sizeof(Entry) * (fragments[fragment]->used - entry));
87 fragments[fragment]->entries[entry].index= index;
88 fragments[fragment]->entries[entry].cell= it;
89 fragments[fragment]->used++;
92 SortedCellList::~SortedCellList() {
93 for (int fragment=0; fragment<used; fragment++) {
94 for (int entry=0; entry<fragments[fragment]->used; entry++) {
95 delete fragments[fragment]->entries[entry].cell;
97 delete fragments[fragment];
102 void SortedCellList::display(Output& o) {
104 for (int fragment=0; fragment<used; fragment++) {
105 for (int entry=0; entry<fragments[fragment]->used; entry++) {
106 if (Point::indexvisible(fragments[fragment]->entries[entry].index)) {
107 fragments[fragment]->entries[entry].cell->display(o);