⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 prompts1.c

📁 frasr200的win 版本源码(18.21),使用make文件,使用的vc版本较低,在我的环境下编译有问题! 很不错的分形程序代码!
💻 C
📖 第 1 页 / 共 5 页
字号:
char far v4[] = {"Number of z pixels"};
char far v5[] = {"Location of z origin"};
char far v6[] = {"Depth of z"};
char far v7[] = {"Screen height"};
char far v8[] = {"Screen width"};
char far v9[] = {"Distance to Screen"};
char far v10[] = {"Distance between eyes"};
char far v11[] = {"3D Mode"};
char *juli3Doptions[] = {"monocular","lefteye","righteye","red-blue"};

/* --------------------------------------------------------------------- */
int get_fract_params(int caller)	/* prompt for type-specific parms */
{
   char far *v0 = v0a;
   char far *v1 = v1a;
   char far *v2 = v2a;
   char far *v3 = v3a;
   char far *juliorbitname = NULL;
   extern double mxmaxfp, mxminfp, mymaxfp, myminfp, originfp;
   extern double depthfp, heightfp, widthfp, distfp, eyesfp;
   extern int zdots; 
   char *nameptr[MAXFRACTALS];
   int fractals[MAXFRACTALS];
   int i,j,k;
   int curtype,numparams,numtrig,last_val;
   struct fullscreenvalues paramvalues[30];
   char far *choices[30];
   int oldbailout;
   int extra;
   int numextra;
   int promptnum;
   char msg[120];
   char *typename, *tmpptr;
   char bailoutmsg[50];
   int ret = 0;
   int oldhelpmode;
   static char far t11[] = {"Function (if needed by orbit formula)"};
   static char far t1[] = {"First Function"};
   static char far t2[] = {"Second Function"};
   static char far t3[] = {"Third Function"};
   static char far t4[] = {"Fourth Function"};
   static char far *trg[] = {t1, t2, t3, t4};
   extern char suffix[4096];
   char *filename,*entryname;
   FILE *entryfile;
   char *trignameptr[25];
   extern int  juli3Dmode;
   struct fractalspecificstuff far *jborbit;
   struct fractalspecificstuff far *savespecific;
   int firstparm;
   double oldparam[MAXPARAMS];
   ENTER_OVLY(OVLY_PROMPTS1);
   firstparm = 0;
   if(fractype==JULIBROT || fractype==JULIBROTFP)
      julibrot = 1;
   else
      julibrot = 0;
   curtype = fractype;
   if (curfractalspecific->name[0] == '*'
     && (i = fractalspecific->tofloat) != NOFRACTAL
     && fractalspecific[i].name[0] != '*')
      curtype = i;
   curfractalspecific = &fractalspecific[curtype];
#if 0
   if (curtype == IFS || curtype == IFS3D) {
      ret = ((caller) ? edit_ifs_params() : 0);
      goto gfp_exit;
      }
#endif
   suffix[0] = 0;
   if ((i = curfractalspecific->helpformula) < -1) {
      if (i == -2) { /* special for formula */
	 filename = FormFileName;
	 entryname = FormName;
	 }
      else {	 /* -3, special for lsystem */
	 filename = LFileName;
	 entryname = LName;
	 }
      if (find_file_item(filename,entryname,&entryfile) == 0) {
	 load_entry_text(entryfile,suffix,16);
	 fclose(entryfile);
	 }
      }
   else if (i >= 0) {
      int c,lines;
      if (i = read_help_topic(i,0,2000,suffix) > 0) i = 0;
      suffix[2000-i] = 0;
      i = j = lines = 0; k = 1;
      while ((c = suffix[i++])) {
	 /* stop at ctl, blank, or line with col 1 nonblank, max 16 lines */
	 if (k && c == ' ' && ++k <= 5) { } /* skip 4 blanks at start of line */
	 else {
	    if (c == '\n') {
	       if (k) break; /* blank line */
	       if (++lines >= 16) break;
	       k = 1;
	       }
	    else if (c < 16) /* a special help format control char */
	       break;
	    else {
	       if (k == 1) /* line starts in column 1 */
		  break;
	       k = 0;
	       }
	    suffix[j++] = c;
	    }
	 }
      while (--j >= 0 && suffix[j] == '\n') { }
      suffix[j+1] = 0;
      }
gfp_top:   
   promptnum = 0;
   if (julibrot)
   {
      i = select_fracttype(neworbittype);
      if (i < 0) 
      {
         if (ret == 0)
            ret = -1;
         julibrot = 0;
         goto gfp_exit;
      }
      else
         neworbittype = i;
      jborbit = &fractalspecific[neworbittype];
      juliorbitname = jborbit->name;
   }
   promptnum = 0;

   if(julibrot)
   {
      savespecific = curfractalspecific;
      curfractalspecific = jborbit;
      firstparm = 2; /* in most case Julibrot does not need first two parms */
      if(neworbittype == QUATJULFP     ||   /* all parameters needed */ 
         neworbittype == HYPERCMPLXJFP)
         firstparm = 0; 
      if(neworbittype == QUATFP        ||   /* no parameters needed */
         neworbittype == HYPERCMPLXFP)
         firstparm = 4; 
   }   
   numparams = 0;
   
   for (i = firstparm; i < 4; i++) 
   {
      char tmpbuf[30];
      if (curfractalspecific->param[i][0] == 0) 
         break;
      numparams++;
      choices[promptnum] = curfractalspecific->param[i];
      paramvalues[promptnum].type = 'd';
   
      if (choices[promptnum][0] == '+') 
      {
         choices[promptnum]++;
         paramvalues[promptnum].type = 'D';
      }
      sprintf(tmpbuf,"%.17g",param[i]);
      paramvalues[promptnum].uval.dval = atof(tmpbuf);
      oldparam[i] = paramvalues[promptnum++].uval.dval;
   }
   numextra = 0;
   if(curfractalspecific->flags&MORE && !julibrot)
   {
      if((extra=find_extra_param(fractype))<-1)
      {
         char msg[30];
         sprintf(msg,"find_extra_param error");
         stopmsg(0,msg);
      }
      else
      for (i=0;i<MAXPARAMS-4;i++) 
      {
         char tmpbuf[30];
         if (moreparams[extra].param[i][0] == 0) 
            break;
         numextra++;
         choices[promptnum] = moreparams[extra].param[i];
         paramvalues[promptnum].type = 'd';
         if (choices[promptnum][0] == '+') 
         {
            choices[promptnum]++;
            paramvalues[promptnum].type = 'D';
         }
         sprintf(tmpbuf,"%.17g",param[i+4]);
         paramvalues[promptnum].uval.dval = atof(tmpbuf);
         oldparam[i+4] = paramvalues[promptnum++].uval.dval;
      }
   }
   numtrig = (curfractalspecific->flags >> 6) & 7;
   if(curtype==FORMULA || curtype==FFORMULA ) {
      extern char maxfn;
      numtrig = maxfn;
      }

   if ((i = numtrigfn) > 27) i = 27;
   while (--i >= 0)
      trignameptr[i] = trigfn[i].name;
   for (i = 0; i < numtrig; i++) {
      paramvalues[promptnum].type = 'l';
      paramvalues[promptnum].uval.ch.val  = trigndx[i];
      paramvalues[promptnum].uval.ch.llen = numtrigfn;
      paramvalues[promptnum].uval.ch.vlen = 6;
      paramvalues[promptnum].uval.ch.list = trignameptr;
      choices[promptnum++] = trg[i];
      }
   if (*(typename = curfractalspecific->name) == '*')
        ++typename;

   if (curfractalspecific->orbit_bailout)
      if (potparam[0] != 0.0 && potparam[2] != 0.0) 
      {
	 paramvalues[promptnum].type = '*';
	 choices[promptnum++] = "Bailout: continuous potential (Y screen) value in use";
      }
      else 
      {
         static char far bailoutstr[] = {"Bailout value (0 means use default)"};
	 choices[promptnum] = bailoutstr;
	 paramvalues[promptnum].type = 'i';
	 paramvalues[promptnum++].uval.ival = oldbailout = bailout;
	 paramvalues[promptnum].type = '*';
	 i = curfractalspecific->orbit_bailout;
	 tmpptr = typename;
	 if (usr_biomorph != -1) 
	 {
	    i = 100;
	    tmpptr = "biomorph";
	 }
	 sprintf(bailoutmsg,"    (%s default is %d)",tmpptr,i);
	 choices[promptnum++] = bailoutmsg;
      }
   if (julibrot)
   {
      switch(neworbittype)
      {
      case QUATFP:
      case HYPERCMPLXFP:
          v0 = v0b; v1 = v1b; v2 = v2b; v3 = v3b;
          break;
      case QUATJULFP:
      case HYPERCMPLXJFP:
          v0 = v0c; v1 = v1c; v2 = v2c; v3 = v3c;
          break;
      default:
          v0 = v0a; v1 = v1a; v2 = v2a; v3 = v3a;
         break;
      }

      curfractalspecific = savespecific;
      paramvalues[promptnum].uval.dval = mxmaxfp;
      paramvalues[promptnum].type = 'f';
      choices[promptnum++] = v0;
      paramvalues[promptnum].uval.dval = mymaxfp;
      paramvalues[promptnum].type = 'f';
      choices[promptnum++] = v1;
      paramvalues[promptnum].uval.dval = mxminfp;
      paramvalues[promptnum].type = 'f';
      choices[promptnum++] = v2;
      paramvalues[promptnum].uval.dval = myminfp;
      paramvalues[promptnum].type = 'f';
      choices[promptnum++] = v3;
      paramvalues[promptnum].uval.ival = zdots;
      paramvalues[promptnum].type = 'i';
      choices[promptnum++] = v4;

      paramvalues[promptnum].type = 'l';
      paramvalues[promptnum].uval.ch.val  = juli3Dmode;
      paramvalues[promptnum].uval.ch.llen = 4;
      paramvalues[promptnum].uval.ch.vlen = 9;
      paramvalues[promptnum].uval.ch.list = juli3Doptions;
      choices[promptnum++] = v11;

      paramvalues[promptnum].uval.dval = eyesfp;
      paramvalues[promptnum].type = 'f';
      choices[promptnum++] = v10;
      paramvalues[promptnum].uval.dval = originfp;
      paramvalues[promptnum].type = 'f';
      choices[promptnum++] = v5;
      paramvalues[promptnum].uval.dval = depthfp;
      paramvalues[promptnum].type = 'f';
      choices[promptnum++] = v6;
      paramvalues[promptnum].uval.dval = heightfp;
      paramvalues[promptnum].type = 'f';
      choices[promptnum++] = v7;
      paramvalues[promptnum].uval.dval = widthfp;
      paramvalues[promptnum].type = 'f';
      choices[promptnum++] = v8;
      paramvalues[promptnum].uval.dval = distfp;
      paramvalues[promptnum].type = 'f';
      choices[promptnum++] = v9;
   }

   if (curtype == INVERSEJULIA || curtype == INVERSEJULIAFP)
   {
      extern int  major_method;
      extern int  minor_method;

#ifdef RANDOM_RUN
      static char far JIIMstr1[] =
	"Breadth first, Depth first, Random Walk, Random Run?";
      static char *JIIMmethod[] = {"Breadth", "Depth", "Walk", "Run"};
#else
      static char far JIIMstr1[] =
	"Breadth first, Depth first, Random Walk";
      static char *JIIMmethod[] = {"Breadth", "Depth", "Walk"};
#endif
      static char far JIIMstr2[] =
	"Left first or Right first?";
      static char *JIIMleftright[] = {"Left", "Right"};

      choices[promptnum] = JIIMstr1;
      paramvalues[promptnum].type = 'l';
      paramvalues[promptnum].uval.ch.list = JIIMmethod;
      paramvalues[promptnum].uval.ch.vlen = 7;
#ifdef RANDOM_RUN
      paramvalues[promptnum].uval.ch.llen = 4;
#else
      paramvalues[promptnum].uval.ch.llen = 3; /* disable random run */
#endif
      paramvalues[promptnum++].uval.ch.val  = major_method;

      choices[promptnum] = JIIMstr2;
      paramvalues[promptnum].type = 'l';
      paramvalues[promptnum].uval.ch.list = JIIMleftright;
      paramvalues[promptnum].uval.ch.vlen = 5;
      paramvalues[promptnum].uval.ch.llen = 2;
      paramvalues[promptnum++].uval.ch.val  = minor_method;
   }

   if (caller				/* <z> command ? */
      && (display3d > 0 || promptnum == 0))
      {
       static char far msg[]={"Current type has no type-specific parameters"};
       stopmsg(20,msg);
       goto gfp_exit;
       }
   if(julibrot)
   sprintf(msg,
	   "Julibrot Parameters (orbit= %s)\n(Press F6 for corner parameters)",
	   juliorbitname);
   else
   sprintf(msg,
	   "Parameters for fractal type %s\n(Press F6 for corner parameters)",
	   typename);

   while (1) 
   {
      oldhelpmode = helpmode;
      helpmode = curfractalspecific->helptext;
      i = fullscreen_prompt(msg,promptnum,choices,paramvalues,0,0x40,suffix);
      helpmode = oldhelpmode;
      if (i < 0) 
      {
         if(julibrot)
           goto gfp_top;
	 if (ret == 0)
	    ret = -1;
	 goto gfp_exit;
      }
      if (i != F6) 
         break;
      if (get_corners() > 0)
	 ret = 1;
     }
     promptnum = 0;
     for ( i = firstparm; i < numparams+firstparm; i++) 
     {
        if (oldparam[i] != paramvalues[promptnum].uval.dval) 
        {
           param[i] = paramvalues[promptnum].uval.dval;
   	   ret = 1;
        }
        ++promptnum;
    }
     for(i=0;i<numextra;i++)
     {
        if(oldparam[i+4] != paramvalues[promptnum].uval.dval)
        {
           param[i+4] = paramvalues[promptnum].uval.dval;
           ret = 1;
        }
        ++promptnum;
     }

   for ( i = 0; i < numtrig; i++) 
   {
      if (paramvalues[promptnum].uval.ch.val != trigndx[i]) 
      {
	 set_trig_array(i,trigfn[paramvalues[promptnum].uval.ch.val].name);
	 ret = 1;
      }
      ++promptnum;
   }

   if(julibrot)
   {
      savespecific = curfractalspecific;
      curfractalspecific = jborbit;
   }   

   if (curfractalspecific->orbit_bailout)
      if (potparam[0] != 0.0 && potparam[2] != 0.0) 
	 promptnum++;
      else 
      {
         bailout = paramvalues[promptnum++].uval.ival;
#ifndef XFRACT
         if (bailout != 0 && (bailout < 4 || bailout > 32000))
#else /* We have big integers, so why not allow big bailouts? */
         if (bailout != 0 && (bailout < 4))
#endif
	    bailout = oldbailout;
         if (bailout != oldbailout)
	    ret = 1;
	 promptnum++;
      }

     if (julibrot)
     {
	mxmaxfp    = paramvalues[promptnum++].uval.dval;
	mymaxfp    = paramvalues[promptnum++].uval.dval;
	mxminfp    = paramvalues[promptnum++].uval.dval;
	myminfp    = paramvalues[promptnum++].uval.dval;
	zdots      = paramvalues[promptnum++].uval.ival;
        juli3Dmode = paramvalues[promptnum++].uval.ch.val;
	eyesfp     = paramvalues[promptnum++].uval.dval;
	originfp   = paramvalues[promptnum++].uval.dval;
	depthfp    = paramvalues[promptnum++].uval.dval;
	heightfp   = paramvalues[promptnum++].uval.dval;
	widthfp    = paramvalues[promptnum++].uval.dval;
	distfp     = paramvalues[promptnum++].uval.dval;
        ret = 1;  /* force new calc since not resumable anyway */
     }
      if (curtype == INVERSEJULIA || curtype == INVERSEJULIAFP)
      {
	 extern int major_method, minor_method;

	 if (paramvalues[promptnum].uval.ch.val != major_method ||
	     paramvalues[promptnum+1].uval.ch.val != minor_method)
	    ret = 1;

	 major_method = paramvalues[promptnum  ].uval.ch.val;
	 minor_method = paramvalues[promptnum+1].uval.ch.val;
      }

gfp_exit:
   curfractalspecific = &fractalspecific[fractype];
   EXIT_OVLY;
   return(ret);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -