home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / x / volume8 / xmntns / part01 / xmntn.c < prev    next >
C/C++ Source or Header  |  1990-06-26  |  6KB  |  180 lines

  1. /*****************************************************************************
  2. /* FILE        : xmntn.c
  3. /* AUTHOR    : Paul Sharpe @ DEC (OSCR-Europe, Reading, England).
  4. /* DATE        : July 20, 1989
  5. /* FUNCTION    : X-windows Fractal Brownian-Motion mountains.
  6. /* INSPIRATION    : 'The Science Of Fractal Images.'
  7. /*
  8. /*   Copyright (c) Digital Equipment Corporation 1990  All rights reserved.
  9. /*   Copyright is claimed in the computer program and user interface thereof.
  10. /*
  11. /*   Digital Equipment Corporation cannot accept any responsibility for
  12. /*   use, misuse, or abuse of this software.
  13. /*
  14. /*****************************************************************************/
  15.  
  16. #include <stdio.h>
  17. #include <math.h>
  18.  
  19. #include <X11/Xlib.h>
  20. #include <X11/Xatom.h>
  21. #include <X11/Xutil.h>
  22.  
  23. #include "xpt.h"
  24. #include "xmntn.h"
  25.  
  26. main(argc,argv)
  27. int    argc;
  28. char    *argv[];
  29. {
  30.     xpt_getargs(args,NUMARGS,argc,argv);
  31.     init();
  32.     gen_mntndata(mntndata.elevs,square, (double)(yscale*square - 5));
  33.     elevs2coords();
  34.     process_events();            /* Main event-processing loop. */
  35. }
  36.  
  37. init()
  38. {
  39.     init_cmn();
  40.     if ((xscale = atoi(ARGS(13))) < 1)
  41.         xscale = 1;
  42.     if ((yscale = atoi(ARGS(14))) < 1)
  43.         yscale = 1;
  44.     screenwidth  = square*(xscale*2)+(XOFFSET*3);
  45.     screenheight = square*yscale*3;
  46.     basey = yscale*3*square;
  47.     init_X();
  48. }
  49.  
  50. elevs2coords()
  51. {
  52. register int    i,j, x,y, rowy;
  53.  
  54.     DEBUG(("Converting elevations to Y-coordinates..."));
  55.  
  56. /* To speed up, convert elevations for those points having the same Y-pixel
  57.  * coordinate: i.e. those points on the diagonals.
  58.  */
  59.     for (i=0; i<square; i++) {
  60.     rowy = PIXELY(i,0) - HEIGHT;
  61.     for (j=0; j<=i; j++) {
  62.         x = i - j;
  63.         y = j;
  64.         mntndata.px[x][y] = PIXELX(x,y);
  65.         mntndata.py[x][y] = rowy - ((mntndata.elevs[x][y] <= (double)0.0)? 0:(int)floor(mntndata.elevs[x][y]));
  66.     }
  67.     }
  68.     for (i=1; i<square; i++) {
  69.     rowy = PIXELY(square-1,i) - HEIGHT;
  70.     for (j=square-1; j>=i; j--) {
  71.         x = j;
  72.         y = i + square - j - 1;
  73.         mntndata.px[x][y] = PIXELX(x,y);
  74.         mntndata.py[x][y] = rowy - ((mntndata.elevs[x][y] <= (double)0.0)? 0:(int)floor(mntndata.elevs[x][y]));
  75.     }
  76.     }
  77.     DEBUG(("DONE\n"));
  78. }
  79.  
  80. display()
  81. {
  82.     draw_grid();
  83.     draw_heights();
  84. }
  85.  
  86. draw_grid()
  87. {
  88. register int    i;
  89. static XPoint    pnts[6];
  90.  
  91. /* Colour the main grid ('the sea') polygon. */
  92.     PNTS(0, PIXELX(square-1,square-1),    PIXELY(square-1,square-1));
  93.     PNTS(1, PIXELX(square-1,0),        PIXELY(square-1,0));
  94.     PNTS(2, pnts[1].x,            pnts[1].y - HEIGHT);
  95.     PNTS(3, pnts[0].x,            PIXELY(0,0) - HEIGHT);
  96.     PNTS(4, PIXELX(0,square-1),        pnts[2].y);
  97.     PNTS(5, pnts[4].x,            pnts[1].y);
  98.     XFillPolygon(dsply,wndw,seagc,pnts,6,Nonconvex,CoordModeOrigin);
  99.     
  100.     for (i=0; i<square; i++) {
  101.     PNTS(0, PIXELX(square-1, i),    PIXELY(square-1, i));
  102.     PNTS(1, pnts[0].x,        pnts[0].y - HEIGHT);
  103.     PNTS(2, PIXELX(0, i),        PIXELY(0, i) - HEIGHT);
  104.     XDrawLines(dsply,wndw,maingc,pnts,3,CoordModeOrigin);
  105.  
  106.     PNTS(0, PIXELX(i, square-1),    PIXELY(i, square-1));
  107.     PNTS(1, pnts[0].x,        pnts[0].y - HEIGHT);
  108.     PNTS(2, PIXELX(i, 0),        PIXELY(i, 0) - HEIGHT);
  109.     XDrawLines(dsply,wndw,maingc,pnts,3,CoordModeOrigin);
  110.     }
  111.  
  112. /* Bottom two lines of the block. */
  113.     PNTS(0, PIXELX(0,square-1),        PIXELY(0,square-1));
  114.     PNTS(1, PIXELX(square-1,square-1),    PIXELY(square-1,square-1));
  115.     PNTS(2, PIXELX(square-1,0),        PIXELY(square-1,0));
  116.     XDrawLines(dsply,wndw,maingc,pnts,3,CoordModeOrigin);
  117. }
  118.  
  119. /******************************************************************************
  120.  * Fill the quadilateral faces along lines parallel to a far edge.
  121.  ******************************************************************************/
  122. draw_heights()
  123. {
  124. register int    x,y;
  125. static XPoint    pnts[4];
  126.  
  127.     for (x=0; x<square; x++)
  128.     for (y=0; y<square; y++)
  129.         if (x>0 && y>0)
  130.         if (mntndata.elevs[x][y] > 0   || mntndata.elevs[x-1][y] > 0 ||
  131.             mntndata.elevs[x][y-1] > 0 || mntndata.elevs[x-1][y-1] > 0){
  132.             PNTS(0, mntndata.px[x][y],    mntndata.py[x][y]);
  133.             PNTS(1, mntndata.px[x][y-1],  mntndata.py[x][y-1]);
  134.             PNTS(2, mntndata.px[x-1][y-1],mntndata.py[x-1][y-1]);
  135.             PNTS(3, mntndata.px[x-1][y],  mntndata.py[x-1][y]);
  136.             draw_face(pnts,mc);
  137.         }
  138. }
  139.  
  140. #ifdef NOTUSED
  141. /******************************************************************************
  142.  * Fill the quadilateral faces along diagonal lines (parallel to the viewer).
  143.  ******************************************************************************/
  144. heights_by_diagonal()
  145. {
  146. register int    x,y;
  147. static XPoint    pnts[5];
  148.  
  149. /* Top diagonal half of the complete square. */
  150.     for (i=0; i<square; i++) {
  151.     for (j=0; j<=i; j++) {
  152.         if ((x = i - j) > 0 && (y = j) > 0)
  153.         if (mntndata.elevs[x][y] > 0   || mntndata.elevs[x-1][y] > 0 ||
  154.             mntndata.elevs[x][y-1] > 0 || mntndata.elevs[x-1][y-1] > 0){
  155.             PNTS(0, mntndata.px[x][y],    mntndata.py[x][y]);
  156.             PNTS(1, mntndata.px[x-1][y],  mntndata.py[x-1][y]);
  157.             PNTS(2, mntndata.px[x-1][y-1],mntndata.py[x-1][y-1]);
  158.             PNTS(3, mntndata.px[x][y],  mntndata.py[x][y]);
  159.             draw_face(pnts,mc);
  160.         }
  161.     }
  162.     }
  163.  
  164. /* Bottom diagonal half of the complete square. */
  165.     for (i=1; i<square; i++) {
  166.     for (j=square-1; j>=i; j--) {
  167.         if ((x = j) > 0 && (y = i + square - j - 1) > 0)
  168.         if (mntndata.elevs[x][y] > 0   || mntndata.elevs[x-1][y] > 0 ||
  169.             mntndata.elevs[x][y-1] > 0 || mntndata.elevs[x-1][y-1] > 0){
  170.             PNTS(0, mntndata.px[x][y],    mntndata.py[x][y]);
  171.             PNTS(1, mntndata.px[x-1][y],  mntndata.py[x-1][y]);
  172.             PNTS(2, mntndata.px[x-1][y-1],mntndata.py[x-1][y-1]);
  173.             PNTS(3, mntndata.px[x][y],  mntndata.py[x][y]);
  174.             draw_face(pnts,mc);
  175.         }
  176.     }
  177.     }
  178. }
  179. #endif
  180.