|
|
1.1 ! root 1: #include <stdio.h> ! 2: ! 3: #define SZ 512 ! 4: ! 5: typedef struct Node { ! 6: int x, y; ! 7: struct Node *nxt; /* contour */ ! 8: int soc; /* node is start of new curve */ ! 9: } Node; ! 10: ! 11: Node *frst = (Node *) 0; ! 12: int lcnt=0; ! 13: extern int Factor; ! 14: ! 15: zaplist() ! 16: { Node *ptr = frst; ! 17: Node *save; ! 18: ! 19: while (ptr) ! 20: { save = ptr->nxt; ! 21: free(ptr); ! 22: ptr = save; ! 23: } ! 24: frst = (Node *) 0; ! 25: } ! 26: ! 27: addnode(n, m, p) ! 28: { Node *tmp, *hunt, *last; ! 29: ! 30: tmp = (Node *) malloc(sizeof(Node)); ! 31: if (!tmp) ! 32: return; ! 33: ! 34: tmp->nxt = (Node *) 0; ! 35: tmp->x = n; ! 36: tmp->y = m; ! 37: tmp->soc = p; ! 38: if (!frst) ! 39: frst = tmp; ! 40: else ! 41: { last = frst; hunt = last->nxt; ! 42: while (hunt) ! 43: { last = hunt; ! 44: hunt = last->nxt; ! 45: } ! 46: last->nxt = tmp; ! 47: } ! 48: } ! 49: ! 50: compar(a, b) ! 51: int *a, *b; ! 52: { ! 53: return (*a>*b)?1:(*a<*b)?-1:0; ! 54: } ! 55: ! 56: runcontour() ! 57: { Node *hunt; ! 58: int miny, maxy; ! 59: int *xx, *yy; ! 60: int x, y, cnt, total, partial; ! 61: ! 62: if (!frst) ! 63: return; ! 64: ! 65: hunt = frst; ! 66: miny = hunt->y; maxy = hunt->y; ! 67: cnt = 0; ! 68: while (hunt) ! 69: { if (hunt->y < miny) miny = hunt->y; ! 70: if (hunt->y > maxy) maxy = hunt->y; ! 71: hunt = hunt->nxt; ! 72: cnt++; ! 73: } ! 74: xx = (int *) malloc(cnt * sizeof(int)); /* max # intersections */ ! 75: yy = (int *) malloc(cnt * sizeof(int)); /* max # intersections */ ! 76: if (!xx || !yy) ! 77: { fprintf (stderr, "out of memory\n"); ! 78: return; ! 79: } ! 80: for (y = miny; y < maxy; y++) ! 81: { if ((cnt = intersect(xx, y)) <= 1) ! 82: continue; ! 83: qsort(xx, cnt, sizeof(int), compar); ! 84: /* scale */ ! 85: for (x = 0; x < cnt-1; x += 2) ! 86: { if (x == 0) ! 87: yy[0] = xx[0] - (xx[0]*Factor)/100; ! 88: else ! 89: yy[x] = xx[x] - ((xx[x]-xx[x-1])*Factor)/200; ! 90: if (x+1 == cnt-1) ! 91: yy[x+1] = xx[x+1] + ((SZ - xx[x+1])*Factor)/100; ! 92: else ! 93: yy[x+1] = xx[x+1] + ((xx[x+2]-xx[x+1])*Factor)/200; ! 94: } ! 95: for (x = 0; x < cnt; x++) ! 96: xx[x] = yy[x]; ! 97: /* end scale */ ! 98: for (x = total = 0; x < cnt-1; x += 2) ! 99: total += xx[x+1] - xx[x]; ! 100: for (x = partial = 0; x < cnt-1; x += 2) ! 101: { doline(xx[x], xx[x+1], SZ-y, partial, total); ! 102: partial += xx[x+1] - xx[x]; ! 103: } } ! 104: free(xx); ! 105: } ! 106: ! 107: doline(a, b, c, p, t) ! 108: { int q; ! 109: ! 110: if (a >= b) return; ! 111: lcnt++; ! 112: if (lcnt%100 == 0) ! 113: printf("}\ndef curve%d() {\n", lcnt); ! 114: if (b-a == t) ! 115: printf("mapper(%d,%d,0,%d,%d)\n", a, b, SZ-1, c); ! 116: else ! 117: { if (p == 0) ! 118: { printf("setter(0, %d, %d, %d)\n", a, c, c*255/(SZ-1)); ! 119: printf("mapper(%d,%d,0,(%d*%d)/%d,%d)\n",a,b,SZ-1,b-a,t,c); ! 120: } else ! 121: { printf("x=(%d*%d)/%d;\n", SZ-1, p, t); ! 122: printf("y=x+(%d*%d)/%d;\n", SZ-1, (b-a), t); ! 123: printf("mapper(%d,%d,x,y,%d)\n", a, b, c); ! 124: if (p+b-a == t) ! 125: printf("setter(%d, %d, %d, %d)\n",b,SZ-1,c,c*255/(SZ-1)); ! 126: } ! 127: } ! 128: } ! 129: ! 130: #define Sign(n) ((n>0)?1:0) ! 131: ! 132: intersect(xx, y) ! 133: int *xx; ! 134: { ! 135: Node *hunt, *last; ! 136: int i, j, n, m; ! 137: int nhit=0; ! 138: ! 139: last = frst; ! 140: hunt = last->nxt; ! 141: while (hunt) ! 142: { n = last->y - y; ! 143: m = hunt->y - y; ! 144: if (Sign(n) != Sign(m)) ! 145: { i = last->x; j = hunt->x; ! 146: if (hunt->x > last->x) ! 147: xx[nhit++] = i + (j-i)*n/(n-m); ! 148: else ! 149: xx[nhit++] = i - (i-j)*n/(n-m); ! 150: } /* else if (n == 0 && m == 0) ! 151: { if (hunt->x > last->x) ! 152: doline(last->x, hunt->x, SZ-y); ! 153: else ! 154: doline(hunt->x, last->x, SZ-y); ! 155: } */ ! 156: last = hunt; ! 157: hunt = last->nxt; ! 158: if (hunt && hunt->soc) ! 159: { last = hunt; ! 160: hunt = last->nxt; ! 161: } ! 162: } ! 163: return nhit; ! 164: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.