📄 prompts1.c
字号:
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 + -