13 #include "graphics.hh"
15 #include "parameter.hh"
17 static int checkneededline(Onscreen a, Onscreen b) {
20 int n= (int)ceil(sqrt(xd*xd+yd*yd)*100.0);
24 static Parameter<double>
25 sotextpit("sotextpit", "Pitch of solid texture (0: grid mode)",
28 void Cell::display(Output& o) {
33 nn[i]= checkneededline(p[i],p[(i+1)&3]);
36 Point *array= new Point[totalnn];
37 Point *inarrayp= array;
40 for (int a=0; a<nn[i]; a++) {
41 double fp= (double)a / nn[i];
42 double fn= (double)(nn[i]-a) / nn[i];
43 *inarrayp++= p[i]*fn + p[(i+1)&3]*fp;
48 Output::Colour colour= Output::grid;
53 double remainder= modf(mean[i] / sotextpit, &intpartdummy);
54 if (remainder >= 0.5 || (remainder >= -0.5 && remainder < 0.0))
57 colour= white ? Output::solidwhite : Output::solidblack;
59 o.drawcell(array,totalnn,colour);
63 SortedCellList::Fragment* SortedCellList::insertfragment(int at) {
66 fragments= (Fragment**)realloc(fragments,sizeof(Fragment*)*size);
67 if (!fragments) { perror("realloc"); exit(1); }
69 memmove(fragments+at+1, fragments+at, sizeof(Fragment*)*(used-at));
71 Fragment *nf= new Fragment;
76 void SortedCellList::insert(Cell *it) {
77 double index= it->index();
79 for (fragment= used-1;
80 fragment >= 0 && index < fragments[fragment]->entries[0].index;
83 Fragment *nf= insertfragment(0);
85 nf->entries[0].index= index;
86 nf->entries[0].cell= it;
91 entry < fragments[fragment]->used &&
92 index > fragments[fragment]->entries[entry].index;
94 if (fragments[fragment]->used >= fragmentsize) {
95 Fragment *nf= insertfragment(fragment+1);
96 nf->used= fragmentsize>>1;
97 fragments[fragment]->used -= nf->used;
99 fragments[fragment]->entries + fragments[fragment]->used,
100 nf->used*sizeof(Entry));
101 if (entry >= fragments[fragment]->used) {
102 entry-= fragments[fragment]->used;
106 memmove(fragments[fragment]->entries + entry+1,
107 fragments[fragment]->entries + entry,
108 sizeof(Entry) * (fragments[fragment]->used - entry));
109 fragments[fragment]->entries[entry].index= index;
110 fragments[fragment]->entries[entry].cell= it;
111 fragments[fragment]->used++;
114 SortedCellList::~SortedCellList() {
115 for (int fragment=0; fragment<used; fragment++) {
116 for (int entry=0; entry<fragments[fragment]->used; entry++) {
117 delete fragments[fragment]->entries[entry].cell;
119 delete fragments[fragment];
124 void SortedCellList::display(Output& o) {
126 for (int fragment=0; fragment<used; fragment++) {
127 for (int entry=0; entry<fragments[fragment]->used; entry++) {
128 if (Point::indexvisible(fragments[fragment]->entries[entry].index)) {
129 fragments[fragment]->entries[entry].cell->display(o);