Annotation of QuadraticMandel/genfractal.c, revision 1.1

1.1     ! cvsmgr      1: /*******************************************************************************
        !             2: +*
        !             3: +* 9.12.2005
        !             4: +*
        !             5: +* $Id: genfractal.c,v 1.24 2010/03/16 17:42:39 rduran Exp $
        !             6: +* $Name:  $
        !             7: +*
        !             8: +* Falta por hacer el cálculo del mínimo A para Gc. Ahora se usa la
        !             9: +* iteración especial con valor de 50.0
        !            10: +*
        !            11: *******************************************************************************/
        !            12: # include <stdlib.h>
        !            13: # include <stdio.h>
        !            14: # include <string.h>
        !            15: # include <math.h>
        !            16: # include <stdarg.h>
        !            17: # include "mypng.h"
        !            18: # include "genfractal.h"
        !            19: # include "mathutil.h"
        !            20: 
        !            21: enum Zona {ZONA_Fbc_MAS, ZONA_Fbc_MENOS, ZONA_Fc_MAS, ZONA_Fc_MENOS, ZONA_Gc, ZONA_00};
        !            22: 
        !            23: static double minA = 1.0;
        !            24: static double a1   = 1.0;
        !            25: static double b1   = 1.0;
        !            26: static double c1   = 1.0;
        !            27: static double a2   = 1.0;
        !            28: static double b2   = 1.0;
        !            29: static double c2   = 1.0;
        !            30: 
        !            31: enum Zona zona = ZONA_Fbc_MAS;
        !            32: 
        !            33: /*******************************************************************************
        !            34: +* El siguiente if a 1 para imagen en color, 0 para blanco y negro.
        !            35: *******************************************************************************/
        !            36: # if 1
        !            37: static void PNGColorAssign(png_colorp p, int iter, int itermax)
        !            38: {
        !            39: double ratio = 767.0*((double) iter / (double) itermax);
        !            40: int    c     = lround(ratio);
        !            41: 
        !            42: # if 0
        !            43: if (c != 0 && c != 767) printf("iter: %d, ratio=%lf, c=%d\n", iter, ratio, c);
        !            44: # endif
        !            45:    switch (c/256)
        !            46:    {
        !            47:       case 0:
        !            48:         p->blue = c%256;
        !            49: # if 0
        !            50: if (c!=0 && c!=255) printf("Caso 0\n");
        !            51: # endif
        !            52:       break;
        !            53: 
        !            54:       case 1:
        !            55:         p->blue  = 255 - c%256;
        !            56:         p->green = c%256;
        !            57: # if 0
        !            58: if (c!=0 && c!=255) printf("Caso 1\n");
        !            59: # endif
        !            60:       break;
        !            61: 
        !            62:       default:
        !            63:         p->green = 255 - c%256;
        !            64:         p->red   = c%256;
        !            65: # if 0
        !            66: if (c!=0 && c!=255) printf("Caso default\n");
        !            67: # endif
        !            68:    }
        !            69: }
        !            70: # endif
        !            71: 
        !            72: /*******************************************************************************
        !            73: +* El siguiente if a 0 para imagen en color, 1 para blanco y negro.
        !            74: *******************************************************************************/
        !            75: # if 0
        !            76: static void PNGColorAssign(png_colorp p, int iter, int itermax)
        !            77: {
        !            78: double ratio = 255.0*((double) iter / (double) itermax);
        !            79: 
        !            80: /*******************************************************************************
        !            81: +* El siguiente if a 1 para fondo blanco, fractal negro.
        !            82: *******************************************************************************/
        !            83: # if 1
        !            84:    p->blue = p->green = p->red = 255 - lround(ratio);
        !            85: # endif
        !            86: /*******************************************************************************
        !            87: +* El siguiente if a 1 para fondo negro, fractal blanco.
        !            88: *******************************************************************************/
        !            89: # if 0
        !            90:    p->blue = p->green = p->red = lround(ratio);
        !            91: # endif
        !            92: }
        !            93: # endif
        !            94: 
        !            95: static double ComputeZR(double zr, double zi)
        !            96: {
        !            97:    return a1*zr*zr + 2.0*b1*zr*zi + c1*zi*zi;
        !            98: }
        !            99: 
        !           100: static double ComputeZI(double zr, double zi)
        !           101: {
        !           102:    return a2*zr*zr + 2.0*b2*zr*zi + c2*zi*zi;
        !           103: }
        !           104: 
        !           105: static double maximo(double a, double b)
        !           106: {
        !           107:    if (a > b)
        !           108:       return a;
        !           109:    else
        !           110:       return b;
        !           111: }
        !           112: 
        !           113: static double minimo(double a, double b)
        !           114: {
        !           115:    if (a < b)
        !           116:       return a;
        !           117:    else
        !           118:       return b;
        !           119: }
        !           120: 
        !           121: /*******************************************************************************
        !           122: +* Función A_t para la parte F^+_{bc}
        !           123: *******************************************************************************/
        !           124: static double Ap_t(double t)
        !           125: {
        !           126:    return pow(1. - pow(t,2),2)/pow(1. + pow(t,2),2) +
        !           127:           pow(t,2)/pow(1. + pow(t,2),2)*
        !           128:           (
        !           129:            pow(c1,2)*pow(t,2)  +
        !           130:            4.*pow(b1,2)        +
        !           131:            4.*b1*c1*t
        !           132:           );
        !           133: }
        !           134: 
        !           135: 
        !           136: static void ComputeMinAplus00(void)
        !           137: {
        !           138: double t = sqrt(2./(2.+pow(c1,2)));
        !           139: 
        !           140:    minA = minimo(minA, Ap_t(t));
        !           141:    minA = minimo(minA, Ap_t(-t));
        !           142: 
        !           143:    return;
        !           144: }
        !           145: 
        !           146: void ComputeMinAplus(void)
        !           147: {
        !           148: double k;
        !           149: double p;
        !           150: double q;
        !           151: double d;
        !           152: double rho;
        !           153: double theta;
        !           154: double l1q;
        !           155: double l2q;
        !           156: int    i;
        !           157: 
        !           158:    k = (pow(c1,2)-2.*pow(b1,2)+2.)/(3.*b1*c1);
        !           159:    p = (-4.*k-3.*b1*c1-2.*pow(c1,2)*k+3.*b1*c1*pow(k,2)+4.*pow(b1,2)*k)/(b1*c1);
        !           160:    q = (-2.*pow(k,2)-3.*b1*c1*k+2+b1*c1*pow(k,3)-2.*pow(b1,2)+2.*pow(b1,2)*pow(k,2)-pow(c1,2)*pow(k,2))/(b1*c1);
        !           161: 
        !           162:    if ((d = 81.*pow(q,2)+12.*pow(p,3)) < 0.0)
        !           163:    {
        !           164:       l1q = q*q/4.;
        !           165:       l2q = -d/324.;
        !           166:       rho = sqrt(l1q + l2q);
        !           167:       theta = atan(sqrt(l2q/l1q));
        !           168: 
        !           169:       for (i = 0; i < 3; i++)
        !           170:          minA = minimo(minA, Ap_t(2.*pow(rho, 1./3.)*cos(theta/3. + 2.*i*M_PI/3.) + k));
        !           171:    }
        !           172:    else
        !           173:    {
        !           174:       fprintf(stderr, "#WARNING: Discriminante positivo, sólo hay una solución.\n");
        !           175:       minA = minimo(minA, Ap_t(pow(-q/2. + sqrt(d)/18.,1./3.) + pow(-q/2. - sqrt(d)/18.,1./3.) + k));
        !           176:    }
        !           177: 
        !           178:    return;
        !           179: }
        !           180: 
        !           181: /*******************************************************************************
        !           182: +* Función A_t para la parte F^-_{bc}
        !           183: *******************************************************************************/
        !           184: static double Am_t(double t)
        !           185: {
        !           186:    return 1 + pow(t,2)/pow(1. + pow(t,2),2)*
        !           187:           (
        !           188:            pow(c1,2)*pow(t,2)  +
        !           189:            4.*pow(b1,2)        +
        !           190:            4.*b1*c1*t
        !           191:           );
        !           192: }
        !           193: 
        !           194: static void ComputeMinAminus00(void)
        !           195: {
        !           196:    if (b1 != 0.0)
        !           197:    {
        !           198:       minA = minimo(minA, Am_t(1.));
        !           199:       minA = minimo(minA, Am_t(-1.));
        !           200:    }
        !           201: 
        !           202:    return;
        !           203: }
        !           204: 
        !           205: static void ComputeMinAminus(void)
        !           206: {
        !           207: double k;
        !           208: double p;
        !           209: double q;
        !           210: double d;
        !           211: double rho;
        !           212: double theta;
        !           213: double l1q;
        !           214: double l2q;
        !           215: int    i;
        !           216: 
        !           217:    k = (pow(c1,2)-2.*pow(b1,2))/(3.*b1*c1);
        !           218:    p = (4.*pow(b1,2)*k-2.*pow(c1,2)*k+3.*b1*c1*pow(k,2)-3.*b1*c1)/(b1*c1);
        !           219:    q = (-2.*pow(b1,2)+2.*pow(b1,2)*pow(k,2)-pow(c1,2)*pow(k,2)+b1*c1*pow(k,3)-3.*b1*c1*k)/(b1*c1);
        !           220: 
        !           221:    if ((d = 81.*pow(q,2)+12.*pow(p,3)) < 0.0)
        !           222:    {
        !           223:       l1q = q*q/4.;
        !           224:       l2q = -d/324.;
        !           225:       rho = sqrt(l1q + l2q);
        !           226:       theta = atan(sqrt(l2q/l1q));
        !           227: 
        !           228:       for (i = 0; i < 3; i++)
        !           229:          minA = minimo(minA, Am_t(2.*pow(rho, 1./3.)*cos(theta/3. + 2.*i*M_PI/3.) + k));
        !           230:    }
        !           231:    else
        !           232:    {
        !           233:       fprintf(stderr, "#WARNING: Discriminante positivo, sólo hay una solución.\n");
        !           234:       minA = minimo(minA, Am_t(pow(-q/2. + sqrt(d)/18.,1./3.) + pow(-q/2. - sqrt(d)/18.,1./3.) + k));
        !           235:    }
        !           236: 
        !           237:    return;
        !           238: }
        !           239: 
        !           240: /*******************************************************************************
        !           241: +* Función A_t y sus derivadas para la parte F^+_{c}
        !           242: *******************************************************************************/
        !           243: static double AFcMas_t(double t)
        !           244: {
        !           245:    return 1/pow(1. + pow(t,2),2)*
        !           246:           (
        !           247:            pow(c1,2)*pow(t,4)  +
        !           248:            4.*c1*pow(t,3)      +
        !           249:            4.*pow(t,2)         +
        !           250:            1.
        !           251:           );
        !           252: }
        !           253: 
        !           254: static void ComputeMinAFcMas0(void)
        !           255: {
        !           256: 
        !           257:    minA = minimo(minA, AFcMas_t(sqrt(2.)/.2));
        !           258:    minA = minimo(minA, AFcMas_t(-sqrt(2.)/.2));
        !           259: 
        !           260:    return;
        !           261: }
        !           262: 
        !           263: static void ComputeMinAFcMas(void)
        !           264: {
        !           265: double k;
        !           266: double p;
        !           267: double q;
        !           268: double d;
        !           269: double rho;
        !           270: double theta;
        !           271: double l1q;
        !           272: double l2q;
        !           273: int    i;
        !           274: 
        !           275:    k = 1./3.*(pow(c1,2)-2.)/c1;
        !           276:    p = (-2.*k*pow(c1,2) + 4.*k + 3.*c1*pow(k,2) - 3.*c1)/c1;
        !           277:    q = (-1. - pow(c1,2)*pow(k,2) + 2.*pow(k,2) + c1*pow(k,3) - 3.*c1*k)/c1;
        !           278: 
        !           279:    if ((d = 81.*pow(q,2)+12.*pow(p,3)) < 0.0)
        !           280:    {
        !           281:       l1q = q*q/4.;
        !           282:       l2q = -d/324.;
        !           283:       rho = sqrt(l1q + l2q);
        !           284:       theta = atan(sqrt(l2q/l1q));
        !           285: 
        !           286:       for (i = 0; i < 3; i++)
        !           287:          minA = minimo(minA, AFcMas_t(2.*pow(rho, 1./3.)*cos(theta/3. + 2.*i*M_PI/3.) + k));
        !           288:    }
        !           289:    else
        !           290:    {
        !           291:       fprintf(stderr, "#WARNING: Discriminante positivo, sólo hay una solución.\n");
        !           292:       minA = minimo(minA, AFcMas_t(pow(-q/2. + sqrt(d)/18.,1./3.) + pow(-q/2. - sqrt(d)/18.,1./3.) + k));
        !           293:    }
        !           294: 
        !           295:    return;
        !           296: }
        !           297: 
        !           298: /*******************************************************************************
        !           299: +* Función A_t y sus derivadas para la parte F^-_{c}
        !           300: *******************************************************************************/
        !           301: static double AFcMenos_t(double t)
        !           302: {
        !           303:    return 1/pow(1. + pow(t,2),2)*
        !           304:           (
        !           305:            pow(c1,2)*pow(t,4)  -
        !           306:            4.*c1*pow(t,3)      +
        !           307:            4.*pow(t,2)         +
        !           308:            1.
        !           309:           );
        !           310: }
        !           311: 
        !           312: static void ComputeMinAFcMenos0(void)
        !           313: {
        !           314: 
        !           315:    minA = minimo(minA, AFcMenos_t(sqrt(2.)/.2));
        !           316:    minA = minimo(minA, AFcMenos_t(-sqrt(2.)/.2));
        !           317: 
        !           318:    return;
        !           319: }
        !           320: 
        !           321: static void ComputeMinAFcMenos(void)
        !           322: {
        !           323: double k;
        !           324: double p;
        !           325: double q;
        !           326: double d;
        !           327: double rho;
        !           328: double theta;
        !           329: double l1q;
        !           330: double l2q;
        !           331: int    i;
        !           332: 
        !           333:    k = -1./3.*(pow(c1,2)-2.)/c1;
        !           334:    p = (2.*k*pow(c1,2) - 4.*k + 3.*c1*pow(k,2) - 3.*c1)/c1;
        !           335:    q = (1. + pow(c1,2)*pow(k,2) - 2.*pow(k,2) + c1*pow(k,3) - 3.*c1*k)/c1;
        !           336: 
        !           337:    if ((d = 81.*pow(q,2)+12.*pow(p,3)) < 0.0)
        !           338:    {
        !           339:       l1q = q*q/4.;
        !           340:       l2q = -d/324.;
        !           341:       rho = sqrt(l1q + l2q);
        !           342:       theta = atan(sqrt(l2q/l1q));
        !           343: 
        !           344:       for (i = 0; i < 3; i++)
        !           345:          minA = minimo(minA, AFcMenos_t(2.*pow(rho, 1./3.)*cos(theta/3. + 2.*i*M_PI/3.) + k));
        !           346:    }
        !           347:    else
        !           348:    {
        !           349:       fprintf(stderr, "#WARNING: Discriminante positivo, sólo hay una solución.\n");
        !           350:       minA = minimo(minA, AFcMenos_t(pow(-q/2. + sqrt(d)/18.,1./3.) + pow(-q/2. - sqrt(d)/18.,1./3.) + k));
        !           351:    }
        !           352: 
        !           353:    return;
        !           354: }
        !           355: 
        !           356: /*******************************************************************************
        !           357: +* Función para la parte G_{c}
        !           358: *******************************************************************************/
        !           359: static void ComputeMinAGc(void)
        !           360: {
        !           361: double ypsilon;
        !           362: double Ypsilon;
        !           363: double tau1;
        !           364: 
        !           365:    ypsilon = 3*pow(c1,9)    - 9*pow(c1,8)    + 36*pow(c1,7)   -
        !           366:              111*pow(c1,6)  + 540*pow(c1,5)  - 1107*pow(c1,4) +
        !           367:              2592*pow(c1,3) - 3321*pow(c1,2) + 6237*c1-10044;
        !           368: 
        !           369:    if (ypsilon > 0.0)
        !           370:    {
        !           371:       Ypsilon = pow((c1-1.)*pow(c1+1.,2) + sqrt(ypsilon)/9., 1./3.);
        !           372:       tau1 = (3*pow(Ypsilon,2) + 3*(1-c1)*Ypsilon -
        !           373:              (pow(c1,3)-pow(c1,2)+3*c1-15))/(3*c1*Ypsilon);
        !           374:    }
        !           375: }
        !           376: 
        !           377: /*******************************************************************************
        !           378: +* Cálculo del mínimo de la B y computación del Modúlo máximo.
        !           379: *******************************************************************************/
        !           380: 
        !           381: static double ComputeMod2Max(double alpha, double beta)
        !           382: {
        !           383: double minB = 0.0;
        !           384: 
        !           385:    if (zona == ZONA_Fbc_MAS)
        !           386:       minB = c1*alpha - sqrt(pow(2.*b1*alpha,2)+pow(2.*beta-c1*alpha,2));
        !           387:    else if (zona == ZONA_Fbc_MENOS)
        !           388:       minB = c1*alpha+2.*beta - sqrt(pow(2.*b1*alpha,2)+pow(c1*alpha,2));
        !           389:    else if (zona == ZONA_Fc_MAS)
        !           390:       minB = beta + alpha*c1 - sqrt(pow(beta-alpha*c1,2) + 4.*pow(alpha,2));
        !           391:    else if (zona == ZONA_Fc_MENOS)
        !           392:       minB = beta + alpha*c1 - sqrt(pow(beta-alpha*c1,2) + 4.*pow(alpha,2));
        !           393:    else if (zona == ZONA_Gc)
        !           394:       minB = alpha*(c1 + 1.) - sqrt(pow(-c1+1.,2)*pow(alpha,2)+4.*pow(alpha-beta,2));
        !           395:    else if (zona == ZONA_00)
        !           396:       minB = -2.*sqrt(pow(alpha,2) + pow(beta,2));
        !           397:    else
        !           398:    {
        !           399:       fprintf(stderr, "#ERROR: Zona no implementada en el cálculo de min B.\n");
        !           400:       return 0.;
        !           401:    }
        !           402: 
        !           403:    return maximo(0., (1.-minB)/minA);
        !           404: }
        !           405: 
        !           406: /*******************************************************************************
        !           407: +* Parte fija del cómputo.
        !           408: *******************************************************************************/
        !           409: static void IterComputation(png_colorpp image, int itermax)
        !           410: {
        !           411: int         row, col, iter;
        !           412: double      mod2;
        !           413: double      mod2max;
        !           414: double      zrtemp, zitemp;
        !           415: double      zr, zi;
        !           416: double      cr, ci;
        !           417: # if 0
        !           418: png_color   p;
        !           419: # endif
        !           420: 
        !           421:    for (row = 0; row < NUM_ROWS; row++)
        !           422:    {
        !           423:       for (col = 0; col < NUM_COLS; col++)
        !           424:       {
        !           425:          cr = PixToCoordX(col);
        !           426:          ci = PixToCoordY(row);
        !           427: 
        !           428:          mod2max = ComputeMod2Max(cr, ci);
        !           429: 
        !           430:          zr = 0.0;
        !           431:          zi = 0.0;
        !           432: 
        !           433:          for (iter = 0; iter < itermax; iter++)
        !           434:          {
        !           435:             zrtemp = ComputeZR(zr, zi);
        !           436:             zitemp = ComputeZI(zr, zi);
        !           437: 
        !           438:             zr = zrtemp + cr;
        !           439:             zi = zitemp + ci;
        !           440: 
        !           441:             mod2 = zr*zr + zi*zi;
        !           442:             if (mod2 > mod2max)
        !           443:             {
        !           444: # if 0
        !           445:                printf("Nos salimos en la: %d\n", iter);
        !           446: # endif
        !           447:                break;
        !           448:             }
        !           449:          }
        !           450: # if 0
        !           451:          if (iter >= itermax)
        !           452:             printf("Nos salimos por exceso, en (%lf, %lf)\n", cr, ci);
        !           453: # endif
        !           454: 
        !           455:          PNGColorAssign(&image[row][col], iter, itermax);
        !           456:       }
        !           457:    }
        !           458: 
        !           459: # if 0
        !           460:    p.red = 0; p.green = 255; p.blue = 0;
        !           461:    DrawHorizLine(image, 0.0, p);
        !           462:    DrawHorizLine(image, 1.0, p);
        !           463:    DrawHorizLine(image, -1.0, p);
        !           464: 
        !           465:    DrawVertiLine(image, 0.0, p);
        !           466:    DrawVertiLine(image, 1.0, p);
        !           467:    DrawVertiLine(image, -1.0, p);
        !           468: # endif
        !           469: }
        !           470: 
        !           471: /*******************************************************************************
        !           472: +* Parte fija del cómputo.
        !           473: *******************************************************************************/
        !           474: static void IterComputationEspecial(png_colorpp image, int itermax, double modmax)
        !           475: {
        !           476: int         row, col, iter;
        !           477: double      mod2;
        !           478: double      mod2max;
        !           479: double      zrtemp, zitemp;
        !           480: double      zr, zi;
        !           481: double      cr, ci;
        !           482: int         flag_changed = 0,
        !           483:             mandel_zone  = 0,
        !           484:             is_break     = 0;
        !           485: # if 0
        !           486: png_color   p;
        !           487: # endif
        !           488: 
        !           489:    for (row = 0; row < NUM_ROWS; row++)
        !           490:    {
        !           491:       for (col = 0; col < NUM_COLS; col++)
        !           492:       {
        !           493: 
        !           494:          cr = PixToCoordX(col);
        !           495:          ci = PixToCoordY(row);
        !           496: 
        !           497:          mod2max = modmax;
        !           498: 
        !           499:          zr = 0.0;
        !           500:          zi = 0.0;
        !           501: 
        !           502:          is_break = 0;
        !           503:          for (iter = 0; iter < itermax; iter++)
        !           504:          {
        !           505:             zrtemp = ComputeZR(zr, zi);
        !           506:             zitemp = ComputeZI(zr, zi);
        !           507: 
        !           508:             zr = zrtemp + cr;
        !           509:             zi = zitemp + ci;
        !           510: 
        !           511:             mod2 = zr*zr + zi*zi;
        !           512:             if (mod2 > mod2max)
        !           513:             {
        !           514:                if (mandel_zone)
        !           515:                {
        !           516:                   mandel_zone = 0;
        !           517:                   flag_changed = 1;
        !           518:                }
        !           519:                is_break = 1;
        !           520:                break;
        !           521:             }
        !           522:          }
        !           523:          if (is_break == 0)
        !           524:          {
        !           525:             if (mandel_zone == 0)
        !           526:             {
        !           527:                mandel_zone = 1;
        !           528:                flag_changed = 1;
        !           529:             }
        !           530:          }
        !           531:          else
        !           532:          {
        !           533:             if (mandel_zone == 1)
        !           534:             {
        !           535:                mandel_zone = 0;
        !           536:                flag_changed = 1;
        !           537:             }
        !           538:          }
        !           539: 
        !           540:          if (flag_changed)
        !           541:          {
        !           542: # if 0
        !           543:             printf("%15.10lf %15.10lf\n", cr, ci);
        !           544: # endif
        !           545:             flag_changed = 0;
        !           546:          }
        !           547: 
        !           548:          PNGColorAssign(&image[row][col], iter, itermax);
        !           549:       }
        !           550: # if 0
        !           551:       printf("\n");
        !           552: # endif
        !           553:    }
        !           554: 
        !           555: # if 0
        !           556:    p.red = 0; p.green = 255; p.blue = 0;
        !           557:    DrawHorizLine(image, 0.0, p);
        !           558:    DrawHorizLine(image, 1.0, p);
        !           559:    DrawHorizLine(image, -1.0, p);
        !           560: 
        !           561:    DrawVertiLine(image, 0.0, p);
        !           562:    DrawVertiLine(image, 1.0, p);
        !           563:    DrawVertiLine(image, -1.0, p);
        !           564: # endif
        !           565: }
        !           566: 
        !           567: /*******************************************************************************
        !           568: +* GenFractal
        !           569: +* Genera la imagen fractal para las zonas \Delta^+ y \Delta^-
        !           570: *******************************************************************************/
        !           571: int GenFractal(char *img_name, double alpha,
        !           572:                                double beta,
        !           573:                                int    itermax,
        !           574:                                double side_len,
        !           575:                                double offset_x,
        !           576:                                double offset_y)
        !           577: {
        !           578: png_colorpp image = NULL;
        !           579: png_text    info_text[NUM_TEXT];
        !           580: int         status;
        !           581: double      c_temp;
        !           582: 
        !           583: /*******************************************************************************
        !           584: +* Parámetros de tamaño para la imagen. Reserva de memoria para ella.
        !           585: *******************************************************************************/
        !           586:    SetSide(side_len);
        !           587:    SetOffsetX(offset_x);
        !           588:    SetOffsetY(offset_y);
        !           589: 
        !           590:    if (!(image = AllocatePNG(NUM_ROWS, NUM_COLS)))
        !           591:       return ERROR;
        !           592: 
        !           593:    BuildTextPtr(info_text, alpha, beta, itermax, side_len, offset_x, offset_y);
        !           594: 
        !           595: /*******************************************************************************
        !           596: +* Definición de la forma cuadrática.
        !           597: +* Parte fija:
        !           598: *******************************************************************************/
        !           599:    a1 = 0.0;
        !           600:    a2 = 1.0;
        !           601:    b2 = 0.0;
        !           602: 
        !           603: /*******************************************************************************
        !           604: +* Definición de la forma cuadrática.
        !           605: +* Chequeo de condiciones sobre alpha y beta.
        !           606: *******************************************************************************/
        !           607:    if (beta == 0.0)   /* Beta ha de ser diferente de cero */
        !           608:       return ERROR;
        !           609: 
        !           610:    if ((alpha + 2.*beta) == 0.0) /* alpha + 2*beta != 0.0 */
        !           611:       return ERROR;
        !           612: 
        !           613: /*******************************************************************************
        !           614: +* Definición de la forma cuadrática.
        !           615: +* Parte variable en función de alpha y beta:
        !           616: *******************************************************************************/
        !           617:    c_temp = (4.*pow(alpha,3) - 27.*pow(beta,2))/pow(alpha + 2.*beta,3);
        !           618: 
        !           619:    if (c_temp < 0.0)
        !           620:    {
        !           621:    /* Zona F^-_{bc} */
        !           622:       c2 = 1.0;
        !           623:       zona = ZONA_Fbc_MENOS;
        !           624:    }
        !           625:    else
        !           626:    {
        !           627:    /* Zona F^+_{bc} */
        !           628:       c2 = -1.0;
        !           629:       zona = ZONA_Fbc_MAS;
        !           630:    }
        !           631: 
        !           632:    b1 = -c2*(alpha - beta)/(alpha + 2.*beta);
        !           633:    c1 = sqrt((-c2)*c_temp);
        !           634: 
        !           635:    if (zona == ZONA_Fbc_MAS)
        !           636:    {
        !           637:       if (c1 == 2.*b1  ||  c1 == -2.*b1)
        !           638:       {
        !           639:          fprintf(stderr, "#ERROR: Valores de b1 y c1 inválidos.\n");
        !           640:          return ERROR;
        !           641:       }
        !           642:    }
        !           643: 
        !           644: /*******************************************************************************
        !           645: +* Cálculo del mínimo de A, según valores de b1, c1 y zonas.
        !           646: *******************************************************************************/
        !           647:    minA = 1.;
        !           648:    if (zona == ZONA_Fbc_MAS)
        !           649:    {
        !           650:       if (b1 == 0.0  ||  c1 == 0.0)
        !           651:          ComputeMinAplus00();
        !           652:       else
        !           653:          ComputeMinAplus();
        !           654:    }
        !           655:    else if (zona == ZONA_Fbc_MENOS)
        !           656:    {
        !           657:       if (b1 == 0.0  ||  c1 == 0.0)
        !           658:          ComputeMinAminus00();
        !           659:       else
        !           660:          ComputeMinAminus();
        !           661:    }
        !           662:    else
        !           663:    {
        !           664:       fprintf(stderr, "#ERROR: Zona no implementada.\n");
        !           665:       return ERROR;
        !           666:    }
        !           667: 
        !           668: /*******************************************************************************
        !           669: +* Computación y generación de la imagen.
        !           670: *******************************************************************************/
        !           671:    IterComputation(image, itermax);
        !           672:    status = WritePNG(img_name, image, info_text, NUM_TEXT);
        !           673:    DeallocatePNG(image, NUM_ROWS, NUM_COLS);
        !           674:    return status;
        !           675: }
        !           676: 
        !           677: /*******************************************************************************
        !           678: +* GenFractal
        !           679: +* Genera la imagen fractal para las zonas C^+ y C^-
        !           680: *******************************************************************************/
        !           681: int GenFractalLinear(char *img_name, double alpha,
        !           682:                                      double beta,
        !           683:                                      int    itermax,
        !           684:                                      double side_len,
        !           685:                                      double offset_x,
        !           686:                                      double offset_y)
        !           687: {
        !           688: png_colorpp image = NULL;
        !           689: png_text    info_text[NUM_TEXT];
        !           690: int         status;
        !           691: 
        !           692: /*******************************************************************************
        !           693: +* Parámetros de tamaño para la imagen. Reserva de memoria para ella.
        !           694: *******************************************************************************/
        !           695:    SetSide(side_len);
        !           696:    SetOffsetX(offset_x);
        !           697:    SetOffsetY(offset_y);
        !           698: 
        !           699:    if (!(image = AllocatePNG(NUM_ROWS, NUM_COLS)))
        !           700:       return ERROR;
        !           701: 
        !           702:    BuildTextPtr(info_text, alpha, beta, itermax, side_len, offset_x, offset_y);
        !           703: 
        !           704: /*******************************************************************************
        !           705: +* Definición de la forma cuadrática.
        !           706: +* Parte fija:
        !           707: *******************************************************************************/
        !           708:    a1 = 0.0;
        !           709:    a2 = 1.0;
        !           710:    b2 = 0.0;
        !           711:    c2 = 0.0;
        !           712: 
        !           713: /*******************************************************************************
        !           714: +* Definición de la forma cuadrática.
        !           715: +* Chequeo de condiciones sobre beta.
        !           716: *******************************************************************************/
        !           717:    if (beta == 0.0)   /* Beta ha de ser diferente de cero */
        !           718:       return ERROR;
        !           719: 
        !           720:    if (alpha + 2.*beta != 0.0)
        !           721:       return ERROR;   /* alpha + 2*beta ha de ser cero */
        !           722: 
        !           723: /*******************************************************************************
        !           724: +* Definición de la forma cuadrática.
        !           725: +* Parte variable en función de beta: setting de zonas.
        !           726: *******************************************************************************/
        !           727:    if (beta*(27.0+32.0*beta) < 0.0)
        !           728:    {
        !           729:       b1 = -1.0;
        !           730:       zona = ZONA_Fc_MENOS;
        !           731:    }
        !           732:    else
        !           733:    {
        !           734:       b1 = 1.0;
        !           735:       zona = ZONA_Fc_MAS;
        !           736:    }
        !           737: 
        !           738:    c1 = b1/9.0*sqrt(fabs(3.0*(27.0+32.0*beta)/beta));
        !           739: 
        !           740: /*******************************************************************************
        !           741: +* Cálculo del mínimo de A, según valores de b1, c1 y zonas.
        !           742: *******************************************************************************/
        !           743:    minA = 1.;
        !           744:    if (zona == ZONA_Fc_MAS)
        !           745:    {
        !           746:       if (c1 == 0.0)
        !           747:          ComputeMinAFcMas0();
        !           748:       else
        !           749:          ComputeMinAFcMas();
        !           750:    }
        !           751:    else if (zona == ZONA_Fc_MENOS)
        !           752:    {
        !           753:       if (c1 == 0.0)
        !           754:          ComputeMinAFcMenos0();
        !           755:       else
        !           756:          ComputeMinAFcMenos();
        !           757:    }
        !           758:    else
        !           759:    {
        !           760:       fprintf(stderr, "#ERROR: Zona no implementada.\n");
        !           761:       return ERROR;
        !           762:    }
        !           763: 
        !           764: /*******************************************************************************
        !           765: +* Computación y generación de la imagen.
        !           766: *******************************************************************************/
        !           767:    IterComputation(image, itermax);
        !           768:    status = WritePNG(img_name, image, info_text, NUM_TEXT);
        !           769:    DeallocatePNG(image, NUM_ROWS, NUM_COLS);
        !           770:    return status;
        !           771: }
        !           772: 
        !           773: /*******************************************************************************
        !           774: +* GenFractal
        !           775: +* Genera la imagen fractal para el eje X (menos el origen).
        !           776: *******************************************************************************/
        !           777: int GenFractalAlpha(char *img_name, double alpha,
        !           778:                                     double beta,
        !           779:                                     int    itermax,
        !           780:                                     double side_len,
        !           781:                                     double offset_x,
        !           782:                                     double offset_y)
        !           783: {
        !           784: png_colorpp image = NULL;
        !           785: png_text    info_text[NUM_TEXT];
        !           786: int         status;
        !           787: 
        !           788: /*******************************************************************************
        !           789: +* Parámetros de tamaño para la imagen. Reserva de memoria para ella.
        !           790: *******************************************************************************/
        !           791:    SetSide(side_len);
        !           792:    SetOffsetX(offset_x);
        !           793:    SetOffsetY(offset_y);
        !           794: 
        !           795:    if (!(image = AllocatePNG(NUM_ROWS, NUM_COLS)))
        !           796:       return ERROR;
        !           797: 
        !           798:    BuildTextPtr(info_text, alpha, beta, itermax, side_len, offset_x, offset_y);
        !           799: 
        !           800: /*******************************************************************************
        !           801: +* Definición de la forma cuadrática.
        !           802: +* Parte fija:
        !           803: *******************************************************************************/
        !           804:    a1 = 1.0;
        !           805:    a2 = 0.0;
        !           806:    b1 = 1.0;
        !           807:    b2 = -1.0;
        !           808:    c2 = 0.0;
        !           809: 
        !           810: /*******************************************************************************
        !           811: +* Definición de la forma cuadrática.
        !           812: +* Chequeo de condiciones sobre alpha y beta, y setting de zona.
        !           813: *******************************************************************************/
        !           814:    if (alpha == 0.0  ||  beta != 0.0)   /* Alpha ha de ser diferente de cero */
        !           815:       return ERROR;                     /* y beta igual a cero.              */
        !           816: 
        !           817:    zona = ZONA_Gc;
        !           818: 
        !           819: /*******************************************************************************
        !           820: +* Definición de la forma cuadrática.
        !           821: +* Parte variable en función de alpha:
        !           822: *******************************************************************************/
        !           823: 
        !           824:    c1 = (4.0*alpha - 9.0)/alpha/12.0;
        !           825: 
        !           826: /*******************************************************************************
        !           827: +* Cálculo del mínimo de A, según valores de b1, c1 y zonas.
        !           828: *******************************************************************************/
        !           829:    ComputeMinAGc();
        !           830:    minA = 1.;
        !           831: 
        !           832: # if 0
        !           833:    if (zona == ZONA_Gc)
        !           834:    {
        !           835:       fprintf(stderr, "#ERROR: Zona no implementada.\n");
        !           836:       return ERROR;
        !           837:    }
        !           838:    else
        !           839:    {
        !           840:       fprintf(stderr, "#ERROR: Zona no implementada.\n");
        !           841:       return ERROR;
        !           842:    }
        !           843: # endif
        !           844: 
        !           845: /*******************************************************************************
        !           846: +* Computación y generación de la imagen.
        !           847: *******************************************************************************/
        !           848: # if 0
        !           849:    IterComputation(image, itermax);
        !           850: # endif
        !           851:    IterComputationEspecial(image, itermax, 50.0);
        !           852:    status = WritePNG(img_name, image, info_text, NUM_TEXT);
        !           853:    DeallocatePNG(image, NUM_ROWS, NUM_COLS);
        !           854:    return status;
        !           855: }
        !           856: 
        !           857: /*******************************************************************************
        !           858: +* GenFractal_00
        !           859: +* Genera la imagen fractal para el punto origen (0,0)
        !           860: *******************************************************************************/
        !           861: int GenFractal_00(char *img_name, double alpha,
        !           862:                                   double beta,
        !           863:                                   int    itermax,
        !           864:                                   double side_len,
        !           865:                                   double offset_x,
        !           866:                                   double offset_y)
        !           867: {
        !           868: png_colorpp image = NULL;
        !           869: png_text    info_text[NUM_TEXT];
        !           870: int         status;
        !           871: 
        !           872: /*******************************************************************************
        !           873: +* Parámetros de tamaño para la imagen. Reserva de memoria para ella.
        !           874: *******************************************************************************/
        !           875:    SetSide(side_len);
        !           876:    SetOffsetX(offset_x);
        !           877:    SetOffsetY(offset_y);
        !           878: 
        !           879:    if (!(image = AllocatePNG(NUM_ROWS, NUM_COLS)))
        !           880:       return ERROR;
        !           881: 
        !           882:    BuildTextPtr(info_text, alpha, beta, itermax, side_len, offset_x, offset_y);
        !           883: 
        !           884: /*******************************************************************************
        !           885: +* Definición de la forma cuadrática.
        !           886: *******************************************************************************/
        !           887:    a1 = 0.0;
        !           888:    b1 = 1.0;
        !           889:    c1 = 0.0;
        !           890:    a2 = 1.0;
        !           891:    b2 = 0.0;
        !           892:    c2 = -1.0;
        !           893: 
        !           894: /*******************************************************************************
        !           895: +* Chequeo de condiciones sobre alpha y beta. Setting de zona.
        !           896: *******************************************************************************/
        !           897:    if (alpha != 0.0  ||  beta != 0.0)   /* Alfa y Beta han de ser cero. */
        !           898:       return ERROR;
        !           899: 
        !           900:    zona = ZONA_00;
        !           901: 
        !           902: /*******************************************************************************
        !           903: +* Cálculo del mínimo de A, según valores de b1, c1 y zonas.
        !           904: *******************************************************************************/
        !           905:    minA = 1.;
        !           906:    if (zona == ZONA_00)
        !           907:    {
        !           908:       minA = 1.;
        !           909:    }
        !           910:    else
        !           911:    {
        !           912:       fprintf(stderr, "#ERROR: Zona no implementada.\n");
        !           913:       return ERROR;
        !           914:    }
        !           915: 
        !           916: /*******************************************************************************
        !           917: +* Computación y generación de la imagen.
        !           918: *******************************************************************************/
        !           919:    IterComputation(image, itermax);
        !           920:    status = WritePNG(img_name, image, info_text, NUM_TEXT);
        !           921:    DeallocatePNG(image, NUM_ROWS, NUM_COLS);
        !           922:    return status;
        !           923: }
        !           924: 
        !           925: /*******************************************************************************
        !           926: +* GenFractalEspecial1
        !           927: +* Genera la imagen para F^+_c cuando c = 0.
        !           928: *******************************************************************************/
        !           929: int GenFractalEspecial1(char *img_name, double alpha,
        !           930:                                         double beta,
        !           931:                                         int    itermax,
        !           932:                                         double side_len,
        !           933:                                         double offset_x,
        !           934:                                         double offset_y)
        !           935: {
        !           936: png_colorpp image = NULL;
        !           937: png_text    info_text[NUM_TEXT];
        !           938: int         status;
        !           939: 
        !           940: /*******************************************************************************
        !           941: +* Parámetros de tamaño para la imagen. Reserva de memoria para ella.
        !           942: *******************************************************************************/
        !           943:    SetSide(side_len);
        !           944:    SetOffsetX(offset_x);
        !           945:    SetOffsetY(offset_y);
        !           946: 
        !           947:    if (!(image = AllocatePNG(NUM_ROWS, NUM_COLS)))
        !           948:       return ERROR;
        !           949: 
        !           950:    BuildTextPtr(info_text, alpha, beta, itermax, side_len, offset_x, offset_y);
        !           951: 
        !           952: /*******************************************************************************
        !           953: +* Definición de la forma cuadrática.
        !           954: *******************************************************************************/
        !           955:    a1 = 0.0;
        !           956:    b1 = 1.0;
        !           957:    c1 = 0.0;
        !           958:    a2 = 1.0;
        !           959:    b2 = 0.0;
        !           960:    c2 = 0.0;
        !           961: 
        !           962:    IterComputationEspecial(image, itermax, 20.0);
        !           963:    status = WritePNG(img_name, image, info_text, NUM_TEXT);
        !           964:    DeallocatePNG(image, NUM_ROWS, NUM_COLS);
        !           965:    return status;
        !           966: }
        !           967: 
        !           968: /*******************************************************************************
        !           969: +* GenFractalEspecial2
        !           970: +* Genera la imagen para F^-_c cuando c = 0.
        !           971: *******************************************************************************/
        !           972: int GenFractalEspecial2(char *img_name, double alpha,
        !           973:                                         double beta,
        !           974:                                         int    itermax,
        !           975:                                         double side_len,
        !           976:                                         double offset_x,
        !           977:                                         double offset_y)
        !           978: {
        !           979: png_colorpp image = NULL;
        !           980: png_text    info_text[NUM_TEXT];
        !           981: int         status;
        !           982: 
        !           983: /*******************************************************************************
        !           984: +* Parámetros de tamaño para la imagen. Reserva de memoria para ella.
        !           985: *******************************************************************************/
        !           986:    SetSide(side_len);
        !           987:    SetOffsetX(offset_x);
        !           988:    SetOffsetY(offset_y);
        !           989: 
        !           990:    if (!(image = AllocatePNG(NUM_ROWS, NUM_COLS)))
        !           991:       return ERROR;
        !           992: 
        !           993:    BuildTextPtr(info_text, alpha, beta, itermax, side_len, offset_x, offset_y);
        !           994: 
        !           995: /*******************************************************************************
        !           996: +* Definición de la forma cuadrática.
        !           997: *******************************************************************************/
        !           998:    a1 = 0.0;
        !           999:    b1 = -1.0;
        !          1000:    c1 = 0.0;
        !          1001:    a2 = 1.0;
        !          1002:    b2 = 0.0;
        !          1003:    c2 = 0.0;
        !          1004: 
        !          1005:    IterComputationEspecial(image, itermax, 20.0);
        !          1006:    status = WritePNG(img_name, image, info_text, NUM_TEXT);
        !          1007:    DeallocatePNG(image, NUM_ROWS, NUM_COLS);
        !          1008:    return status;
        !          1009: }
        !          1010: 
        !          1011: /*******************************************************************************
        !          1012: +* GenFractalEspecial3
        !          1013: +* Genera la imagen para G^_c cuando c = 0.
        !          1014: *******************************************************************************/
        !          1015: int GenFractalEspecial3(char *img_name, double alpha,
        !          1016:                                         double beta,
        !          1017:                                         int    itermax,
        !          1018:                                         double side_len,
        !          1019:                                         double offset_x,
        !          1020:                                         double offset_y)
        !          1021: {
        !          1022: png_colorpp image = NULL;
        !          1023: png_text    info_text[NUM_TEXT];
        !          1024: int         status;
        !          1025: 
        !          1026: /*******************************************************************************
        !          1027: +* Parámetros de tamaño para la imagen. Reserva de memoria para ella.
        !          1028: *******************************************************************************/
        !          1029:    SetSide(side_len);
        !          1030:    SetOffsetX(offset_x);
        !          1031:    SetOffsetY(offset_y);
        !          1032: 
        !          1033:    if (!(image = AllocatePNG(NUM_ROWS, NUM_COLS)))
        !          1034:       return ERROR;
        !          1035: 
        !          1036:    BuildTextPtr(info_text, alpha, beta, itermax, side_len, offset_x, offset_y);
        !          1037: 
        !          1038: /*******************************************************************************
        !          1039: +* Definición de la forma cuadrática.
        !          1040: *******************************************************************************/
        !          1041:    a1 = 1.0;
        !          1042:    b1 = 1.0;
        !          1043:    c1 = 0.0;
        !          1044:    a2 = 0.0;
        !          1045:    b2 = -1.0;
        !          1046:    c2 = 0.0;
        !          1047: 
        !          1048:    IterComputationEspecial(image, itermax, 20.0);
        !          1049:    status = WritePNG(img_name, image, info_text, NUM_TEXT);
        !          1050:    DeallocatePNG(image, NUM_ROWS, NUM_COLS);
        !          1051:    return status;
        !          1052: }
        !          1053: 
        !          1054: /*******************************************************************************
        !          1055: +* GenFractalEspecial5
        !          1056: +* Genera el caso F^+_{00}
        !          1057: *******************************************************************************/
        !          1058: int GenFractalEspecial5(char *img_name, double alpha,
        !          1059:                                         double beta,
        !          1060:                                         int    itermax,
        !          1061:                                         double side_len,
        !          1062:                                         double offset_x,
        !          1063:                                         double offset_y)
        !          1064: {
        !          1065: png_colorpp image = NULL;
        !          1066: png_text    info_text[NUM_TEXT];
        !          1067: int         status;
        !          1068: 
        !          1069: /*******************************************************************************
        !          1070: +* Parámetros de tamaño para la imagen. Reserva de memoria para ella.
        !          1071: *******************************************************************************/
        !          1072:    SetSide(side_len);
        !          1073:    SetOffsetX(offset_x);
        !          1074:    SetOffsetY(offset_y);
        !          1075: 
        !          1076:    if (!(image = AllocatePNG(NUM_ROWS, NUM_COLS)))
        !          1077:       return ERROR;
        !          1078: 
        !          1079:    BuildTextPtr(info_text, alpha, beta, itermax, side_len, offset_x, offset_y);
        !          1080: 
        !          1081: /*******************************************************************************
        !          1082: +* Definición de la forma cuadrática.
        !          1083: *******************************************************************************/
        !          1084:    a1 = 0.0;
        !          1085:    b1 = 0.0;
        !          1086:    c1 = 0.0;
        !          1087:    a2 = 1.0;
        !          1088:    b2 = 0.0;
        !          1089:    c2 = -1.0;
        !          1090: 
        !          1091:    IterComputationEspecial(image, itermax, 40.0);
        !          1092:    status = WritePNG(img_name, image, info_text, NUM_TEXT);
        !          1093:    DeallocatePNG(image, NUM_ROWS, NUM_COLS);
        !          1094:    return status;
        !          1095: }
        !          1096: 
        !          1097: /*******************************************************************************
        !          1098: +* GenFractalEspecial6
        !          1099: +* Genera el caso F^-_{00}
        !          1100: *******************************************************************************/
        !          1101: int GenFractalEspecial6(char *img_name, double alpha,
        !          1102:                                         double beta,
        !          1103:                                         int    itermax,
        !          1104:                                         double side_len,
        !          1105:                                         double offset_x,
        !          1106:                                         double offset_y)
        !          1107: {
        !          1108: png_colorpp image = NULL;
        !          1109: png_text    info_text[NUM_TEXT];
        !          1110: int         status;
        !          1111: 
        !          1112: /*******************************************************************************
        !          1113: +* Parámetros de tamaño para la imagen. Reserva de memoria para ella.
        !          1114: *******************************************************************************/
        !          1115:    SetSide(side_len);
        !          1116:    SetOffsetX(offset_x);
        !          1117:    SetOffsetY(offset_y);
        !          1118: 
        !          1119:    if (!(image = AllocatePNG(NUM_ROWS, NUM_COLS)))
        !          1120:       return ERROR;
        !          1121: 
        !          1122:    BuildTextPtr(info_text, alpha, beta, itermax, side_len, offset_x, offset_y);
        !          1123: 
        !          1124: /*******************************************************************************
        !          1125: +* Definición de la forma cuadrática.
        !          1126: *******************************************************************************/
        !          1127:    a1 = 0.0;
        !          1128:    b1 = 0.0;
        !          1129:    c1 = 0.0;
        !          1130:    a2 = 1.0;
        !          1131:    b2 = 0.0;
        !          1132:    c2 = 1.0;
        !          1133: 
        !          1134:    IterComputationEspecial(image, itermax, 40.0);
        !          1135:    status = WritePNG(img_name, image, info_text, NUM_TEXT);
        !          1136:    DeallocatePNG(image, NUM_ROWS, NUM_COLS);
        !          1137:    return status;
        !          1138: }
        !          1139: 
        !          1140: /*******************************************************************************
        !          1141: +* GenFractalEspecial7
        !          1142: +* Genera el caso F^+_{bc} cuando $c=\pm 2b$
        !          1143: *******************************************************************************/
        !          1144: int GenFractalEspecial7(char *img_name, double alpha,
        !          1145:                                         double beta,
        !          1146:                                         int    itermax,
        !          1147:                                         double side_len,
        !          1148:                                         double offset_x,
        !          1149:                                         double offset_y)
        !          1150: {
        !          1151: png_colorpp image = NULL;
        !          1152: png_text    info_text[NUM_TEXT];
        !          1153: int         status;
        !          1154: 
        !          1155: /*******************************************************************************
        !          1156: +* Parámetros de tamaño para la imagen. Reserva de memoria para ella.
        !          1157: *******************************************************************************/
        !          1158:    SetSide(side_len);
        !          1159:    SetOffsetX(offset_x);
        !          1160:    SetOffsetY(offset_y);
        !          1161: 
        !          1162:    if (!(image = AllocatePNG(NUM_ROWS, NUM_COLS)))
        !          1163:       return ERROR;
        !          1164: 
        !          1165:    BuildTextPtr(info_text, alpha, beta, itermax, side_len, offset_x, offset_y);
        !          1166: 
        !          1167: /*******************************************************************************
        !          1168: +* Definición de la forma cuadrática.
        !          1169: +* Parte fija:
        !          1170: *******************************************************************************/
        !          1171:    a1 = 0.0;
        !          1172:    a2 = 1.0;
        !          1173:    b2 = 0.0;
        !          1174:    c2 = -1.0;
        !          1175:    b1 = beta;
        !          1176:    c1 = 2*beta;
        !          1177: 
        !          1178: /*******************************************************************************
        !          1179: +* Computación y generación de la imagen.
        !          1180: *******************************************************************************/
        !          1181:    IterComputationEspecial(image, itermax, 40.0);
        !          1182:    status = WritePNG(img_name, image, info_text, NUM_TEXT);
        !          1183:    DeallocatePNG(image, NUM_ROWS, NUM_COLS);
        !          1184:    return status;
        !          1185: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>