home *** CD-ROM | disk | FTP | other *** search
/ Graphics 16,000 / graphics-16000.iso / msdos / fractal / fdesi313 / fdes13s / fdesifs.c < prev    next >
Text File  |  1990-01-23  |  11KB  |  226 lines

  1. /*
  2.         IFS code display and support for FRACTINT
  3. */
  4.  
  5. #include <stdio.h>
  6. #include <graphics.h>
  7. #include <io.h>
  8. #include <dos.h>
  9. #include <string.h>
  10. #include "fdestria.h"
  11. #include "fdesign.h"
  12. #include "fdesplot.h"
  13. #include "fdesfile.h"
  14. #include "fdesmenu.h"
  15. popmenu ifsmenu = {
  16.         3 ,
  17.     "Read a FRACTINT .IFS file", "Write a FRACTINT .IFS file", "Return"
  18.     };
  19.  
  20. void ifs_menu(void)
  21. {
  22. int i,j;
  23. int select;
  24. int done;
  25. FILE *ifsfile;
  26. char fname[80];
  27. char sbuf[80];
  28. char save,ch;
  29. float a,b,c,d,e,f,p;
  30. int file_error;
  31. int x1,y1,x2,y2;
  32. float top,left,right,bottom;
  33. float scalex,scaley;
  34. float offsetx,offsety;
  35. float xset,yset;
  36. float temp_x,temp_y;
  37.  
  38.         /* Display IFS codes */
  39.         putmsg_d(10,80,"IFS codes for this screen",BLUE,WHITE);
  40.         for (i=0; i<num_triangles; i++)
  41.         {
  42.         sprintf(sbuf,"%7.4f %7.4f %7.4f %7.4f %9.4f %9.4f %6.4f",
  43.                         IFS[1+7*i],IFS[2+7*i],
  44.                         IFS[3+7*i],IFS[4+7*i],
  45.                         IFS[5+7*i],IFS[6+7*i],
  46.                         IFS[7+7*i]);
  47.                 putmsg_d(10,i*14+100,sbuf,BLACK,colors[i%MAXCOLORS_]);
  48.     }
  49.         done = 0;
  50.         do {
  51.                 select = popup(100,10,&ifsmenu,LIGHTGREEN,BROWN);
  52.                 switch (select)
  53.                 {
  54.                         case 1: /* read from .IFS file */
  55.                                 if (gscanf(100,100,"Read from what .IFS file: ",
  56.                                         8,"%s",fname))
  57.                 {
  58.                     file_error = 0;
  59.                                         ifs_name_fix(fname);
  60.                     ifsfile = fopen(fname,"rt");
  61.                     if (ifsfile == NULL)
  62.                     {
  63.                         putmsg(10,100,"File not Found",RED,WHITE);
  64.                         delay(1000);
  65.                         clrmsg();
  66.                         break;
  67.                     }
  68.                                         num_triangles = 0;
  69.                                         do
  70.                                         {
  71.                         if (fgets(sbuf,80,ifsfile) == NULL) continue;
  72.                         i = sscanf(sbuf,"%f %f %f %f %f %f %f",
  73.                             &a,&b,&c,&d,&e,&f,&p);
  74.                                                 if ((i == 7) && (num_triangles == (MAXFUNC-1)))
  75.                                                 {
  76.                                                         file_error = 1;
  77.                                                         putmsg(10,100,"Too many IFS codes",RED,WHITE);
  78.                                                         delay(1000);
  79.                                                         clrmsg();
  80.                                                         continue;
  81.                                                 }
  82.                                                 if (i == 7)
  83.                                                 {
  84.                                                         /* calc set point */
  85.                                                         xset = 1.0;
  86.                                                         yset = 1.0;
  87.                                                         for (j=0; j<20; j++)
  88.                                                         {
  89.                                                                 temp_x = xset*a + yset*b + e;
  90.                                                                 temp_y = xset*c + yset*d + f;
  91.                                                                 xset = temp_x;
  92.                                                                 yset = temp_y;
  93.                                                         }
  94.                                                         /* adjust min/max values */
  95.                                                         if (num_triangles == 0)
  96.                                                         {
  97.                                                                 left = right = xset;
  98.                                                                 top = bottom = yset;
  99.                                                         }
  100.                                                         else
  101.                                                         {
  102.                                                                 if (xset < left) left = xset;
  103.                                                                 if (xset > right) right = xset;
  104.                                                                 if (yset < top) top = yset;
  105.                                                                 if (yset > bottom) bottom = yset;
  106.                                                         }
  107.                                                         IFS[1+7*num_triangles+0] = a;
  108.                                                         IFS[1+7*num_triangles+1] = b;
  109.                                                         IFS[1+7*num_triangles+2] = c;
  110.                                                         IFS[1+7*num_triangles+3] = d;
  111.                                                         IFS[1+7*num_triangles+4] = e;
  112.                                                         IFS[1+7*num_triangles+5] = f;
  113.                                                         IFS[1+7*num_triangles+6] = p;
  114.                                                         num_triangles++;
  115.                                                 }
  116.                                         } while ((!feof(ifsfile)) && (!file_error));
  117.                     fclose(ifsfile);
  118.                                         if (num_triangles == 0) file_error = 1;
  119.                     if (file_error) default_fractal();
  120.                     else
  121.                     {
  122.                                                 /* setup a default reference triangle */
  123.                         triangle0.col[0] = left;
  124.                         triangle0.col[1] = right;
  125.                         triangle0.col[2] = right;
  126.                         triangle0.row[0] = bottom;
  127.                         triangle0.row[1] = bottom;
  128.                         triangle0.row[2] = top;
  129.                                                 for (j=0; j<num_triangles; j++)
  130.                                                 {
  131.                                                         for (i=0; i<3; i++)
  132.                                                         {
  133. triangles[j].col[i] = triangle0.col[i]*IFS[1+7*j] + triangle0.row[i]*IFS[2+7*j] + IFS[5+7*j];
  134. triangles[j].row[i] = triangle0.col[i]*IFS[3+7*j] + triangle0.row[i]*IFS[4+7*j] + IFS[6+7*j];
  135.                                                         }
  136.                                                 if (transform_affine(&triangles[j]) == 0)
  137.                                                         {
  138. sprintf(sbuf,"IFS code #%d is not Affine",j+1);
  139. putmsg(10,100,sbuf,RED,WHITE);
  140. delay(1000);
  141. clrmsg();
  142. file_error=1;
  143.                             }
  144.  
  145.                                                 }
  146.                                                 if (file_error) default_fractal();
  147.                                                 else {
  148.                                                         sprintf(sbuf,"    %d IFS codes read in   ",num_triangles);
  149.                                                         putmsg(150,150,sbuf,BLUE,WHITE);
  150.                                                         delay(1000);
  151.                                                         clrmsg();
  152.                                                         x1 = 150; x2 = 400;
  153.                                                         y1 = 116; y2 = 350;
  154.                                                         triangles_limits(&left,&top,&right,&bottom);
  155.                                                         scalex = (x2-x1)/(right - left);
  156.                                                         scaley = (y2-y1)/(bottom - top);
  157.                                                         if (scalex > scaley) scalex = scaley;
  158.                                                         else scaley = scalex;
  159.                                                         scaley = -scaley;
  160.                                                         offsetx = -((left+right)/2.0)*scalex + (x2+x1)/2.0;
  161.                                                         offsety = -((bottom+top)/2.0)*scaley + (y2+y1)/2.0;
  162.                                                         IFS_rescale(scalex,offsetx,scaley,offsety,0);
  163.                                                         triangles_use_temp();
  164.                                                 }
  165.                     }
  166.                                         IFS_changed = 1;
  167.                                 }
  168.                                 stpcpy(last_file,"No file");
  169.                                 file_modified = 0;
  170.                                 break;
  171.                         case 2: /* write to .IFS file */
  172.                                 if (gscanf(100,100,"Write to what .IFS file: ",
  173.                                                 8,"%s",fname))
  174.                                 {
  175.                                         ifs_name_fix(fname);
  176.  
  177.                                         save = 'n';
  178.                                         if (access(fname,0) != 0)
  179.                                         {
  180.                                                 save = 'y';
  181.                                         }
  182.                                         else
  183.                                         {
  184.                                                 if (gscanf(80,80,"File Exists, replace (Y/N)? ",
  185.                                                        1,"%c",&ch))
  186.                                                 {
  187.                                                         if ((ch == 'Y') || (ch == 'y'))
  188.                                                         {
  189.                                                                 save = 'y';
  190.                                                         }
  191.                                                 }
  192.                                         }
  193.                                         if (save == 'n') break;
  194.  
  195.                                         ifsfile = fopen(fname,"wt");
  196.                                         /*
  197.                                                 compute ifs codes for FRACTINT
  198.                                                 screen size
  199.                                         */
  200.                                         plot_type = 5;
  201.                                         plotlimits(3000);
  202.                                         /* output to file */
  203.                                         for (i=0; i<num_triangles; i++)
  204.                                         {
  205.                                                 fprintf(ifsfile,"%f %f %f %f %f %f %f\n",
  206.                                                         IFS[1+7*i],IFS[2+7*i],
  207.                                                         IFS[3+7*i],IFS[4+7*i],
  208.                                                         IFS[5+7*i],IFS[6+7*i],
  209.                                                         IFS[7+7*i]);
  210.                     }
  211.                     fprintf(ifsfile,"\032"); /* ctrl-z */
  212.                                         fclose(ifsfile);
  213.                                         putmsg(100,200,"File saved",BLUE,WHITE);
  214.                                         delay(1000);
  215.                                         clrmsg();
  216.                                 }
  217.                                 break;
  218.                         case 3:
  219.                                 done = 1;
  220.                                 break;
  221.                 }
  222.     } while (!done);
  223.         cleardevice();
  224. }
  225.  
  226.