home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Professional / OS2PRO194.ISO / os2 / graphic / irit / freeform.irt < prev    next >
Text File  |  1992-08-23  |  14KB  |  465 lines

  1. #
  2. # Some routines to test surface/curve operators
  3. #
  4.  
  5. #
  6. # Set display to on to view some results, off to view nothing.
  7. #
  8. display = on;
  9.  
  10. #
  11. # Control the surface to polygons subdivison resolution, and isolines gen.
  12. #
  13. save_res = resolution;
  14. resolution = 20;
  15. if ( machine, "=", msdos, (resolution = 5));
  16. drawctlpt = red;
  17.  
  18. s45 = sin( pi / 4 );
  19.  
  20. #  
  21. # Circular constructors
  22. #
  23.  
  24. circ = circle( vector( 0.25, 0.5, 0.5 ), 1.5 );
  25. arc1 = arc( vector( 0.0, 0.0, 0.0 ),
  26.         vector( 0.5, 2.0, 0.0 ),
  27.         vector( 1.0, 0.0, 0.0 ) );
  28. arc2 = arc( vector( 0.0, 0.0, 0.0 ),
  29.         vector( 0.0, 2.0, 0.5 ),
  30.         vector( 0.0, 0.0, 1.0 ) );
  31.  
  32. if ( display, "=", on, interact( list( axes, circ, arc1, arc2 ), 0 ) );
  33.  
  34. #
  35. # Piecewise linear approximation to a curve using ceval:
  36. #
  37. cb = ceval( circ, 0.0 );
  38. cb_all = list( cb );
  39. for ( (t = 0.2), 0.2, 4.0,
  40.     (
  41.        (cb = ceval( circ, t ) ):
  42.        snoc( cb, cb_all )
  43.     )
  44.     );
  45. cb_crv = cbspline( 2, cb_all, list( KV_OPEN ) );
  46. color( cb_crv, yellow );
  47. if ( display, "=", on, interact( list( cb_crv, circ, axes ), 0 ) );
  48. free( cb_crv ); free( cb_all ); free( cb );
  49.  
  50. #
  51. # Ruled surface constructor examples.
  52. #
  53. arc3 = arc( vector( 0.0,  0.0, 1.0 ),
  54.         vector( 0.5, -0.2, 1.0 ),
  55.         vector( 1.0,  0.0, 1.0 ) );
  56. ruled = ruledsrf( arc3,
  57.           ctlpt( E2, 0.0, 0.0 ) + ctlpt( E2, 1.0, 0.0 ) );
  58. if ( display, "=", on, interact( list( axes, ruled ), 0 ) );
  59. free( ruled );
  60.  
  61. circ = circle( vector( 0.0, 0.0, 0.0 ), 0.25 );
  62. cyl = ruledsrf( circ, circ*trans( vector( 0.0, 0.0, 1.0 ) ) );
  63. if ( display, "=", on, interact( list( axes, cyl ), 0 ) );
  64. free( cyl );
  65.  
  66. skewcyl = ruledsrf( circ, circ*trans( vector( 0.2, 0.0, 1.0 ) ) );
  67. if ( display, "=", on, interact( list( axes, skewcyl ), 0 ) );
  68. free( skewcyl );
  69.  
  70. skew2cyl = ruledsrf( circ*rotx( 20 ),
  71.              circ*rotx( -20 )* trans( vector( 0.0, 0.0, 1.0 ) ) );
  72. if ( display, "=", on, interact( list( axes, skew2cyl ), 0 ) );
  73. free( skew2cyl );
  74.  
  75. drawctlpt = 0;
  76. free( arc1 ); free( arc2 ); free( arc3 ); free( circ );
  77.  
  78. #
  79. # Curve constructors.
  80. #
  81. crv1 = ctlpt( E3, 0.5, 0.0, 1.0 ) +
  82.        ctlpt( E3, 0.5, 0.0, 1.2 ) +
  83.        ctlpt( E3, 1.0, 0.0, 1.2 );
  84. crv2 = crv1 +
  85.        arc( vector( 1.0,  0.0, 0.75 ),
  86.         vector( 0.75, 0.0, 0.7 ),
  87.         vector( 0.5,  0.0, 0.85 ) ) +
  88.        arc( vector( 0.5,  0.0, 0.75 ),
  89.         vector( 0.75, 0.0, 0.8 ),
  90.         vector( 1.0,  0.0, 0.65 ) );
  91. crv3 = crv2 +
  92.        crv2 * trans( vector( -0.5, 0.15, -0.5 ) ) +
  93.        crv2 * trans( vector( -1.0, 0.3,  -1.0 ) );
  94. resolution = 60;
  95. if ( display, "=", on, interact( list( axes, crv3 ), 0 ) );
  96. resolution = 20;
  97. if ( machine, "=", msdos, (resolution = 5));
  98. free( crv1 ); free( crv2 ); free( crv3 );
  99.  
  100. cross = arc( vector( 0.2, 0.0, 0.0 ),
  101.          vector( 0.2, 0.2, 0.0 ),
  102.          vector( 0.0, 0.2, 0.0 ) ) +
  103.     arc( vector( 0.0, 0.4, 0.0 ),
  104.          vector( 0.1, 0.4, 0.0 ),
  105.          vector( 0.1, 0.5, 0.0 ) ) +
  106.     arc( vector( 0.8, 0.5, 0.0 ),
  107.          vector( 0.8, 0.3, 0.0 ),
  108.          vector( 1.0, 0.3, 0.0 ) ) +
  109.     arc( vector( 1.0, 0.1, 0.0 ),
  110.          vector( 0.9, 0.1, 0.0 ),
  111.          vector( 0.9, 0.0, 0.0 ) ) +
  112.     ctlpt( E2, 0.2, 0.0 );
  113. if ( display, "=", on, interact( list( axes, cross ), 0 ) );
  114.  
  115. #
  116. # Curves and surfaces convertions and compatibility.
  117. #
  118. crv1 = cbezier( list( ctlpt( E2, -1, 0 ),
  119.               ctlpt( E2,  0, 2 ),
  120.               ctlpt( E2,  1, 0 ) ) );
  121. crv2 = cbspline( 4,
  122.          list( ctlpt( P3,  1.0,  0.0, 0.1,  1.0 ),
  123.                ctlpt( P3,  s45, -s45, 1.0,  s45 ),
  124.                ctlpt( P3,  1.0,  1.0, 0.1,  0.0 ),
  125.                ctlpt( P3,  s45, -s45, 1.0, -s45 ),
  126.                ctlpt( P3,  1.0,  0.0, 0.1, -1.0 ) ),
  127.          list( KV_OPEN ) );
  128. color( crv1, yellow );
  129. color( crv2, yellow );
  130.  
  131. crv1bsp = bzr2bsp( crv1 );
  132. color( crv1bsp, green );
  133. crv2bzr = bsp2bzr( crv2 );
  134. color( crv2bzr, green );
  135. interact( list( crv1bsp, crv1, crv2bzr, crv2 ), 0 );
  136. free( crv1bsp );
  137. free( crv2bzr );
  138.  
  139. interact( list( crv1, crv2 ), 0 );
  140. ffcompat( crv1, crv2 );
  141. interact( list( crv1, crv2 ), 0 );
  142.  
  143. srf1 = sbezier( list( list( ctlpt( E2, 0.0, 0.0 ),
  144.                     ctlpt( E2, 0.0, 1.0 ),
  145.                     ctlpt( E2, 0.0, 2.0 ) ),
  146.                   list( ctlpt( E2, 1.0, 0.0 ),
  147.                     ctlpt( E2, 1.0, 1.0 ),
  148.                     ctlpt( E2, 1.0, 2.0 ) ) ) );
  149. srf2 = sbspline( 2, 4,
  150.          list( list( ctlpt( E3, 0.0, 0.0, 1.0 ),
  151.                      ctlpt( E3, 0.0, 1.0, 0.0 ),
  152.                      ctlpt( E3, 0.0, 2.0, 1.0 ) ),
  153.                    list( ctlpt( E3, 1.0, 0.0, 0.0 ),
  154.                      ctlpt( E3, 1.0, 1.0, 2.0 ),
  155.                      ctlpt( E3, 1.0, 2.0, 0.0 ) ),
  156.                    list( ctlpt( E3, 2.0, 0.0, 2.0 ),
  157.                      ctlpt( E3, 2.0, 1.0, 0.0 ),
  158.                      ctlpt( E3, 2.0, 2.0, 2.0 ) ),
  159.                    list( ctlpt( E3, 3.0, 0.0, 0.0 ),
  160.                      ctlpt( E3, 3.0, 1.0, 2.0 ),
  161.                      ctlpt( E3, 3.0, 2.0, 0.0 ) ),
  162.                    list( ctlpt( E3, 4.0, 0.0, 1.0 ),
  163.                      ctlpt( E3, 4.0, 1.0, 0.0 ),
  164.                      ctlpt( E3, 4.0, 2.0, 1.0 ) ) ),
  165.          list( list( KV_OPEN ),
  166.                list( KV_OPEN ) ) );
  167. color( srf1, yellow );
  168. color( srf2, yellow );
  169.  
  170. srf1bsp = bzr2bsp( srf1 );
  171. color( srf1bsp, green );
  172. srf2bzr = bsp2bzr( srf2 );
  173. color( srf2bzr, green );
  174. interact( list( srf1bsp, srf1, srf2bzr, srf2 ), 0 );
  175. free( srf1bsp );
  176. free( srf2bzr );
  177.  
  178. interact( list( srf1, srf2 ), 0 );
  179. ffcompat( srf1, srf2 );
  180. interact( list( srf1, srf2 ), 0 );
  181.  
  182. #
  183. # Direct control points manipulation.
  184. #
  185. cb = cbezier( list( ctlpt( E3, -1, 0, 0 ),
  186.             ctlpt( E3,  0, 0, 0 ),
  187.             ctlpt( E3,  1, 0, 0 ) ) );
  188.  
  189. cb1 = 0; # Define a dummy variable to use in loop.
  190. cb_all = list( axes );
  191. for ( (z = -0.9), 0.3, 0.9,
  192.     (
  193.        (cb1 = ceditpt( cb, ctlpt( E3, 0, 0, z ), 1 )):
  194.        color( cb1, green ):
  195.        snoc( cb1, cb_all )
  196.     )
  197.     );
  198. if ( display, "=", on, interact( cb_all, 0 ) );
  199. free( cb_all ); free( cb ); free( cb1 );
  200.  
  201.  
  202. sb = ruledSrf( cbezier( list( ctlpt( E3, -0.5, -0.5, 0.0 ),
  203.                   ctlpt( E3,  0.5, -0.5, 0.0 ) ) ),
  204.            cbezier( list( ctlpt( E3, -0.5,  0.5, 0.0 ),
  205.                   ctlpt( E3,  0.5,  0.5, 0.0 ) ) ) );
  206. sb = sraise( sraise( sb, row, 3 ),
  207.          col, 3 );
  208. sb = srefine( srefine( sb, row, false, list( 0.333, 0.667 ) ),
  209.           col, false, list( 0.333, 0.667 ) );
  210. sb1 = 0; # Define a dummy variable to use in loop.
  211. sb_all = list( axes );
  212. for ( (z = -0.9), 0.6, 0.9,
  213.     (
  214.        (sb1 = seditpt( sb, ctlpt( E3, 0, 0, z ), 2, 2 )):
  215.        color( sb1, green ):
  216.        snoc( sb1, sb_all )
  217.     )
  218.     );
  219. if ( display, "=", on, interact( sb_all, 0 ) );
  220. free( sb_all ); free( sb ); free( sb1 );
  221.  
  222. #
  223. # Curve order raise:
  224. #
  225. cb = cbezier( list( ctlpt( E2, -1, 0 ),
  226.             ctlpt( E2,  0, 2 ),
  227.             ctlpt( E2,  1, 0 ) ) );
  228.  
  229. cb1 = 0; # Define a dummy variable to use in loop.
  230. cb_all = list( axes, cb );
  231. for ( (o = 4), 1, 8,
  232.     (
  233.        (cb1 = craise( cb, o )):
  234.        color( cb1, green ):
  235.        snoc( cb1, cb_all )
  236.     )
  237.     );
  238. if ( display, "=", on, interact( cb_all, 0 ) );
  239. free( cb_all ); free( cb ); free( cb1 );
  240.  
  241. #
  242. # Extrusion examples.
  243. #
  244. cbzr = cbezier( list( ctlpt( E2, 0.0, 0.0 ),
  245.               ctlpt( E2, 1.0, 0.0 ),
  246.               ctlpt( E2, 1.0, 1.0 ) ) );
  247. color( cbzr, white );
  248.  
  249. s = extrude( cbzr, vector( 0.0, 0.0, 1.0 ) );
  250.  
  251. if ( display, "=", on, interact( list( axes, s, cbzr ), 0 ) );
  252. free( cbzr ); free( s );
  253.  
  254. s = extrude( cross, vector( 0.0, 0.0, 1.0 ) );
  255. if ( display, "=", on, interact( list( axes, s ), 0 ) );
  256.  
  257. s = extrude( cross, vector( 0.1, 0.2, 1.0 ) );
  258. if ( display, "=", on, interact( list( axes, s ), 0 ) );
  259.  
  260. resolution = 10;
  261. ps = gpolygon( s );
  262. if ( display, "=", on, interact( list( axes, ps ), 0 ) );
  263. free( ps );
  264. free( s );
  265. resolution = 20;
  266. if ( machine, "=", msdos, (resolution = 5));
  267.  
  268. #
  269. # Srf of revolution examples
  270. #
  271.  
  272. cbzr = cbezier( list( ctlpt( E3, 0.0, 0.0, 0.0 ),
  273.               ctlpt( E3, 1.0, 0.0, 0.0 ),
  274.               ctlpt( E3, 1.0, 0.0, 1.0 ) ) );
  275. color( cbzr, white );
  276.  
  277. sb = surfrev( cbzr );
  278.  
  279. interact( list( sb, cbzr ), 0 );
  280.  
  281. halfcirc = cbspline( 3,
  282.              list( ctlpt( P3, 1.0,  0.0, 0.0,  1.0 ),
  283.                    ctlpt( P3, s45, -s45, 0.0,  s45 ),
  284.                    ctlpt( P3, 1.0, -1.0, 0.0,  0.0 ),
  285.                    ctlpt( P3, s45, -s45, 0.0, -s45 ),
  286.                ctlpt( P3, 1.0,  0.0, 0.0, -1.0 ) ),
  287.              list( 0, 0, 0, 1, 1, 2, 2, 2 ) );
  288. color( halfcirc, white );
  289.  
  290. sp = surfrev( halfcirc );
  291.  
  292. interact( list( sp, halfcirc ), 0 );
  293.  
  294. gcross = cbspline( 3,
  295.            list( ctlpt( E3, 0.3, 0.0, 0.0 ),
  296.                  ctlpt( E3, 0.3, 0.0, 0.05 ),
  297.                  ctlpt( E3, 0.1, 0.0, 0.05 ),
  298.                  ctlpt( E3, 0.1, 0.0, 0.4 ),
  299.                  ctlpt( E3, 0.5, 0.0, 0.4 ),
  300.                  ctlpt( E3, 0.6, 0.0, 0.8 ) ),
  301.            list( 0, 0, 0, 1, 2, 3, 4, 4, 4 ) );
  302. color( gcross, white );
  303. glass = surfrev( gcross );
  304. interact(list(axes, glass, gcross), 0);
  305.  
  306. #
  307. # Sweep examples.
  308. #
  309.  
  310. arc1 = arc( vector( 1.0, 0.0, 0.0 ),
  311.         vector( 0.0, 0.0, 0.0 ),
  312.         vector( 0.0, 1.0, 0.0 ) );
  313. s = sweepsrf( cross, arc1,  0.2 );
  314. if ( display, "=", on, interact( list( axes, s ), 0 ) );
  315.  
  316. arc1 = arc( vector( -1.0, 0.0, 0.0 ),
  317.         vector( 0.0, 0.0, 0.1 ),
  318.         vector( 1.0, 0.0, 0.0 ) );
  319. arc1 = crefine( arc1, false, list( 0.25, 0.5, 0.75 ) );
  320. scalecrv = cbezier( list( ctlpt( E2, 0.0, 0.1 ),
  321.                          ctlpt( E2, 1.0, 0.5 ),
  322.                          ctlpt( E2, 2.0, 0.1 ) ) );
  323. s = sweepsrf( cross, arc1, scalecrv );
  324. if ( display, "=", on, interact( list( axes, s ), 0 ) );
  325.  
  326. circ = circle( vector( 0.0, 0.0, 0.0 ), 1.0 );
  327.  
  328. s = sweepsrf( circ, circ, 0.25 );
  329. if ( display, "=", on, interact( list( axes, s ), 0 ) );
  330.  
  331. resolution = 10;
  332. ps = gpolygon( s );
  333. if ( display, "=", on, interact( list( axes, ps ), 0 ) );
  334. free( ps );
  335. resolution = 20;
  336. if ( machine, "=", msdos, (resolution = 5));
  337.  
  338. s = sweepsrf( circ, circ, scalecrv );
  339. if ( display, "=", on, interact( list( axes, s ), 0 ) );
  340.  
  341. free( cross );
  342. free( circ );
  343. free( arc1 );
  344.  
  345. #
  346. # Boolean sum examples.
  347. #
  348. cbzr1 = cbezier( list( ctlpt( E3, -0.2,  0.1,  0.5 ),
  349.                ctlpt( E3,  0.0,  0.5,  1.0 ),
  350.                ctlpt( E3,  0.1,  1.0, -0.2 ) ) );
  351. cbzr2 = cbezier( list( ctlpt( E3,  1.0,  0.0, -0.3 ),
  352.                ctlpt( E3,  0.8,  0.5, -1.0 ),
  353.                ctlpt( E3,  1.0,  1.0,  0.2 ) ) );
  354. cbzr3 = cbezier( list( ctlpt( E3, -0.2,  0.1,  0.5 ),
  355.                ctlpt( E3,  0.5,  0.0, -1.0 ),
  356.                ctlpt( E3,  1.0,  0.0, -0.3 ) ) );
  357. cbzr4 = cbezier( list( ctlpt( E3,  0.1,  1.0, -0.2 ),
  358.                ctlpt( E3,  0.5,  1.0,  1.0 ),
  359.                ctlpt( E3,  1.0,  1.0,  0.2 ) ) );
  360.  
  361. s = boolsum( cbzr1, cbzr2, cbzr3, cbzr4 );
  362. color(s, green);
  363. if ( display, "=", on, interact( list( axes, s, cbzr1, cbzr2, cbzr3, cbzr4 ), 0 ) );
  364.  
  365. cbzr1 = cbezier( list( ctlpt( E3, -0.1,  0.1,  0.2 ),
  366.                ctlpt( E3,  0.0,  0.5,  1.0 ),
  367.                ctlpt( E3,  0.1,  1.0,  0.2 ) ) );
  368. cbzr2 = cbezier( list( ctlpt( E3,  1.0,  0.2, -0.1 ),
  369.                ctlpt( E3,  1.0,  0.5, -1.0 ),
  370.                ctlpt( E3,  1.1,  1.1,  0.1 ) ) );
  371. cbzr3 = cbezier( list( ctlpt( E3, -0.1,  0.1,  0.2 ),
  372.                ctlpt( E3,  0.2,  0.1, -1.0 ),
  373.                ctlpt( E3,  0.4,  0.0,  2.0 ),
  374.                ctlpt( E3,  0.5, -0.1, -1.0 ),
  375.                ctlpt( E3,  1.0,  0.2, -0.1 ) ) );
  376. cbzr4 = cbezier( list( ctlpt( E3,  0.1,  1.0,  0.2 ),
  377.                ctlpt( E3,  0.5,  0.8,  1.0 ),
  378.                ctlpt( E3,  0.7,  0.9, -2.0 ),
  379.                ctlpt( E3,  0.8,  1.0,  1.0 ),
  380.                ctlpt( E3,  1.1,  1.1,  0.1 ) ) );
  381. s = boolsum( cbzr1, cbzr2, cbzr3, cbzr4 );
  382. color(s, green);
  383. if ( display, "=", on, interact( list( axes, s, cbzr1, cbzr2, cbzr3, cbzr4 ), 0 ) );
  384.  
  385. cbzr1 = cbezier( list( ctlpt( E3, 0.1, 0.1, 0.1 ),
  386.                ctlpt( E3, 0.0, 0.5, 1.0 ),
  387.                ctlpt( E3, 0.4, 1.0, 0.4 ) ) );
  388. cbzr2 = cbezier( list( ctlpt( E3, 1.0, 0.2, 0.2 ),
  389.                ctlpt( E3, 1.0, 0.5, -1.0 ),
  390.                ctlpt( E3, 1.0, 1.0, 0.3 ) ) );
  391. cbsp3 = cbspline( 4,
  392.           list( ctlpt( E3, 0.1,  0.1, 0.1 ),
  393.                 ctlpt( E3, 0.25, 0.0, -1.0 ),
  394.                 ctlpt( E3, 0.5,  0.0, 2.0 ),
  395.                 ctlpt( E3, 0.75, 0.0, -1.0 ),
  396.                 ctlpt( E3, 1.0,  0.2, 0.2 ) ),
  397.           list( KV_OPEN ) );
  398. cbsp4 = cbspline( 4,
  399.           list( ctlpt( E3, 0.4,  1.0, 0.4 ),
  400.                 ctlpt( E3, 0.25, 1.0, 1.0 ),
  401.                 ctlpt( E3, 0.5,  1.0, -2.0 ),
  402.                 ctlpt( E3, 0.75, 1.0, 1.0 ),
  403.                 ctlpt( E3, 1.0,  1.0, 0.3 ) ),
  404.           list( KV_OPEN ) );
  405.  
  406. s = boolsum( cbzr1, cbzr2, cbsp3, cbsp4 );
  407. color(s, green);
  408. if ( display, "=", on, interact( list( axes, s, cbzr1, cbzr2, cbsp3, cbsp4 ), 0 ) );
  409.  
  410. free( cbzr1 ); free( cbzr2 ); free( cbzr3 ); free( cbzr4 );
  411. free( cbsp1 ); free( cbsp2 );
  412.  
  413. #
  414. # Boolean one examples.
  415. #
  416. s = boolone( circle( vector( 0.0, 0.0, 0.0 ), 1.0 ) );
  417. color(s, green);
  418. if ( display, "=", on, interact( list( axes, s ), 0 ) );
  419.  
  420. c1 = ctlpt( E3, 0, 0, 0.5 ) +
  421.      ctlpt( E3, 1, 0, 0 ) +
  422.      ctlpt( E3, 1, 1, 0.5 ) +
  423.      ctlpt( E3, 0, 1, 0 ) +
  424.      ctlpt( E3, 0, 0, 0.5 );
  425. s = boolone( c1 );
  426. color(s, green);
  427. if ( display, "=", on, interact( list( axes, s, c1 ), 0 ) );
  428.  
  429. #
  430. # Surface from curves constructor.
  431. #
  432.  
  433. c1 = cbspline( 3,
  434.            list( ctlpt( E3, 0.0, 0.0, 0.0 ),
  435.              ctlpt( E3, 1.0, 0.0, 0.0 ),
  436.              ctlpt( E3, 1.0, 1.0, 0.0 ) ),
  437.            list( KV_OPEN ) );
  438. c2 = cbspline( 3,
  439.            list( ctlpt( E3, 0.0, 0.0, 1.0 ),
  440.              ctlpt( E3, 1.0, 0.0, 1.0 ),
  441.              ctlpt( E3, 1.0, 2.0, 1.0 ) ),
  442.            list( KV_OPEN ) );
  443. c3 = cbspline( 3,
  444.            list( ctlpt( E3, 0.0, 0.0, 1.5 ),
  445.              ctlpt( E3, 2.0, 0.0, 1.5 ),
  446.              ctlpt( E3, 1.0, 0.5, 1.5 ),
  447.              ctlpt( E3, 1.0, 1.0, 1.5 ) ),
  448.            list( KV_OPEN ) );
  449. c4 = cbspline( 3,
  450.            list( ctlpt( E3, 0.0, 0.0, 2.5 ),
  451.              ctlpt( E3, 1.0, 0.0, 2.5 ),
  452.              ctlpt( E3, 1.0, 1.0, 2.5 ) ),
  453.            list( KV_OPEN ) );
  454.  
  455. s = sfromcrvs( list( c1, c2, c3, c4 ) );
  456. color( s, green );
  457. interact( list( s, c1, c2, c3, c4 ), 0 );
  458. free( c1 ); free( c2 ); free( c3 ); free( c4 );
  459.  
  460. display = off;
  461.  
  462. resolution = save_res;
  463. drawctlpt = 0;
  464.  
  465.