linedraw.spt







































/* This file illustrates how to generate a line drawing of apparatus */ 
/* It makes heavy use of gsave() and grestore() and axes transformations*/
/* to draw elements repeatedly in different locations and/or orientations */
/* This is just one way to do this. */

#include <splot.h>

main()
   {
   /* it turned out too big in the end so scale it back some */
   scale(0.75,0.75);

   /* draw Dewar */
   tail();
   gsave();
   /* draw a slightly bigger tail around the first */
   scale(1.25,1.05);
   translate(-1.05,-0.5); 
   tail();
   grestore();

   /* draw lenses */
   newpath();
   set(LINECOLOUR,BROWN);
   gsave();
   translate(12.79,10.85);
   rotate(90);
   scale(2,2);
   lens();
   grestore();
   gsave();
   translate(11.09,6.21);
   scale(0.5,0.5);
   lens();
   grestore();

   /* draw the prism */
   gsave();
   translate(10.84,10.6);
   prism();
   grestore();

   /* draw helium level */
   set(LINECOLOUR,BLUE);
   moveto(2.44,8.08);
   curveto(3.13,7.66,3.82,8.68,4.13,7.96);
   curveto(4.89,8.38,5.32,7.72,5.89,8.20);
   curveto(6.58,7.72,7.08,8.74,7.77,8.08);
   stroke();

   /* draw 45 degree fold mirror */
   set(LINECOLOUR,BLACK);
   moveto(4.07,11.72);
   lineto(5.64,10.15,5.44,9.95,3.64,11.72);
   closepath();

   /* draw diamnond anvil cell */
   moveto(3.38,11.72);
   lineto(6.82,11.72,6.82,17.07,7.33,17.07,7.33,17.73,2.88,17.73,
          2.88,17.07,3.38,17.07);
   closepath();
   moveto(3.82,17.72);
   lineto(3.82,18,6.33,18,6.33,17.72);
   stroke();

   /* draw plate and screws */
   moveto(2.88,18.0);
   lineto(7.33,18.0,7.33,18.76,2.88,18.76);
   closepath();
   stroke();
   gsave();
   translate(3.38,18.76);
   screw(1.5);
   translate(3.45,0);
   screw(1.5);
   grestore();

   /* draw heater */
   gsave();
   translate(7.0,13.03);
   heater();
   translate(-3.8,0);
   heater();
   grestore();

   /* draw slits */
   gsave();
   translate(21.8,11.0);
   slit();
   grestore();
   gsave();
   scale(1,-1);
   translate(21.8,-10.6);
   slit();
   grestore();

   /* draw periscope */
   moveto(22.82,10.45);
   lineto(23.57,11.18);
   rlineto(0,2, 0.75,0, 0,1.5, -2,0, 0,-1.5, 0.75,0, 0,-2, 0.5,0);
   stroke();

   /* draw arrows */
   moveto(25.66,14.07);
   arrowto(25.66,14.79);
   moveto(25.66,14.07);
   arrowto(25.66,13.35);
   stroke();

   /* draw screw drivers and light pipe */
   moveto(4.76,18.76);
   lineto(4.76,30.0);
   moveto(5.45,18.76);
   lineto(5.45,30.0);
   stroke();
   gsave();
   translate(3.38,18.9);
   driver();
   translate(3.45,0);
   driver();
   grestore();

   /* white out some of the lines at */
   /* the top that turned out too long */
   white_box(1.17,29.67,8.61,31.20);
   newpath();

   /* draw copper gasket */
   gsave();
   set(LINECOLOUR,GREEN);
   set(LINEWIDTH,0.10);
   moveto(4.57,13.7);
   lineto(5.57,13.7);
   stroke();
   grestore();

   /* draw dashed lines in diamond cell */
   set(LINESTYLE,0.5,0.25);
   moveto(3.82,17.72);
   lineto(3.82,12.60,6.33,12.60,6.33,17.72);
   moveto(3.82,14.8);
   lineto(6.33,14.8);
   moveto(4.76,14.8);
   lineto(4.76,18.76);
   moveto(5.45,14.8);
   lineto(5.45,18.76);
   moveto(4.76,12.6);
   lineto(4.38,11.72);
   moveto(5.45,12.6);
   lineto(5.83,11.72);
   stroke();

   /* draw the sapphire anvils */
   gsave();
   translate(4.32,12.6);
   anvil();
   translate(1.5,2.2);
   rotate(180);
   anvil();
   grestore();
   stroke();

   /* draw light paths */
   set(LINECOLOUR,MAGENTA);
   moveto(5.1,13.57);
   lineto(5.1,10.85,11.09,10.85,11.09,0.06);
   moveto(13.35,12.9);
   lineto(4.7,11.22,5.1,13.51,5.45,10.43,13.35,8.74);
   moveto(13.35,12.9);
   lineto(21.73,10.85,13.35,8.74);
   stroke();

   /* add comments */
   set(LINECOLOUR,BLACK);
   set(LINESTYLE,0);
   set(FONTWIDTH,1.0);
   text(2.33,32.29,"High Pressure, Low Temperature Spectroscopy");
   set(FONTWIDTH,0.6);
   text(3.57,4.58,"Liquid He");
   text(22.65,15.60,"CCD");
   text(19.81,7.39,"Spectrometer");
              text("   Slits");
   text(9.5,16.7,"Sapphire Anvil Cell");
   text(9.5,14,"Heater");
   text(9.5,23.88,"Light Pipe");
   text(9.5,27,"Screw Drivers");

   /* draw lines to labelled parts */
   set(LINEWIDTH,0.01);
   moveto(4.76,5.46);
   lineto(5.68,6.91);
   moveto(9.19,13.99);
   lineto(7.27,13.75);
   moveto(9.27,16.64);
   lineto(7.02,16.16);
   moveto(9.27,23.96);
   lineto(5.68,23.64);
   moveto(9.27,27.02);
   lineto(7.27,26.38);
   moveto(9.27,27.02);
   lineto(3.76,26.78);
   stroke();
   }
 
