📄 pm_genproc.cpp
字号:
{ Q_Checksize(q); q->r[q->tail] = *r; if (++q->tail == q->size) q->tail = 0;}/* Q_Dequeue - remove a rectangle from the queue */void Q_Dequeue(rect_queue *q, rect *r){ double rand_no; *r = q->r[q->head]; if (++q->head == q->size) q->head = 0; if (q->randomize && ((q->head == q->randomPt) || (q->head == q->randomPt + 1))) { int i, j, numItems; rect temp; numItems = (q->tail<q->head) ? q->size-q->head + q->tail : q->tail - q->head; for (i = q->head; i != q->tail; i++) { rand_no = drand48(); j = (int)(rand_no * numItems) + q->head; if (j >= q->size) j -= q->size; temp = q->r[j]; q->r[j] = q->r[i]; q->r[i] = temp; if (i == q->size-1) { i = -1; } } q->randomPt = q->tail; }}int RectBorderLen(rect *r){ return (r->r-r->l) ? (r->b-r->t) ? (2 * (r->r-r->l + r->b-r->t)) : (r->r - r->l + 1) : (r->b-r->t) ? (r->b - r->t + 1) : 1;}void PrintHelp(char *progName){ printf("Options recognized by %s:\n", progName); printf("(defaults are in parentheses ())\n"); printf(" -i <filename> (none) input file\n"); printf(" -xpos <xpos> (%d) window horizontal coordinate\n", DEF_xpos); printf(" -ypos <xpos> (%d) window vertical coordinate\n", DEF_ypos); printf(" -width <width> (%d) width of computed area in points\n", DEF_width); printf(" -height <height> (%d) height of computed area in points\n", DEF_height); printf(" -boundary <boundary> (%.1lf) boundary value for M-set computation\n", DEF_boundary); printf(" -maxiter <max. iter> (%d) maximum # of iterations for M-set\n", DEF_maxiter); printf(" compuptation algorithm\n"); printf(" -rmin <real min.> (%.2lf) minimum real coordinate of computed area\n", DEF_rmin); printf(" -rmax <real max.> (%.2lf) maximum real coordinate of computed area\n", DEF_rmax); printf(" -imin <imag. min.> (%.2lf) minimum imaginary coordinate of computed\n", DEF_imin); printf(" area\n"); printf(" -imax <imag. max.> (%.2lf) maximum imaginary coordinate of computed\n", DEF_imax); printf(" area\n"); printf("\n"); printf(" alternate form: (if specified, overrides <r | i><min | max>)\n"); printf(" -rcenter <real center> (%.2lf) center real coordinate of computed area\n", (DEF_rmin + DEF_rmax)/2); printf(" -icenter <imag. center> (%.2lf) center imaginary coordinate of computed\n", (DEF_imin + DEF_imax)/2); printf(" area\n"); printf(" -radius <area radius> (%.2lf) radius of the computed area\n", (DEF_rmax - DEF_rmin)); printf("\n"); printf(" -breakout <breakout size> (%d) maximum length or width rectangle to\n", DEF_breakout); printf(" subdivide\n"); printf(" -colors <# of colors> (%d) number of colors to request\n", DEF_numColors); printf(" -colreduce <reduce factor> (%d) factor by which to scale down iteration\n", DEF_colReduceFactor); printf(" values to reduce color changes\n"); printf(" <+, ->zoom (%s) turn on (off) drag&zoom\n", DEF_zoom ? "on" : "off"); printf(" <+, ->randomize (%sset) (on, off) compute regions in as random of\n", DEF_randomize ? "" : "not "); printf(" order as possible\n"); printf(" -bw (%sset) draw in black and white instead of\n", DEF_bw ? "" : "not "); printf(" color\n"); exit(0);}MPE_Color Iter2Color(Flags *flags, int iter){ if (flags->winspecs->bw) { return ((iter == flags->maxiter) ? MPE_BLACK : ((iter / flags->colReduceFactor) % 2) ? MPE_WHITE : MPE_BLACK); } else { if (iter == flags->maxiter) { return MPE_BLACK; } else { return flags->winspecs->colorArray[(iter / flags->colReduceFactor) % flags->winspecs->numColors]; } }}void ChunkIter2Color(Flags *flags, int *iterData, int *colorData, int size){ int i; for (i = 0; i<size; i++) { *colorData = Iter2Color(flags, *iterData); colorData++; iterData++; }}int ComputeChunk(Flags *flags, rect *r, MPE_Point *pointData, int *iterData, int maxnpoints, int *npoints){ int i, x, y; CalcField(flags->fractal, iterData, r->l, r->r, r->t, r->b); /* compute the field */ *npoints = (r->r - r->l + 1) * (r->b - r->t + 1); x = r->l; y = r->t; for (i = 0; i<*npoints; i++) { pointData[i].x = x++; pointData[i].y = y; pointData[i].c = Iter2Color(flags, iterData[i]); if (x > r->r) { x = r->l; y++; } } return 0;}/*int DrawChunk(MPE_XGraph graph, MPE_Color *colorData, rect r){ int a, b; for (b = r.t; b <= r.b; b++) { for (a = r.l; a <= r.r; a++) { MPE_Draw_point(graph, a, b, *colorData); colorData++; } } MPE_Update(graph); return 0;}//*/#define LOOP(start, toContinue, incrBefore, fn, check, lbl, incrAfter) \ start; \while (toContinue) \{ \incrBefore; \pointPtr->x = x; \pointPtr->y = y; \pointPtr->c = Iter2Color(flags, fn(re, im)); \check \lbl \incrAfter; \}/*fprintf(stderr, "computed (%d %d) to be %d\n", x, y, pointPtr->c); \*//* really, all these stupid loop macros will make it easier! */#define LOOP_TOP(fn, check, lbl) \ LOOP((y = r.t, x = r.l + 1), x <= r.r, NUM_ASSIGN(re, NUM_ADD(re, rstep)), \fn, check, lbl, (pointPtr++, x++));#define LOOP_RIGHT(fn, check, lbl) \ LOOP((x = r.r, y = r.t + 1), y <= r.b, NUM_ASSIGN(im, NUM_ADD(im, istep)), \fn, check, lbl, (pointPtr++, y++));#define LOOP_BOTTOM(fn, check, lbl) \ LOOP((y = r.b, x = r.r-1), x >= r.l, NUM_ASSIGN(re, NUM_SUB(re, rstep)), \fn, check, lbl, (pointPtr++, x--));#define LOOP_LEFT(fn, check, lbl) \ LOOP((x = r.l, y = r.b-1), y>r.t, NUM_ASSIGN(im, NUM_SUB(im, istep)), \fn, check, lbl, (pointPtr++, y--));#define LOOP_TOP_CHECK(fn, lbl) \LOOP_TOP(fn, if (pointPtr->c != firstColor) goto lbl; ,; );#define LOOP_RIGHT_CHECK(fn, lbl) \LOOP_RIGHT(fn, if (pointPtr->c != firstColor) goto lbl; ,; );#define LOOP_BOTTOM_CHECK(fn, lbl) \LOOP_BOTTOM(fn, if (pointPtr->c != firstColor) goto lbl; ,; );#define LOOP_LEFT_CHECK(fn, lbl) \LOOP_LEFT(fn, if (pointPtr->c != firstColor) goto lbl; ,; );#define LOOP_TOP_NOCHECK(fn, lbl) \LOOP_TOP(fn,; , lbl:);#define LOOP_RIGHT_NOCHECK(fn, lbl) \LOOP_RIGHT(fn,; , lbl:);#define LOOP_BOTTOM_NOCHECK(fn, lbl) \LOOP_BOTTOM(fn,; , lbl:);#define LOOP_LEFT_NOCHECK(fn, lbl) \LOOP_LEFT(fn,; , lbl:);#define LOOP_FN(fn, lbl1, lbl2, lbl3, lbl4) \if (r.b-r.t>1 && r.r-r.l>1) \{ \/* if there's a chance to subdivide, */ \LOOP_TOP_CHECK(fn, lbl1); \LOOP_RIGHT_CHECK(fn, lbl2); \LOOP_BOTTOM_CHECK(fn, lbl3); \LOOP_LEFT_CHECK(fn, lbl4); \*isContinuous = 1; \return 1; /* if we made it to this point, it's continuous */ \LOOP_TOP_NOCHECK(fn, lbl1); \LOOP_RIGHT_NOCHECK(fn, lbl2); \LOOP_BOTTOM_NOCHECK(fn, lbl3); \LOOP_LEFT_NOCHECK(fn, lbl4); \*isContinuous = 0; \return 0; /* it ain't continuous */ \} \else \{ /* if there's no chance to subdivide, don't insert the checks */ \LOOP_TOP(fn,; ,; ); \LOOP_RIGHT(fn,; ,; ); \if (r.r-r.l && r.b-r.t) \{ \/* only do the opposite sides if >1 row and >1 column */ \LOOP_BOTTOM(fn,; ,; ); \LOOP_LEFT(fn,; ,; ); \} \*isContinuous = 0; \return 0; /* it may or may not be continuous, doesn't matter */ \}int ComputeBorder(Winspecs *winspecs, Flags *flags, rect *rectPtr, MPE_Point *pointData, int maxnpoints, int *npoints, int *isContinuous){ register NUM re, im, rstep, istep; register int x, y; register MPE_Point *pointPtr; register MPE_Color firstColor; rect r; r = *rectPtr; /* xsplit, ysplit - where to split the rectangle */ /* set the complex points */ NUM_ASSIGN(re, COORD2CMPLX(flags->rmin, flags->rmax, 0, winspecs->width-1, r.l)); NUM_ASSIGN(im, COORD2CMPLX(flags->imax, flags->imin, 0, winspecs->height-1, r.t)); NUM_ASSIGN(rstep, NUM_DIV(NUM_SUB(flags->rmax, flags->rmin), INT2NUM(winspecs->width-1))); NUM_ASSIGN(istep, NUM_DIV(NUM_SUB(flags->imin, flags->imax), INT2NUM(winspecs->height-1))); pointPtr = pointData + 1; pointData->x = r.l; pointData->y = r.t; pointData->c = firstColor = Iter2Color(flags, (flags->fractal == MBROT) ? MbrotCalcIter(re, im) : (flags->fractal == JULIA) ? JuliaCalcIter(re, im) : MbrotCalcIter(re, im)); *npoints = r.length; /* calculate first point */ switch (flags->fractal) { case MBROT: LOOP_FN(MbrotCalcIter, m1, m2, m3, m4); case JULIA: LOOP_FN(JuliaCalcIter, j1, j2, j3, j4); case NEWTON: LOOP_FN(MbrotCalcIter, n1, n2, n3, n4); } return 0;}/*void DrawBorder(MPE_XGraph graph, MPE_Color *colorData, rect r){ int x, y; for (y = r.t, x = r.l; x <= r.r; x++) { MPE_Draw_point(graph, x, y, *colorData); colorData++; } for (x = r.r, y = r.t + 1; y <= r.b; y++) { MPE_Draw_point(graph, x, y, *colorData); colorData++; } if (r.r-r.l && r.b-r.t) { for (y = r.b, x = r.r-1; x >= r.l; x--) { MPE_Draw_point(graph, x, y, *colorData); colorData++; } for (x = r.l, y = r.b-1; y>r.t; y--) { MPE_Draw_point(graph, x, y, *colorData); colorData++; } } MPE_Update(graph);}*/void DrawBlock(MPE_XGraph graph, MPE_Point *pointData, rect *r){ //printf("block color: %d\n", pointData->c); MPE_Fill_rectangle(graph, r->l, r->t, r->r - r->l + 1, r->b - r->t + 1, pointData->c); MPE_Update(graph);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -