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;
32 for (int i=0; i<4; i++) {
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();
59 for (fragment= used-1;
60 fragment >= 0 && index < fragments[fragment]->entries[0].index;
63 Fragment *nf= insertfragment(0);
65 nf->entries[0].index= index;
66 nf->entries[0].cell= it;
71 entry < fragments[fragment]->used &&
72 index > fragments[fragment]->entries[entry].index;
74 if (fragments[fragment]->used >= fragmentsize) {
75 Fragment *nf= insertfragment(fragment+1);
76 nf->used= fragmentsize>>1;
77 fragments[fragment]->used -= nf->used;
79 fragments[fragment]->entries + fragments[fragment]->used,
80 nf->used*sizeof(Entry));
81 if (entry >= fragments[fragment]->used) {
82 entry-= fragments[fragment]->used;
86 memmove(fragments[fragment]->entries + entry+1,
87 fragments[fragment]->entries + entry,
88 sizeof(Entry) * (fragments[fragment]->used - entry));
89 fragments[fragment]->entries[entry].index= index;
90 fragments[fragment]->entries[entry].cell= it;
91 fragments[fragment]->used++;
94 SortedCellList::~SortedCellList() {
95 for (int fragment=0; fragment<used; fragment++) {
96 for (int entry=0; entry<fragments[fragment]->used; entry++) {
97 delete fragments[fragment]->entries[entry].cell;
99 delete fragments[fragment];
104 void SortedCellList::display(Output& o) {
106 for (int fragment=0; fragment<used; fragment++) {
107 for (int entry=0; entry<fragments[fragment]->used; entry++) {
108 if (Point::indexvisible(fragments[fragment]->entries[entry].index)) {
109 fragments[fragment]->entries[entry].cell->display(o);