home *** CD-ROM | disk | FTP | other *** search
/ Gold Fish 3 / goldfish_volume_3.bin / files / gfx / 3d / irit / scripts / bspline.irt < prev    next >
Encoding:
Text File  |  1995-03-06  |  8.1 KB  |  343 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. if ( machine == msdos, resolution = 5, resolution = 10 );
  11.  
  12. s45 = sin( pi / 4 );
  13. cbsp = list( ctlpt( P2, 1.0, 1.0, 0.0 ),
  14.          ctlpt( P2, s45, s45, s45 ),
  15.          ctlpt( P2, 1.0, 0.0, 1.0 ) );
  16. sbsp = list ( list( ctlpt( E3, 0.1, 0.0, 1.0 ),
  17.                 ctlpt( E3, 0.3, 1.0, 0.0 ),
  18.                 ctlpt( E3, 0.0, 2.0, 1.0 ) ),
  19.               list( ctlpt( E3, 1.1, 0.0, 0.0 ),
  20.                 ctlpt( E3, 1.3, 1.0, 2.0 ),
  21.                 ctlpt( E3, 1.0, 2.0, 0.0 ) ),
  22.               list( ctlpt( E3, 2.1, 0.0, 2.0 ),
  23.                 ctlpt( E3, 2.3, 1.0, 0.0 ),
  24.                 ctlpt( E3, 2.0, 2.0, 2.0 ) ),
  25.               list( ctlpt( E3, 3.1, 0.0, 0.0 ),
  26.                 ctlpt( E3, 3.3, 1.0, 2.0 ),
  27.                 ctlpt( E3, 3.0, 2.0, 0.0 ) ),
  28.               list( ctlpt( E3, 4.1, 0.0, 1.0 ),
  29.                 ctlpt( E3, 4.3, 1.0, 0.0 ),
  30.                 ctlpt( E3, 4.0, 2.0, 1.0 ) ) );
  31.  
  32. cb = cbspline( 3, cbsp, list( 0, 0, 0, 1, 1, 1 ) );
  33. color( cb, red );
  34. sb = sbspline( 3, 3, sbsp, list( list( 1, 1, 1, 2, 2, 2 ),
  35.                  list( 3, 3, 3, 4, 5, 6, 6, 6 ) ) );
  36. color( sb, red );
  37.  
  38. if ( display == on, interact( list( axes, cb, sb ) ):
  39.             viewstate( "DSrfMesh" ):
  40.             pause():
  41.             viewstate( "DSrfMesh" ):
  42.             pause() );
  43.  
  44. #
  45. # Float end condition conversion to open end condition using subdivision.
  46. #
  47. sbsp = list ( list( ctlpt( E3, 0.1, 0.0, 1.0 ),
  48.                 ctlpt( E3, 0.3, 1.0, 0.0 ),
  49.                 ctlpt( E3, 0.0, 2.0, 1.0 ) ),
  50.               list( ctlpt( E3, 1.1, 0.0, 0.0 ),
  51.                 ctlpt( E3, 1.3, 1.0, 2.0 ),
  52.                 ctlpt( E3, 1.0, 2.0, 0.0 ) ),
  53.               list( ctlpt( E3, 2.1, 0.0, 2.0 ),
  54.                 ctlpt( E3, 2.3, 1.0, 0.0 ),
  55.                 ctlpt( E3, 2.0, 2.0, 2.0 ) ),
  56.               list( ctlpt( E3, 3.1, 0.0, 0.0 ),
  57.                 ctlpt( E3, 3.3, 1.0, 2.0 ),
  58.                 ctlpt( E3, 3.0, 2.0, 0.0 ) ),
  59.               list( ctlpt( E3, 4.1, 0.0, 1.0 ),
  60.                 ctlpt( E3, 4.3, 1.0, 0.0 ),
  61.                 ctlpt( E3, 4.0, 2.0, 1.0 ) ) );
  62. sb = sbspline( 3, 4, sbsp, list( list( 1, 2, 3, 4, 5, 6 ),
  63.                  list( 1, 2, 3, 4, 5, 6, 7, 8, 9 ) ) );
  64. color(sb, red);
  65. iritState("DumpLevel", 9);
  66. sbOpenRow = nth(sdivide(nth(sdivide( sb, row, 4), 2), row, 6), 1);
  67. sbOpenCol = nth(sdivide(nth(sdivide( sbOpenRow, col, 3), 2), col, 4), 1);
  68. color(sbOpenCol,cyan);
  69. if ( display == on, view( list( sb, sbOpenCol ), on ):
  70.             viewstate( "DSrfMesh" ):
  71.             pause():
  72.             viewstate( "DSrfMesh" ):
  73.             pause() );
  74. free(sb);
  75. free(sbOpenRow);
  76. free(sbOpenCol);
  77.  
  78. #
  79. # Curve refinement.
  80. #
  81. cb_ref = crefine( cb, false, list( 0.25, 0.5, 0.75 ) );
  82. color( cb_ref, yellow );
  83. if ( display == on, interact( list( axes, cb, cb_ref ) ) );
  84. free( cb_ref );
  85.  
  86. #
  87. # Knot substitution (One internal knot is moved from 0.1 to 0.9).
  88. #
  89. cb_ref = crefine( cb, false, list( 0.5 ) );
  90. cb_all = list( axes );
  91. for ( t = 0.1, 0.1, 0.9,
  92.     cb1 = crefine( cb_ref, true, list( 0, 0, 0, t, 1, 1, 1 ) ):
  93.     color( cb1, green ):
  94.     snoc( cb1, cb_all )
  95.     );
  96. if ( display == on, interact( cb_all ) );
  97. free( cb_all );
  98.  
  99. #
  100. # Curve subdivision.
  101. #
  102. cb_lst = cdivide( cb, 0.5 );
  103. cb1 = nth( cb_lst, 1 );
  104. color( cb1, green );
  105. cb2 = nth( cb_lst, 2 );
  106. color( cb2, yellow );
  107. free( cb_lst );
  108. if ( display == on, interact( list( axes, cb, cb1, cb2 ) ) );
  109. free( cb1 );
  110. free( cb2 );
  111.  
  112. #
  113. # Region from curve.
  114. #
  115. cbr1 = cregion( cb, 0.3, 0.6 );
  116. color( cbr1, yellow );
  117. cbr2 = cregion( cb, 0.5, 1.0 );
  118. color( cbr2, green );
  119. cbr3 = cregion( cb, 0.3, 0.0 );
  120. color( cbr3, blue );
  121. if ( display == on, interact( list( cb, cbr1, cbr2, cbr3 ) ) );
  122. free( cbr1 ); free( cbr2 ); free( cbr3 );
  123.  
  124. #
  125. # Surface subdivision and merging.
  126. #
  127. sb = sbspline( 3, 3, sbsp, list( list( 1, 1, 1, 2, 2, 2 ),
  128.                  list( 3, 3, 3, 4, 5, 6, 6, 6 ) ) );
  129. color( sb, red );
  130. sb_lst = sdivide( sb, COL, 1.4 );
  131. sb1 = nth( sb_lst, 1 );
  132. color( sb1, green );
  133. sb2 = nth( sb_lst, 2 );
  134. color( sb2, yellow );
  135. free( sb_lst );
  136. if ( display == on, interact( list( axes, sb, sb1, sb2 ) ) );
  137. sbm = smerge( sb1, sb2, COL, 1 );
  138. if ( display == on, interact( list( axes, sbm, sb1, sb2 ) ) );
  139. sbm = smerge( sb1 * trans( vector( 0.0, -0.5, 0.0 ) ),
  140.           sb2 * trans( vector( 0.0,  0.5, 0.0 ) ), COL, 0 );
  141. if ( display == on, interact( list( axes, sbm, sb1, sb2 ) ) );
  142. free( sb1 );
  143. free( sb2 );
  144.  
  145. sb_lst = sdivide( sb, ROW, 4.8 );
  146. sb1 = nth( sb_lst, 1 );
  147. color( sb1, green );
  148. sb2 = nth( sb_lst, 2 );
  149. color( sb2, yellow );
  150. free( sb_lst );
  151. if ( display == on, interact( list( axes, sb, sb1, sb2 ) ) );
  152. sbm = smerge( sb1, sb2, ROW, 1 );
  153. if ( display == on, interact( list( axes, sbm, sb1, sb2 ) ) );
  154. sbm = smerge( sb1 * trans(vector( -0.5, 0.0, 0.0 ) ),
  155.           sb2 * trans(vector(  0.5, 0.0, 0.0 ) ), ROW, 0 );
  156. if ( display == on, interact( list( axes, sbm, sb1, sb2 ) ) );
  157. free( sb1 );
  158. free( sb2 );
  159.  
  160. #
  161. # Region from surface.
  162. #
  163. sbr1 = sregion( sb, COL, 1.3, 1.6 );
  164. color( sbr1, yellow );
  165. sbr2 = sregion( sb, COL, 1.8, 2.0 );
  166. color( sbr2, green );
  167. sbr3 = sregion( sb, ROW, 4.0, 5.0 );
  168. color( sbr3, blue );
  169. interact( list( sb, sbr1, sbr2, sbr3 ) );
  170. free( sbr1 ); free( sbr2 ); free( sbr3 );
  171.  
  172. #
  173. # Derivative and normal curves/surfaces
  174. #
  175. dcb = cderive( cb );
  176. if ( display == on, interact( list( axes, dcb, cb ) ) );
  177. dsb1 = sderive( sb, ROW );
  178. color( dsb1, magenta );
  179. dsb2 = sderive( sb, COL );
  180. color( dsb2, yellow );
  181. if ( display == on, interact( list( axes, dsb1, dsb2, sb ) ) );
  182. nsb = snrmlsrf( sb );
  183. color( nsb, yellow );
  184. if ( display == on, interact( list( axes, nsb, sb ) ) );
  185. free( dcb );
  186. free( dsb1 );
  187. free( dsb2 );
  188. free( nsb );
  189.  
  190.  
  191. #
  192. # Iso curves extraction from surface.
  193. #
  194. cb_all = list( axes );
  195. snoc( sb, cb_all );
  196. for ( t = 1.1, 0.1, 1.9,
  197.     cb1 = csurface( sb, COL, t ):
  198.     color( cb1, green ):
  199.     snoc( cb1, cb_all )
  200.     );
  201. for ( t = 3.1, 0.2, 5.9,
  202.     cb1 = csurface( sb, ROW, t ):
  203.     color( cb1, green ):
  204.     snoc( cb1, cb_all )
  205.     );
  206. if ( display == on, interact( cb_all ) );
  207. free( cb_all );
  208.  
  209.  
  210. #
  211. # curves extraction from surface mesh. Note curves may be not on the surface.
  212. #
  213. cb_all = list( axes );
  214. snoc( sb, cb_all );
  215. for ( t = 0, 1, 2,
  216.     cb1 = cmesh( sb, COL, t ):
  217.     color( cb1, green ):
  218.     snoc( cb1, cb_all )
  219.     );
  220. for ( t = 0, 1, 4,
  221.     cb1 = cmesh( sb, ROW, t ):
  222.     color( cb1, green ):
  223.     snoc( cb1, cb_all )
  224.     );
  225. if ( display == on, interact( cb_all ) );
  226. free( cb_all );
  227.  
  228. #
  229. # convert into polygons/polylines (using default resolution).
  230. #
  231. iritState("DumpLevel", 1);
  232. resolution;
  233.  
  234. p = gpolyline( list( sb, cb ), off );
  235. if ( display == on, interact( list( p, axes ) ) );
  236.  
  237. p = gpolygon( sb, on );
  238. if ( display == on, viewstate("DrawVNrml"):
  239.             interact( list( p, axes ) ):
  240.             viewstate("DrawVNrml") );
  241.  
  242. #
  243. # reverse surface ( flip normals ).
  244. #
  245. q = gpolygon( -sb, on );
  246. if ( display == on, viewstate("DrawVNrml"):
  247.             interact( list( q, axes ) ):
  248.             viewstate("DrawVNrml") );
  249.  
  250. free(p);
  251. free(q);
  252.  
  253. #
  254. # Offset approximation by translation of srf/crv in normal direction.
  255. #
  256. cbo = offset(cb, 0.1, 0.1, off);
  257. if ( display == on, interact( list( axes, cb, cbo ) ) );
  258. free(cbo);
  259.  
  260. sbo = offset(sb, 0.2, 0.1, off);
  261. if ( display == on, interact( list( axes, sb, sbo ) ) );
  262. free(sbo);
  263.  
  264. #
  265. # Surface and Curve evaluation.
  266. #
  267. ceval( cb, 0.0 );
  268. ceval( cb, 0.1 );
  269. ceval( cb, 0.3 );
  270. ceval( cb, 0.5 );
  271. ceval( cb, 0.9 );
  272. ceval( cb, 1.0 );
  273.  
  274. pause();
  275.  
  276. seval( sb, 1.0, 3.0 );
  277. seval( sb, 1.1, 3.0 );
  278. seval( sb, 1.3, 3.0 );
  279. seval( sb, 1.5, 3.5 );
  280. seval( sb, 1.9, 3.1 );
  281. seval( sb, 1.0, 4.0 );
  282. seval( sb, 1.5, 4.0 );
  283.  
  284. pause();
  285.  
  286. #
  287. #
  288. # Surface and Curve tangents.
  289. #
  290. ctangent( cb, 0.0 );
  291. ctangent( cb, 0.1 );
  292. ctangent( cb, 0.3 );
  293. ctangent( cb, 0.5 );
  294. ctangent( cb, 0.9 );
  295. ctangent( cb, 1.0 );
  296.  
  297. pause();
  298.  
  299. stangent( sb, ROW, 1.0, 3.0 );
  300. stangent( sb, COL, 1.1, 3.0 );
  301. stangent( sb, ROW, 1.3, 3.0 );
  302. stangent( sb, COL, 1.5, 3.5 );
  303. stangent( sb, ROW, 1.9, 3.1 );
  304. stangent( sb, COL, 1.0, 4.0 );
  305. stangent( sb, COL, 1.5, 4.0 );
  306.  
  307. #
  308. #
  309. # Surface normals.
  310. #
  311. snormal( sb, 1.0, 3.0 );
  312. snormal( sb, 1.1, 3.0 );
  313. snormal( sb, 1.3, 3.0 );
  314. snormal( sb, 1.5, 3.5 );
  315. snormal( sb, 1.9, 3.1 );
  316. snormal( sb, 1.0, 4.0 );
  317. snormal( sb, 1.5, 4.0 );
  318.  
  319. #
  320. # Compute moments:
  321. #
  322. a = circle( vector( 0, 0, 0 ), 1 );
  323. a = cregion( a, 0, 1 );
  324. moment( a, 0 );
  325. moment( a, 1 );
  326.  
  327. a = cregion( a, 0, 1 ) * rz( 45 );
  328. moment( a, 0 );
  329. moment( a, 1 );
  330.  
  331. pause();
  332.  
  333. #
  334. # save("cb", cb);
  335. # save("sb", sb);
  336. #
  337. # cb1 = load("cb.crv");
  338. # sb1 = load("sb.srf");
  339. #
  340. # save("cb1", cb1);
  341. # save("sb1", sb1);
  342. #
  343.