int anvil()
   {
   /* draw a sapphire anvil */
   newpath();
   moveto(0,0);
   rlineto(0,0.5,0.5,0.5,0.5,0,0.5,-0.5,0,-0.5);
   stroke();
   }
 
int screw(double len)
   {
   int i,j;
   /* draw a screw using a loop for */
   /* the threads */
   newpath();
   moveto(0,0);
   rlineto(0.25,0,0,0.25,-0.5,0,0,-0.25);
   closepath();
   moveto(0.15,0);
   rlineto(0,-len,-0.3,0,0,len);
   moveto(-0.15,0);
   j = (int) (len / 0.2);
   for (i=0;i < j;i++)
      {
      rmoveto(0.3,0);
      rlineto(-0.30,-0.20);
      }
   stroke();
   }
 
int heater()
   {
   int i;
   /* draw a heater using a loop */
   /* for the windings */
   double y = 0;
   newpath();
   moveto(0,0);
   for (i=0;i < 5;i++)
      {
      moveto(0.1,y);
      arcn(0,y,0.1,360,0);
      y = y + 0.4;
      }
   stroke();
   }

int slit()
   {
   /* draw a spectrometer slit */
   newpath();
   moveto(0,0);
   rlineto(0,1.5,0.25,0,0,-1.25);
   closepath();
   stroke();
   }

int driver()
   {
   /* draw long screw drivers */
   newpath();
   moveto(0,0);
   rlineto(0.15,0,0,0.25,0.1,0,0,10.8);
   moveto(0,0);
   rlineto(-0.15,0,0,0.25,-0.1,0,0,10.8);
   stroke();
   }

int white_box(double x1,double y1,double x2,double y2)
   { 
   /* draw a white filled box for */
   /* white out purposes. The parametrs */
   /* passed in are the box corners */
   newpath();
   box(x1,y1,x2,y2);
   gsave();
   set(LINECOLOUR,WHITE);
   fill();
   grestore();
   }

int lens()
   {
   /* draw a spherical lens using arcs */
   newpath();
   arcn(0,-4,4,110,70);
   arcn(0,3.45,4,290,250);
   closepath();
   stroke();
   }

int prism()
   {
   /* draw a prism */
   newpath();
   moveto(0,0.5);
   rlineto(0,-0.5,0.5,0);
   closepath();
   stroke();
   }

int tail()
   {
   /* draw the dewar tail */
   set(LINECOLOUR,BLACK);
   moveto(2.44,30);
   lineto(2.44,6.33,7.77,6.33,7.77,30);
   stroke();
   /* draw windows */
   set(LINECOLOUR,BROWN);
   white_box(2.29,12.30,2.59,9.41);
   stroke();
   white_box(7.62,12.30,7.92,9.41);
   stroke();
   }