Metropoli BBS
VIEWER: dna.c MODE: TEXT (CP437)
/*
  ╔════════════════════════════════════════════════════════════════════════╗
  ║                                                                        ║
  ║                      DNA - deoxyribonucleic acid                       ║
  ║                                                                        ║
  ║                       by Christopher D. Watkins                        ║
  ║                                                                        ║
  ╚════════════════════════════════════════════════════════════════════════╝
*/

#include "stdio.h"
#include "stdlib.h"
#include "dos.h"
#include "math.h"
#include "defs.h"

#define piover180 0.01745

float cosd(Word a)
{
  return cos(a * piover180);
}

float sind(Word a)
{
  return sin(a * piover180);
}

typedef char name[13];

FILE *Out_File;
name filename;

Word xresolution  = 160;
Word yresolution  = 100;
Byte numberofframes  = 30;

void writeheader()
{
  fprintf(Out_File,"╔════════════════════════════════════════════════════════════════════════╗\n");
  fprintf(Out_File,"║                                                                        ║\n");
  fprintf(Out_File,"║                      DNA - deoxyribonucleic acid                       ║\n");
  fprintf(Out_File,"║                                                                        ║\n");
  fprintf(Out_File,"║                       by Christopher D. Watkins                        ║\n");
  fprintf(Out_File,"║                                                                        ║\n");
  fprintf(Out_File,"╚════════════════════════════════════════════════════════════════════════╝\n");
  fprintf(Out_File,"\n");
  fprintf(Out_File,"\n");
  fprintf(Out_File,"STATS\n");
  fprintf(Out_File,"   XRES    = %d\n",xresolution);
  fprintf(Out_File,"   YRES    = %d\n",yresolution);
  fprintf(Out_File,"\n");
  fprintf(Out_File,"\n");
  fprintf(Out_File,"FRAMES\n");
  fprintf(Out_File,"   NUMBER  = %d\n",numberofframes);
}

