📄 pm_genproc_cleanedup.c
字号:
void Q_Enqueue(q, r)
rect_queue *q;
rect *r;
{
Q_Checksize(q);
q->r[q->tail] = *r;
if (++q->tail == q->size)
q->tail = 0;
}
void Q_Dequeue(q, r)
rect_queue *q;
rect *r;
{
*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++) {
j = (int) (drand48() * 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(r)
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;
}
PrintHelp(progName)
char *progName;
{
printf("Options recognized by %s:\n", progName);
printf("(defaults are in parentheses () )\n");
printf(" -i <filename> (none) input file\n");
printf(" -l <filename> (\"%s\") name of log file\n", 0);
printf(" -xpos <xpos> (%d) window horizontal coordinate\n",
-1);
printf(" -ypos <xpos> (%d) window vertical coordinate\n",
-1);
printf(" -width <width> (%d) width of computed area in points\n", 500);
printf(" -height <height> (%d) height of computed area in points\n", 500);
printf(" -boundary <boundary> (%.1lf) boundary value for M-set computation\n", 2.0);
printf(" -maxiter <max. iter> (%d) maximum # of iterations for M-set\n", 1000);
printf(" compuptation algorithm\n");
printf(" -rmin <real min.> (%.2lf) minimum real coordinate of computed area\n", -2.0);
printf(" -rmax <real max.> (%.2lf) maximum real coordinate of computed area\n", 2.0);
printf(" -imin <imag. min.> (%.2lf) minimum imaginary coordinate of computed\n", -2.0);
printf(" area\n");
printf(" -imax <imag. max.> (%.2lf) maximum imaginary coordinate of computed\n", 2.0);
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", (-2.0 + 2.0) / 2);
printf(" -icenter <imag. center> (%.2lf) center imaginary coordinate of computed\n", (-2.0 + 2.0) / 2);
printf(" area\n");
printf(" -radius <area radius> (%.2lf) radius of the computed area\n", (2.0 - -2.0));
printf("\n");
printf(" -breakout <breakout size> (%d) maximum length or width rectangle to\n", 12);
printf(" subdivide\n");
printf(" -colors <# of colors> (%d) number of colors to request\n", 16);
printf(" -colreduce <reduce factor> (%d) factor by which to scale down iteration\n", 4);
printf(" values to reduce color changes\n");
printf(" <+,->zoom (%s) turn on (off) drag&zoom\n",
1 ? "on" : "off");
printf(" <+,->randomize (%sset) (on,off) compute regions in as random of\n",
1 ? "" : "not ");
printf(" order as possible\n");
printf(" -bw (%sset) draw in black and white instead of\n", 0 ? "" : "not ");
printf(" color\n");
exit(0);
}
MPE_Color Iter2Color(flags, iter)
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];
}
}
}
ChunkIter2Color(flags, iterData, colorData, size)
Flags *flags;
int *iterData, size;
int *colorData;
{
int i;
for (i = 0; i < size; i++) {
*colorData = Iter2Color(flags, *iterData);
colorData++;
iterData++;
}
}
ComputeChunk(flags, r, pointData, iterData, maxnpoints, npoints)
Flags *flags;
rect *r;
int *iterData, maxnpoints, *npoints;
MPE_Point *pointData;
{
int i, x, y;
CalcField(flags->fractal, iterData, r->l, r->r, r->t, r->b);
*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;
}
DrawChunk(graph, colorData, r)
MPE_XGraph graph;
int *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;
}
int ComputeBorder(winspecs, flags, rectPtr, pointData, maxnpoints,
npoints, isContinuous)
Winspecs *winspecs;
Flags *flags;
rect *rectPtr;
MPE_Point *pointData;
int maxnpoints, *npoints, *isContinuous;
{
register double re, im, rstep, istep;
register int x, y;
register MPE_Point *pointPtr;
register MPE_Color firstColor;
rect r;
r = *rectPtr;
{
(re) = (((((((double) ((r.l) - (0)))) * ((((((flags->rmax)) - ((flags->rmin)))) / (((double) ((
winspecs->width - 1) - (0)))))))) + ((flags->rmin))));
};
{
(im) = (((((((double) ((r.t) - (0)))) * ((((((flags->imin)) - ((flags->imax)))) / (((double) ((
winspecs->height - 1) - (0)))))))) + ((flags->imax))));
};
{
(rstep) = (((((flags->rmax) - (flags->rmin))) / (
((double) (winspecs->width - 1)))));
};
{
(istep) = (((((flags->imin) - (flags->imax))) / (
((double) (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;
switch (flags->fractal) {
case MBROT:
if (r.b - r.t > 1 && r.r - r.l > 1) {
(y = r.t, x = r.l + 1);
while (x <= r.r) {
n {
(re) = (((re) + (rstep)));
};
pointPtr->x = x;
pointPtr->y = y;
pointPtr->c = Iter2Color(flags, MbrotCalcIter(re, im));
if (pointPtr->c != firstColor)
goto m1;
(pointPtr++, x++);
};;;
(x = r.r, y = r.t + 1);
while (y <= r.b) {{
(im) = (((im) + (istep)));
};
pointPtr->x = x;
pointPtr->y = y;
pointPtr->c = Iter2Color(flags, MbrotCalcIter(re, im));
if (pointPtr->c != firstColor)
goto m2;
(pointPtr++, y++);
};;;
(y = r.b, x = r.r - 1);
while (x >= r.l) {{
(re) = (((re) - (rstep)));
};
pointPtr->x = x;
pointPtr->y = y;
pointPtr->c = Iter2Color(flags, MbrotCalcIter(re, im));
if (pointPtr->c != firstColor)
goto m3;
(pointPtr++, x--);
};;;
(x = r.l, y = r.b - 1);
while (y > r.t) {{
(im) = (((im) - (istep)));
};
pointPtr->x = x;
pointPtr->y = y;
pointPtr->c = Iter2Color(flags, MbrotCalcIter(re, im));
if (pointPtr->c != firstColor)
goto m4;
(pointPtr++, y--);
};;;
*isContinuous = 1;
return 1;
(y = r.t, x = r.l + 1);
while (x <= r.r) {{
(re) = (((re) + (rstep)));
};
pointPtr->x = x;
pointPtr->y = y;
pointPtr->c = Iter2Color(flags, MbrotCalcIter(re, im));;
m1:(pointPtr++, x++);
};;;
(x = r.r, y = r.t + 1);
while (y <= r.b) {{
(im) = (((im) + (istep)));
};
pointPtr->x = x;
pointPtr->y = y;
pointPtr->c = Iter2Color(flags, MbrotCalcIter(re, im));;
m2:(pointPtr++, y++);
};;;
(y = r.b, x = r.r - 1);
while (x >= r.l) {{
(re) = (((re) - (rstep)));
};
pointPtr->x = x;
pointPtr->y = y;
pointPtr->c = Iter2Color(flags, MbrotCalcIter(re, im));;
m3:(pointPtr++, x--);
};;;
(x = r.l, y = r.b - 1);
while (y > r.t) {{
(im) = (((im) - (istep)));
};
pointPtr->x = x;
pointPtr->y = y;
pointPtr->c = Iter2Color(flags, MbrotCalcIter(re, im));;
m4:(pointPtr++, y--);
};;;
*isContinuous = 0;
return 0;
} else {
(y = r.t, x = r.l + 1);
while (x <= r.r) {{
(re) = (((re) + (rstep)));
};
pointPtr->x = x;
pointPtr->y = y;
pointPtr->c = Iter2Color(flags, MbrotCalcIter(re, im));;
(pointPtr++, x++);
};;
(x = r.r, y = r.t + 1);
while (y <= r.b) {{
(im) = (((im) + (istep)));
};
pointPtr->x = x;
pointPtr->y = y;
pointPtr->c = Iter2Color(flags, MbrotCalcIter(re, im));;
(pointPtr++, y++);
};;
if (r.r - r.l && r.b - r.t) {
(y = r.b, x = r.r - 1);
while (x >= r.l) {{
(re) = (((re) - (rstep)));
};
pointPtr->x = x;
pointPtr->y = y;
pointPtr->c = Iter2Color(flags, MbrotCalcIter(re, im));;
(pointPtr++, x--);
};;
(x = r.l, y = r.b - 1);
while (y > r.t) {{
(im) = (((im) - (istep)));
};
pointPtr->x = x;
pointPtr->y = y;
pointPtr->c = Iter2Color(flags, MbrotCalcIter(re, im));;
(pointPtr++, y--);
};;
} *isContinuous = 0;
return 0;
};
case JULIA:
if (r.b - r.t > 1 && r.r - r.l > 1) {
(y = r.t, x = r.l + 1);
while (x <= r.r) {
n {
(re) = (((re) + (rstep)));
};
pointPtr->x = x;
pointPtr->y = y;
pointPtr->c = Iter2Color(flags, JuliaCalcIter(re, im));
if (pointPtr->c != firstColor)
goto j1;
(pointPtr++, x++);
};;;
(x = r.r, y = r.t + 1);
while (y <= r.b) {{
(im) = (((im) + (istep)));
};
pointPtr->x = x;
pointPtr->y = y;
pointPtr->c = Iter2Color(flags, JuliaCalcIter(re, im));
if (pointPtr->c != firstColor)
goto j2;
(pointPtr++, y++);
};;;
(y = r.b, x = r.r - 1);
while (x >= r.l) {{
(re) = (((re) - (rstep)));
};
pointPtr->x = x;
pointPtr->y = y;
pointPtr->c = Iter2Color(flags, JuliaCalcIter(re, im));
if (pointPtr->c != firstColor)
goto j3;
(pointPtr++, x--);
};;;
(x = r.l, y = r.b - 1);
while (y > r.t) {{
(im) = (((im) - (istep)));
};
pointPtr->x = x;
pointPtr->y = y;
pointPtr->c = Iter2Color(flags, JuliaCalcIter(re, im));
if (pointPtr->c != firstColor)
goto j4;
(pointPtr++, y--);
};;;
*isContinuous = 1;
return 1;
(y = r.t, x = r.l + 1);
while (x <= r.r) {{
(re) = (((re) + (rstep)));
};
pointPtr->x = x;
pointPtr->y = y;
pointPtr->c = Iter2Color(flags, JuliaCalcIter(re, im));;
j1:(pointPtr++, x++);
};;;
(x = r.r, y = r.t + 1);
while (y <= r.b) {{
(im) = (((im) + (istep)));
};
pointPtr->x = x;
pointPtr->y = y;
pointPtr->c = Iter2Color(flags, JuliaCalcIter(re, im));;
j2:(pointPtr++, y++);
};;;
(y = r.b, x = r.r - 1);
while (x >= r.l) {{
(re) = (((re) - (rstep)));
};
pointPtr->x = x;
pointPtr->y = y;
pointPtr->c = Iter2Color(flags, JuliaCalcIter(re, im));;
j3:(pointPtr++, x--);
};;;
(x = r.l, y = r.b - 1);
while (y > r.t) {{
(im) = (((im) - (istep)));
};
pointPtr->x = x;
pointPtr->y = y;
pointPtr->c = Iter2Color(flags, JuliaCalcIter(re, im));;
j4:(pointPtr++, y--);
};;;
*isContinuous = 0;
return 0;
} else {
(y = r.t, x = r.l + 1);
while (x <= r.r) {{
(re) = (((re) + (rstep)));
};
pointPtr->x = x;
pointPtr->y = y;
pointPtr->c = Iter2Color(flags, JuliaCalcIter(re, im));;
(pointPtr++, x++);
};;
(x = r.r, y = r.t + 1);
while (y <= r.b) {{
(im) = (((im) + (istep)));
};
pointPtr->x = x;
pointPtr->y = y;
pointPtr->c = Iter2Color(flags, JuliaCalcIter(re, im));;
(pointPtr++, y++);
};;
if (r.r - r.l && r.b - r.t) {
(y = r.b, x = r.r - 1);
while (x >= r.l) {{
(re) = (((re) - (rstep)));
};
pointPtr->x = x;
pointPtr->y = y;
pointPtr->c = Iter2Color(flags, JuliaCalcIter(re, im));;
(pointPtr++, x--);
};;
(x = r.l, y = r.b - 1);
while (y > r.t) {{
(im) = (((im) - (istep)));
};
pointPtr->x = x;
pointPtr->y = y;
pointPtr->c = Iter2Color(flags, JuliaCalcIter(re, im));;
(pointPtr++, y--);
};;
} *isContinuous = 0;
return 0;
};
case NEWTON:
if (r.b - r.t > 1 && r.r - r.l > 1) {
(y = r.t, x = r.l + 1);
while (x <= r.r) {
n {
(re) = (((re) + (rstep)));
};
pointPtr->x = x;
pointPtr->y = y;
pointPtr->c = Iter2Color(flags, MbrotCalcIter(re, im));
if (pointPtr->c != firstColor)
goto n1;
(pointPtr++, x++);
};;;
(x = r.r, y = r.t + 1);
while (y <= r.b) {{
(im) = (((im) + (istep)));
};
pointPtr->x = x;
pointPtr->y = y;
pointPtr->c = Iter2Color(flags, MbrotCalcIter(re, im));
if (pointPtr->c != firstColor)
goto n2;
(pointPtr++, y++);
};;;
(y = r.b, x = r.r - 1);
while (x >= r.l) {{
(re) = (((re) - (rstep)));
};
pointPtr->x = x;
pointPtr->y = y;
pointPtr->c = Iter2Color(flags, MbrotCalcIter(re, im));
if (pointPtr->c != firstColor)
goto n3;
(pointPtr++, x--);
};;;
(x = r.l, y = r.b - 1);
while (y > r.t) {{
(im) = (((im) - (istep)));
};
pointPtr->x = x;
pointPtr->y = y;
pointPtr->c = Iter2Color(flags, MbrotCalcIter(re, im));
if (pointPtr->c != firstColor)
goto n4;
(pointPtr++, y--);
};;;
*isContinuous = 1;
return 1;
(y = r.t, x = r.l + 1);
while (x <= r.r) {{
(re) = (((re) + (rstep)));
};
pointPtr->x = x;
pointPtr->y = y;
pointPtr->c = Iter2Color(flags, MbrotCalcIter(re, im));;
n1:(pointPtr++, x++);
};;;
(x = r.r, y = r.t + 1);
while (y <= r.b) {{
(im) = (((im) + (istep)));
};
pointPtr->x = x;
pointPtr->y = y;
pointPtr->c = Iter2Color(flags, MbrotCalcIter(re, im));;
n2:(pointPtr++, y++);
};;;
(y = r.b, x = r.r - 1);
while (x >= r.l) {{
(re) = (((re) - (rstep)));
};
pointPtr->x = x;
pointPtr->y = y;
pointPtr->c = Iter2Color(flags, MbrotCalcIter(re, im));;
n3:(pointPtr++, x--);
};;;
(x = r.l, y = r.b - 1);
while (y > r.t) {{
(im) = (((im) - (istep)));
};
pointPtr->x = x;
pointPtr->y = y;
pointPtr->c = Iter2Color(flags, MbrotCalcIter(re, im));;
n4:(pointPtr++, y--);
};;;
*isContinuous = 0;
return 0;
} else {
(y = r.t, x = r.l + 1);
while (x <= r.r) {{
(re) = (((re) + (rstep)));
};
pointPtr->x = x;
pointPtr->y = y;
pointPtr->c = Iter2Color(flags, MbrotCalcIter(re, im));;
(pointPtr++, x++);
};;
(x = r.r, y = r.t + 1);
while (y <= r.b) {{
(im) = (((im) + (istep)));
};
pointPtr->x = x;
pointPtr->y = y;
pointPtr->c = Iter2Color(flags, MbrotCalcIter(re, im));;
(pointPtr++, y++);
};;
if (r.r - r.l && r.b - r.t) {
(y = r.b, x = r.r - 1);
while (x >= r.l) {{
(re) = (((re) - (rstep)));
};
pointPtr->x = x;
pointPtr->y = y;
pointPtr->c = Iter2Color(flags, MbrotCalcIter(re, im));;
(pointPtr++, x--);
};;
(x = r.l, y = r.b - 1);
while (y > r.t) {{
(im) = (((im) - (istep)));
};
pointPtr->x = x;
pointPtr->y = y;
pointPtr->c = Iter2Color(flags, MbrotCalcIter(re, im));;
(pointPtr++, y--);
};;
} *isContinuous = 0;
return 0;
};
}
}
DrawBorder(graph, colorData, r)
MPE_XGraph graph;
int *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);
}
DrawBlock(graph, pointData, r)
MPE_XGraph graph;
MPE_Point *pointData;
rect *r;
{
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 + -