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) {
28 nn[i]= checkneededline(p[i],p[(i+1)&3]);
31 Point *array= new Point[totalnn];
32 Point *inarrayp= array;
34 for (int a=0; a<nn[i]; a++) {
35 double fp= (double)a / nn[i];
36 double fn= (double)(nn[i]-a) / nn[i];
37 *inarrayp++= p[i]*fn + p[(i+1)&3]*fp;
40 o.drawcell(array,totalnn);
44 SortedCellList::Fragment* SortedCellList::insertfragment(int at) {
47 fragments= (Fragment**)realloc(fragments,sizeof(Fragment*)*size);
48 if (!fragments) { perror("realloc"); exit(1); }
50 memmove(fragments+at+1, fragments+at, sizeof(Fragment*)*(used-at));
52 Fragment *nf= new Fragment;
57 void SortedCellList::insert(Cell *it) {
58 double index= it->index();
60 for (fragment= used-1;
61 fragment >= 0 && index < fragments[fragment]->entries[0].index;
64 Fragment *nf= insertfragment(0);
66 nf->entries[0].index= index;
67 nf->entries[0].cell= it;
72 entry < fragments[fragment]->used &&
73 index > fragments[fragment]->entries[entry].index;
75 if (fragments[fragment]->used >= fragmentsize) {
76 Fragment *nf= insertfragment(fragment+1);
77 nf->used= fragmentsize>>1;
78 fragments[fragment]->used -= nf->used;
80 fragments[fragment]->entries + fragments[fragment]->used,
81 nf->used*sizeof(Entry));
82 if (entry >= fragments[fragment]->used) {
83 entry-= fragments[fragment]->used;
87 memmove(fragments[fragment]->entries + entry+1,
88 fragments[fragment]->entries + entry,
89 sizeof(Entry) * (fragments[fragment]->used - entry));
90 fragments[fragment]->entries[entry].index= index;
91 fragments[fragment]->entries[entry].cell= it;
92 fragments[fragment]->used++;
95 SortedCellList::~SortedCellList() {
96 for (int fragment=0; fragment<used; fragment++) {
97 for (int entry=0; entry<fragments[fragment]->used; entry++) {
98 delete fragments[fragment]->entries[entry].cell;
100 delete fragments[fragment];
105 void SortedCellList::display(Output& o) {
107 for (int fragment=0; fragment<used; fragment++) {
108 for (int entry=0; entry<fragments[fragment]->used; entry++) {
109 if (Point::indexvisible(fragments[fragment]->entries[entry].index)) {
110 fragments[fragment]->entries[entry].cell->display(o);