home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Professional / OS2PRO194.ISO / os2 / graphic / irit / bspline.irt < prev    next >
Text File  |  1991-12-15  |  7KB  |  312 lines

  1. #
  2. # Some routines to test bspline curves/surfaces.
  3. #
  4.  
  5. #
  6. # Set display to on to view some results, off to view nothing.
  7. #
  8. display = on;
  9.  
  10. resolution = 10;
  11. if ( machine, "=", msdos, (resolution = 5));
  12.  
  13. s45 = sin( pi / 4 );
  14. cbsp = list( ctlpt( P2, 1.0, 1.0, 0.0 ),
  15.          ctlpt( P2, s45, s45, s45 ),
  16.          ctlpt( P2, 1.0, 0.0, 1.0 ) );
  17. sbsp = list ( list( ctlpt( E3, 0.0, 0.0, 1.0 ),
  18.                 ctlpt( E3, 0.0, 1.0, 0.0 ),
  19.                 ctlpt( E3, 0.0, 2.0, 1.0 ) ),
  20.               list( ctlpt( E3, 1.0, 0.0, 0.0 ),
  21.                 ctlpt( E3, 1.0, 1.0, 2.0 ),
  22.                 ctlpt( E3, 1.0, 2.0, 0.0 ) ),
  23.               list( ctlpt( E3, 2.0, 0.0, 2.0 ),
  24.                 ctlpt( E3, 2.0, 1.0, 0.0 ),
  25.                 ctlpt( E3, 2.0, 2.0, 2.0 ) ),
  26.               list( ctlpt( E3, 3.0, 0.0, 0.0 ),
  27.                 ctlpt( E3, 3.0, 1.0, 2.0 ),
  28.                 ctlpt( E3, 3.0, 2.0, 0.0 ) ),
  29.               list( ctlpt( E3, 4.0, 0.0, 1.0 ),
  30.                 ctlpt( E3, 4.0, 1.0, 0.0 ),
  31.                 ctlpt( E3, 4.0, 2.0, 1.0 ) ) );
  32.  
  33. cb = cbspline( 3, cbsp, list( 0, 0, 0, 1, 1, 1 ) );
  34. color( cb, red );
  35. sb = sbspline( 3, 3, sbsp, list( list( 1, 1, 1, 2, 2, 2 ),
  36.                  list( 3, 3, 3, 4, 5, 6, 6, 6 ) ) );
  37. color( sb, red );
  38.  
  39. drawctlpt = 0;
  40. if ( display, "=", on, interact( list( axes, cb, sb ), 0 ) );
  41. drawctlpt = blue;
  42. if ( display, "=", on, interact( list( axes, cb, sb ), 0 ) );
  43. drawctlpt = 0;
  44.  
  45. #
  46. # Curve refinement.
  47. #
  48. cb_ref = crefine( cb, false, list( 0.25, 0.5, 0.75 ) );
  49. color( cb_ref, yellow );
  50. if ( display, "=", on, interact( list( axes, cb, cb_ref ), 0 ) );
  51. free( cb_ref );
  52.  
  53. #
  54. # Knot substitution (One internal knot is moved from 0.1 to 0.9).
  55. #
  56. cb_ref = crefine( cb, false, list( 0.5 ) );
  57. cb_all = list( axes );
  58. cb1 = 0; # Define a dummy variable to use in loop.
  59. for ( (t = 0.1), 0.1, 0.9,
  60.     (
  61.        (cb1 = crefine( cb_ref, true, list( 0, 0, 0, t, 1, 1, 1 ) ) ):
  62.        color( cb1, green ):
  63.        snoc( cb1, cb_all )
  64.     )
  65.     );
  66. if ( display, "=", on, interact( cb_all, 0 ) );
  67. free( cb_all );
  68.  
  69. #
  70. # Curve subdivision.
  71. #
  72. cb_lst = cdivide( cb, 0.5 );
  73. cb1 = nth( cb_lst, 1 );
  74. color( cb1, green );
  75. cb2 = nth( cb_lst, 2 );
  76. color( cb2, yellow );
  77. free( cb_lst );
  78. if ( display, "=", on, interact( list( axes, cb, cb1, cb2 ), 0 ) );
  79. free( cb1 );
  80. free( cb2 );
  81.  
  82. #
  83. # Region from curve.
  84. #
  85. cbr1 = cregion( cb, 0.3, 0.6 );
  86. color( cbr1, yellow );
  87. cbr2 = cregion( cb, 0.5, 1.0 );
  88. color( cbr2, green );
  89. cbr3 = cregion( cb, 0.3, 0.0 );
  90. color( cbr3, blue );
  91. interact( list( cb, cbr1, cbr2, cbr3 ), 0 );
  92. free( cbr1 ); free( cbr2 ); free( cbr3 );
  93.  
  94. #
  95. # Surface subdivision.
  96. #
  97. sb_lst = sdivide( sb, COL, 1.4 );
  98. sb1 = nth( sb_lst, 1 );
  99. color( sb1, green );
  100. sb2 = nth( sb_lst, 2 );
  101. color( sb2, yellow );
  102. free( sb_lst );
  103. if ( display, "=", on, interact( list( axes, sb, sb1, sb2 ), 0 ) );
  104. free( sb1 );
  105. free( sb2 );
  106. sb_lst = sdivide( sb, ROW, 4.8 );
  107. sb1 = nth( sb_lst, 1 );
  108. color( sb1, green );
  109. sb2 = nth( sb_lst, 2 );
  110. color( sb2, yellow );
  111. free( sb_lst );
  112. if ( display, "=", on, interact( list( axes, sb, sb1, sb2 ), 0 ) );
  113. free( sb1 ); free( sb2 );
  114.  
  115. #
  116. # Region from surface.
  117. #
  118. sbr1 = sregion( sb, COL, 1.3, 1.6 );
  119. color( sbr1, yellow );
  120. sbr2 = sregion( sb, COL, 1.8, 2.0 );
  121. color( sbr2, green );
  122. sbr3 = sregion( sb, ROW, 4.0, 5.0 );
  123. color( sbr3, blue );
  124. interact( list( sb, sbr1, sbr2, sbr3 ), 0);
  125. free( sbr1 ); free( sbr2 ); free( sbr3 );
  126.  
  127. #
  128. # Iso curves extraction from surface.
  129. #
  130. cb_all = list( axes );
  131. snoc( sb, cb_all );
  132. cb1 = 0; # Define a dummy variable to use in loop.
  133. for ( (t = 1.1), 0.1, 1.9,
  134.     (
  135.        ( cb1 = csurface( sb, COL, t ) ):
  136.        color( cb1, green ):
  137.        snoc( cb1, cb_all )
  138.     )
  139.     );
  140. for ( (t = 3.1), 0.2, 5.9,
  141.     (
  142.        ( cb1 = csurface( sb, ROW, t ) ):
  143.        color( cb1, green ):
  144.        snoc( cb1, cb_all )
  145.     )
  146.     );
  147. if ( display, "=", on, interact( cb_all, 0 ) );
  148. free( cb_all );
  149.  
  150.  
  151. #
  152. # curves extraction from surface mesh. Note curves may be not on the surface.
  153. #
  154. cb_all = list( axes );
  155. snoc( sb, cb_all );
  156. cb1 = 0; # Define a dummy variable to use in loop.
  157. for ( (t = 0), 1, 2,
  158.     (
  159.        ( cb1 = cmesh( sb, COL, t ) ):
  160.        color( cb1, green ):
  161.        snoc( cb1, cb_all )
  162.     )
  163.     );
  164. for ( (t = 0), 1, 4,
  165.     (
  166.        ( cb1 = cmesh( sb, ROW, t ) ):
  167.        color( cb1, green ):
  168.        snoc( cb1, cb_all )
  169.     )
  170.     );
  171. drawctlpt = blue;
  172. if ( display, "=", on, interact( cb_all, 0 ) );
  173. drawctlpt = 0;
  174. free( cb_all );
  175.  
  176. #
  177. # convert into polygons/polylines (using default resolution).
  178. #
  179. dumplvl = 1;
  180. resolution;
  181.  
  182. p = gpolyline( list( sb, cb ) );
  183. if ( display, "=", on, interact( list( p, axes ), 0 ) );
  184.  
  185. p = gpolygon( sb );
  186. if ( display, "=", on, interact( list( p, axes ), 0 ) );
  187.  
  188. #
  189. # reverse surface ( flip normals ).
  190. #
  191. q = gpolygon( -sb );
  192. normal( on, 0.1, green );
  193. if ( display, "=", on, interact( list( p, q, axes ), 0 ) );
  194. normal( off, 0.1, green );
  195. free(p);
  196. free(q);
  197.  
  198. #
  199. # Offset approximation by translation of srf/crv in normal direction.
  200. #
  201. cbo = offset(cb, 0.1);
  202. if ( display, "=", on, interact( list( axes, cb, cbo ), 0 ) );
  203. free(cbo);
  204.  
  205. sbo = offset(sb, 0.2);
  206. if ( display, "=", on, interact( list( axes, sb, sbo ), 0 ) );
  207. free(sbo);
  208.  
  209. #
  210. # Surface and Curve evaluation.
  211. #
  212. v1 = ceval( cb, 0.0 );
  213. v2 = ceval( cb, 0.1 );
  214. v3 = ceval( cb, 0.3 );
  215. v4 = ceval( cb, 0.5 );
  216. v5 = ceval( cb, 0.9 );
  217. v6 = ceval( cb, 1.0 );
  218. v1;
  219. v2;
  220. v3;
  221. v4;
  222. v5;
  223. v6;
  224.  
  225. v7 = ceval( cb, -0.3 );
  226.  
  227. pause(1);
  228.  
  229. w1 = seval( sb, 1.0, 3.0 );
  230. w2 = seval( sb, 1.1, 3.0 );
  231. w3 = seval( sb, 1.3, 3.0 );
  232. w4 = seval( sb, 1.5, 3.5 );
  233. w5 = seval( sb, 1.9, 3.1 );
  234. w6 = seval( sb, 1.0, 4.0 );
  235. w7 = seval( sb, 1.5, 4.0 );
  236. w1;
  237. w2;
  238. w3;
  239. w4;
  240. w5;
  241. w6;
  242. w7;
  243.  
  244. w7 = seval( sb, 0.5, 4.0 );
  245.  
  246. pause(1);
  247.  
  248. #
  249. #
  250. # Surface and Curve tangents.
  251. #
  252. v1 = ctangent( cb, 0.0 );
  253. v2 = ctangent( cb, 0.1 );
  254. v3 = ctangent( cb, 0.3 );
  255. v4 = ctangent( cb, 0.5 );
  256. v5 = ctangent( cb, 0.9 );
  257. v6 = ctangent( cb, 1.0 );
  258. v1;
  259. v2;
  260. v3;
  261. v4;
  262. v5;
  263. v6;
  264.  
  265. pause(1);
  266.  
  267. w1 = stangent( sb, 1, 1.0, 3.0 );
  268. w2 = stangent( sb, 2, 1.1, 3.0 );
  269. w3 = stangent( sb, 1, 1.3, 3.0 );
  270. w4 = stangent( sb, 2, 1.5, 3.5 );
  271. w5 = stangent( sb, 1, 1.9, 3.1 );
  272. w6 = stangent( sb, 2, 1.0, 4.0 );
  273. w7 = stangent( sb, 2, 1.5, 4.0 );
  274. w1;
  275. w2;
  276. w3;
  277. w4;
  278. w5;
  279. w6;
  280. w7;
  281.  
  282. #
  283. #
  284. # Surface normals.
  285. #
  286. w1 = snormal( sb, 1.0, 3.0 );
  287. w2 = snormal( sb, 1.1, 3.0 );
  288. w3 = snormal( sb, 1.3, 3.0 );
  289. w4 = snormal( sb, 1.5, 3.5 );
  290. w5 = snormal( sb, 1.9, 3.1 );
  291. w6 = snormal( sb, 1.0, 4.0 );
  292. w7 = snormal( sb, 1.5, 4.0 );
  293. w1;
  294. w2;
  295. w3;
  296. w4;
  297. w5;
  298. w6;
  299. w7;
  300.  
  301. pause(1);
  302.  
  303. #
  304. # save("cb", cb);
  305. # save("sb", sb);
  306. #
  307. # cb1 = load("cb.crv");
  308. # sb1 = load("sb.srf");
  309. #
  310. # save("cb1", cb1);
  311. # save("sb1", sb1);
  312. #