home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume6 / liss < prev    next >
Internet Message Format  |  1989-02-03  |  6KB

  1. Path: xanth!nic.MR.NET!csd4.milw.wisc.edu!leah!itsgw!steinmetz!uunet!allbery
  2. From: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  3. Newsgroups: comp.sources.misc
  4. Subject: v06i014: liss - draw Lissajous figures on a Sun
  5. Message-ID: <47746@uunet.UU.NET>
  6. Date: 29 Jan 89 20:24:15 GMT
  7. Sender: allbery@uunet.UU.NET
  8. Reply-To: jeff@ddsw1.UUCP (Jeff Haferman)
  9. Distribution: na
  10. Organization: ddsw1.MCS.COM, Mundelein, IL
  11. Lines: 207
  12. Approved: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  13.  
  14. Posting-number: Volume 6, Issue 14
  15. Submitted-by: jeff@ddsw1.MCS.COM (Jeff Haferman)
  16. Archive-name: liss
  17.  
  18. [I had to "shar" this.  ++bsa]
  19.  
  20. The following program is something I adapted from an APL program
  21. used as an example by the Professor of a Graphics course I took
  22. last year.  I put it together to begin experimenting with Sunview
  23. programming, so this is a first for me.  There are a couple of 
  24. sloppy things, but as far as I can tell, it should work on all
  25. Suns, though I've only tested it on a 3/50.  Also, it should be
  26. easy to port to any machine (I know a Macintosh port would be 
  27. simple.)
  28.  
  29. Anyway, this is a starting point for me to get more into Sun
  30. programming.  Enjoy.
  31.  
  32. ----------cut here---------cut here-----------cut here-----------cut here----
  33. #! /bin/sh
  34. # This file was wrapped with "dummyshar".  "sh" this file to extract.
  35. # Contents:  liss.c
  36. echo extracting 'liss.c'
  37. if test -f 'liss.c' -a -z "$1"; then echo Not overwriting 'liss.c'; else
  38. sed 's/^X//' << \EOF > 'liss.c'
  39. X/*********************************************************************/
  40. X/*                              liss                                 */
  41. X/*      Purpose : Visual entertainment on a Sun.  Displays a         */
  42. X/*                "Lissajous" figure, which is the connection        */
  43. X/*                of points { cos(2*PI*x*i/n), sin(2*PI*y*i/n) }     */
  44. X/*                for i=0,1,2,...,n and suitably chosen positive     */
  45. X/*                integers x,y, and n.  Must use SunView.            */
  46. X/*                                                                   */
  47. X/*      Org :  Jeff Haferman 12/27/88                                */
  48. X/*             jeff@ddsw1.mcs.com  or ...!oddjob!ddsw1.mcs.com!jeff  */
  49. X/*                                                                   */
  50. X/*      Compile:                                                     */
  51. X/*            cc liss.c -o liss -lsuntool -lsunwindow -lpixrect -lm  */
  52. X/*                                                                   */
  53. X/*      Sample:                                                      */
  54. X/*            liss 100 200 359                                       */
  55. X/*                                                                   */
  56. X/*********************************************************************/
  57. X
  58. X#include <suntool/sunview.h>
  59. X#include <suntool/canvas.h>
  60. X#include <stdio.h>
  61. X#include <math.h>
  62. X
  63. X#define X 1
  64. X#define Y 2
  65. X#define TRUE 1
  66. X#define FALSE 0
  67. X#define MAT(a) ((float *) a)
  68. X
  69. Xchar *progname;
  70. X
  71. Xmain (argc, argv)
  72. Xchar **argv;
  73. Xint argc;
  74. X{
  75. X    Frame frame;
  76. X    Canvas canvas;
  77. X    Pixwin *pw;
  78. X    int x,y,n,i;
  79. X    int plotx, ploty, plotx_last, ploty_last;
  80. X    double dblx, dbly;
  81. X    int first_pass=TRUE;
  82. X    int width, height;
  83. X    static float r2sun[3][3];
  84. X    float *plot, *transform();
  85. X
  86. X    progname=argv[0];
  87. X    if ( argc != 4 )
  88. X        usage();
  89. X
  90. X    x= char2num(argv[1]);
  91. X    y= char2num(argv[2]);
  92. X    n= char2num(argv[3]);
  93. X
  94. X    frame = window_create(NULL, FRAME, 0);
  95. X    canvas = window_create(frame, CANVAS,
  96. X        CANVAS_FIXED_IMAGE, FALSE,
  97. X        0);
  98. X    pw= canvas_pixwin(canvas);
  99. X
  100. X    width = ((int) window_get(canvas, CANVAS_WIDTH))-1;
  101. X    height = ((int) window_get(canvas, CANVAS_HEIGHT))-1;
  102. X    get_transform(width,height,r2sun);
  103. X
  104. X    for (i=0; i<=n; i++) {
  105. X        plotx_last = plotx; 
  106. X        ploty_last = ploty; 
  107. X        dblx = cos ((double)(2*M_PI*x*((float)i/(float)n)));
  108. X          dbly = sin ((double)(2*M_PI*y*((float)i/(float)n)));
  109. X          plot = transform((float)dblx,(float)dbly,r2sun);
  110. X          plotx = (int) plot[X-1];
  111. X          ploty = (int) plot[Y-1];
  112. X        if (!first_pass) 
  113. X            pw_vector(pw,plotx_last,ploty_last,plotx,ploty,PIX_SRC,1);
  114. X        else 
  115. X            first_pass=FALSE;
  116. X    }
  117. X    
  118. X    window_main_loop(frame);
  119. X    exit(0);
  120. X}
  121. X
  122. X
  123. Xget_transform(w,h,tranmat)
  124. X    int w,h;
  125. X    float *tranmat;
  126. X{
  127. Xint i,j;
  128. X    float w0,w1,h0,h1;    
  129. X    static float a[3][3]= { {-1,0,1},
  130. X                             {-1,1,0},
  131. X                             {1,0,0}};
  132. X    static float b[3][3]= { {0,0,1},
  133. X                             {0,0,1},
  134. X                             {0,0,1}};
  135. X    w0=(float)w;
  136. X    w1=w0/2;
  137. X    h0=(float)h;
  138. X    h1=h0/2;
  139. X    
  140. X    b[0][0]=w1;
  141. X    b[0][1]=h1;
  142. X    b[1][0]=w1;
  143. X    b[2][0]=w0;
  144. X    b[2][1]=h1;
  145. X
  146. X    m_mult(a,b,tranmat,3,3,3);
  147. X}
  148. X
  149. X
  150. Xfloat
  151. X*transform(x,y,tranmat)
  152. X    float x,y,*tranmat;
  153. X{
  154. Xint j;
  155. X    static float a[3]={0,0,1};
  156. X    float b[3];
  157. X
  158. X    a[0]=x;
  159. X    a[1]=y;
  160. X    m_mult(a,tranmat,b,1,3,3);
  161. X
  162. X    return(b);
  163. X}
  164. X
  165. X
  166. X/*------------------------------------------------------------*/
  167. X/*                                                            */
  168. X/*   m_mult(A,B,C,m,n,p)                                      */
  169. X/*          A is  an (m x n) matrix of floats                 */
  170. X/*          B is  an (n x p) matrix of floats                 */
  171. X/*          C is  an (m x p) matrix of floats                 */
  172. X/*                                                            */
  173. X/*    A and B must be set before the call.  C is then set     */
  174. X/*    here as the product of A and B.  No checking is done    */
  175. X/*    here on the dimensions of A and B.                      */
  176. X/*                                                            */
  177. X/*------------------------------------------------------------*/
  178. X
  179. Xm_mult(A,B,C,m,n,p)
  180. X    float **A, **B, **C;
  181. X    int    m, n, p;
  182. X
  183. X/* for a good explantion on passing arbitrary sized matrices
  184. X   to functions, see pp. 119-121 in C++                       */
  185. X
  186. X{
  187. X    int i, j, k;
  188. X
  189. X    for(i=0; i<=m-1; i++)
  190. X        for(j=0; j<=p-1; j++) {
  191. X            MAT(C)[i*p+j]=0;
  192. X            for(k=0; k<=n-1; k++)    
  193. X                MAT(C)[i*p+j]+= ( MAT(A)[i*n+k] * MAT(B)[k*p+j] );
  194. X        }
  195. X}
  196. X
  197. Xchar2num(c)
  198. X    char *c;
  199. X{
  200. X    int i;
  201. X
  202. X    for (i = 0; *c >= '0' && *c <= '9'; c++)
  203. X        i *= 10, i += *c - '0';
  204. X    if (*c) 
  205. X        usage();
  206. X    return (i);
  207. X}
  208. X
  209. X
  210. Xusage()
  211. X{
  212. X    fprintf(stderr, "usage: %s \<x\> \<y\> \<n\>\n", progname);
  213. X    fprintf(stderr, "       where x, y, and n are positive integers.");
  214. X    exit(1);
  215. X}
  216. EOF
  217. chars=`wc -c < 'liss.c'`
  218. if test $chars !=     4785; then echo 'liss.c' is $chars characters, should be     4785 characters!; fi
  219. fi
  220. exit 0
  221.