void writestudio()
{
  fprintf(Out_File,"\n");
  fprintf(Out_File,"\n");
  fprintf(Out_File,"ENVIRONMENT\n");
  fprintf(Out_File,"   LOCLWGT =    0.750    0.750    0.750\n");
  fprintf(Out_File,"   REFLWGT =    0.250    0.250    0.250\n");
  fprintf(Out_File,"   TRANWGT =    0.000    0.000    0.000\n");
  fprintf(Out_File,"   MINWGT  =    0.030    0.030    0.030\n");
  fprintf(Out_File,"   MAXWGT  =    1.000    1.000    1.000\n");
  fprintf(Out_File,"   RDEPTH  =    2\n");
  fprintf(Out_File,"\n");
  fprintf(Out_File,"\n");
  fprintf(Out_File,"LAMPS\n");
  fprintf(Out_File,"   REFLAMP = FALSE\n");
  fprintf(Out_File,"   LAMPREF =    0.000    0.000    0.000\n");
  fprintf(Out_File,"   DISTEFF =    0.050\n");
  fprintf(Out_File,"\n");
  fprintf(Out_File,"\n");
  fprintf(Out_File,"OBSERVER\n");
  fprintf(Out_File,"   FLENGTH =    2.900\n");
  fprintf(Out_File,"   OBSPOS  =  -90.000 -950.000  230.000\n");
  fprintf(Out_File,"   ROTATE  =    5.800\n");
  fprintf(Out_File,"   TILT    =    3.000\n");
  fprintf(Out_File,"\n");
  fprintf(Out_File,"\n");
  fprintf(Out_File,"MATERIAL\n");
  fprintf(Out_File,"   TYPE    = BLUEMATTE\n");
  fprintf(Out_File,"   TEXTURE = SHEETROCK\n");
  fprintf(Out_File,"   AMBRFL  =    0.100    0.100    0.200\n");
  fprintf(Out_File,"   DIFRFL  =    0.600    0.600    0.900\n");
  fprintf(Out_File,"   SPCRFL  =    0.000    0.000    0.000\n");
  fprintf(Out_File,"   GLOSS   =    0.000\n");
  fprintf(Out_File,"   TRANS   =    0.000    0.000    0.000\n");
  fprintf(Out_File,"   INDEX   =    1.000\n");
  fprintf(Out_File,"\n");
  fprintf(Out_File,"\n");
  fprintf(Out_File,"MATERIAL\n");
  fprintf(Out_File,"   TYPE    = PHOSPHATE\n");
  fprintf(Out_File,"   TEXTURE = SMOOTH\n");
  fprintf(Out_File,"   AMBRFL  =    0.200    0.200    0.200\n");
  fprintf(Out_File,"   DIFRFL  =    0.600    0.600    0.600\n");
  fprintf(Out_File,"   SPCRFL  =    0.200    0.200    0.200\n");
  fprintf(Out_File,"   GLOSS   =   35.000\n");
  fprintf(Out_File,"   TRANS   =    0.000    0.000    0.000\n");
  fprintf(Out_File,"   INDEX   =    1.000\n");
  fprintf(Out_File,"\n");
  fprintf(Out_File,"\n");
  fprintf(Out_File,"{ nitrogenous bases (pyrimidine and purine derivatives) }\n");
  fprintf(Out_File,"\n");
  fprintf(Out_File,"MATERIAL\n");
  fprintf(Out_File,"   TYPE    = GUANINE\n");
  fprintf(Out_File,"   TEXTURE = SMOOTH\n");
  fprintf(Out_File,"   AMBRFL  =    0.000    0.200    0.000\n");
  fprintf(Out_File,"   DIFRFL  =    0.000    0.600    0.000\n");
  fprintf(Out_File,"   SPCRFL  =    0.000    0.200    0.000\n");
  fprintf(Out_File,"   GLOSS   =   35.000\n");
  fprintf(Out_File,"   TRANS   =    0.000    0.000    0.000\n");
  fprintf(Out_File,"   INDEX   =    1.000\n");
  fprintf(Out_File,"\n");
  fprintf(Out_File,"\n");
  fprintf(Out_File,"MATERIAL\n");
  fprintf(Out_File,"   TYPE    = CYTOSINE\n");
  fprintf(Out_File,"   TEXTURE = SMOOTH\n");
  fprintf(Out_File,"   AMBRFL  =    0.000    0.000    0.200\n");
  fprintf(Out_File,"   DIFRFL  =    0.000    0.000    0.600\n");
  fprintf(Out_File,"   SPCRFL  =    0.000    0.000    0.200\n");
  fprintf(Out_File,"   GLOSS   =   35.000\n");
  fprintf(Out_File,"   TRANS   =    0.000    0.000    0.000\n");
  fprintf(Out_File,"   INDEX   =    1.000\n");
  fprintf(Out_File,"\n");
  fprintf(Out_File,"\n");
  fprintf(Out_File,"MATERIAL\n");
  fprintf(Out_File,"   TYPE    = THYMINE\n");
  fprintf(Out_File,"   TEXTURE = SMOOTH\n");
  fprintf(Out_File,"   AMBRFL  =    0.200    0.000    0.000\n");
  fprintf(Out_File,"   DIFRFL  =    0.600    0.000    0.000\n");
  fprintf(Out_File,"   SPCRFL  =    0.200    0.000    0.000\n");
  fprintf(Out_File,"   GLOSS   =   35.000\n");
  fprintf(Out_File,"   TRANS   =    0.000    0.000    0.000\n");
  fprintf(Out_File,"   INDEX   =    1.000\n");
  fprintf(Out_File,"\n");
  fprintf(Out_File,"\n");
  fprintf(Out_File,"MATERIAL\n");
  fprintf(Out_File,"   TYPE    = ADENINE\n");
  fprintf(Out_File,"   TEXTURE = SMOOTH\n");
  fprintf(Out_File,"   AMBRFL  =    0.200    0.000    0.200\n");
  fprintf(Out_File,"   DIFRFL  =    0.600    0.000    0.600\n");
  fprintf(Out_File,"   SPCRFL  =    0.200    0.000    0.200\n");
  fprintf(Out_File,"   GLOSS   =   35.000\n");
  fprintf(Out_File,"   TRANS   =    0.000    0.000    0.000\n");
  fprintf(Out_File,"   INDEX   =    1.000\n");
  fprintf(Out_File,"\n");
  fprintf(Out_File,"\n");
  fprintf(Out_File,"{ floor }\n");
  fprintf(Out_File,"\n");
  fprintf(Out_File,"GROUND\n");
  fprintf(Out_File,"   MATL    = BLUEMATTE\n");
  fprintf(Out_File,"\n");
  fprintf(Out_File,"\n");
  fprintf(Out_File,"{ lights }\n");
  fprintf(Out_File,"\n");
  fprintf(Out_File,"LAMP\n");
  fprintf(Out_File,"   LOC     =  400.000 -400.000  400.000\n");
  fprintf(Out_File,"   RADIUS  =  100.000\n");
  fprintf(Out_File,"   INTENS  =    0.950    0.950    0.950\n");
  fprintf(Out_File,"\n");
  fprintf(Out_File,"\n");
  fprintf(Out_File,"LAMP\n");
  fprintf(Out_File,"   LOC     = -400.000 -400.000  400.000\n");
  fprintf(Out_File,"   RADIUS  =  100.000\n");
  fprintf(Out_File,"   INTENS  =    0.950    0.950    0.950\n");
  fprintf(Out_File,"\n");
  fprintf(Out_File,"\n");
}

Byte randnum[41];

void assignmoleculetypes()
{
  Word i;

  for (i = 0; i <= 40; i++)
    randnum[i] = 0;
  for (i = 0; i <= 40; i++)
    randnum[i] = random(4);
}

void makedna()
{
  Word theta;
  Word theta2;
  Word dtheta;
  float x, y, z;
  float dz;
  Word level;
  Word t;
  float phase;
  float rad;

  assignmoleculetypes();
  phase = 0.0;
  for (t = 1; t <= numberofframes; t++)
  {
    writestudio();
    theta = (int)(phase) & 0xFFFF;
    theta2 = (int)(phase + 130) & 0xFFFF;
    rad = 15.0;
    x = 0.0;
    y = 0.0;
    z = rad;
    dtheta = 25;
    dz = 25.0;
    level = 1;
    do
    {
      x = 45 * cosd(theta);
      y = 45 * sind(theta);
      fprintf(Out_File,"SPHERE\n");
      fprintf(Out_File,"   LOC     = %3.3f %3.3f %3.3f\n",x,y,z);
      fprintf(Out_File,"   RADIUS  = %3.3f\n",rad);
      fprintf(Out_File,"   MATL    = PHOSPHATE\n");
      fprintf(Out_File,"\n");
      x = 45 * cosd(theta2);
      y = 45 * sind(theta2);
      fprintf(Out_File,"SPHERE\n");
      fprintf(Out_File,"   LOC     = %3.3f %3.3f %3.3f\n",x,y,z);
      fprintf(Out_File,"   RADIUS  = %3.3f\n",rad);
      fprintf(Out_File,"   MATL    = PHOSPHATE\n");
      fprintf(Out_File,"\n");
      if ((level % 2 == 0))
      {
	x = 15 * cosd(theta);
	y = 15 * sind(theta);
	fprintf(Out_File,"SPHERE\n");
	fprintf(Out_File,"   LOC     = %3.3f %3.3f %3.3f\n",x,y,z);
	fprintf(Out_File,"   RADIUS  = %3.3f\n",rad);
	switch (randnum[(level - 1) / 2])
	{
	  case 0 : fprintf(Out_File,"   MATL    = GUANINE\n");
		   break;
	  case 1 : fprintf(Out_File,"   MATL    = CYTOSINE\n");
		   break;
	  case 2 : fprintf(Out_File,"   MATL    = THYMINE\n");
		   break;
	  case 3 : fprintf(Out_File,"   MATL    = ADENINE\n");
		   break;
	}
	fprintf(Out_File,"\n");
	x = 15 * cosd(theta2);
	y = 15 * sind(theta2);
	fprintf(Out_File,"SPHERE\n");
	fprintf(Out_File,"   LOC     = %3.3f %3.3f %3.3f\n",x,y,z);
	fprintf(Out_File,"   RADIUS  = %3.3f\n",rad);
	switch (randnum[(level - 1) / 2])
	{
	  case 0 : fprintf(Out_File,"   MATL    = CYTOSINE\n");
		   break;
	  case 1 : fprintf(Out_File,"   MATL    = GUANINE\n");
		   break;
	  case 2 : fprintf(Out_File,"   MATL    = ADENINE\n");
		   break;
	  case 3 : fprintf(Out_File,"   MATL    = THYMINE\n");
		   break;
	}
	fprintf(Out_File,"\n");
      }
      level = level + 1;
      theta = theta + dtheta;
      theta2 = theta2 + dtheta;
      z = z + dz;
    }
    while (!(((int)(theta - phase) > 360)));
    fprintf(Out_File,"");
    fprintf(Out_File,"");
    fprintf(Out_File,"ENDFRAME");
    phase = phase + (360.0 / numberofframes);
  }
}

void main()
{
  strcpy(filename,"DNA.RT");
  clrscr();
  printf("Generating %s File\n",filename);
  printf("\n");
  printf("By Christopher D. Watkins\n");
  printf("\n");
  printf("\n");
  printf("Writing %d frames\n",numberofframes);
  Out_File=fopen(filename, "wt");
  writeheader();
  makedna();
  fclose(Out_File);
}
[ RETURN TO DIRECTORY ]