home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_2.iso / files / 821a.lha / Sphere / sphere.lwv next >
Text File  |  1993-11-19  |  2KB  |  96 lines

  1. Having been challenged by Imagine's "Conform to Sphere" operation, I
  2. sat down and wrote an ARexx script for Modeler 3.0 that does a
  3. similar function.  I only spent a few minutes on it, so it does not
  4. have a lot of bells and whistles, but it does do essentially the
  5. desired transformation.  Hope this helps the fellow who wanted to
  6. do this ...
  7.  
  8.         Stuart Ferguson
  9. -----------------------
  10.  
  11. /*
  12.  * Wrap Data onto Sphere -- Modeler ARexx transform.
  13.  *
  14.  * 8/93  Stuart Ferguson
  15.  */
  16.  
  17.         mxx="LWModelerARexx.port"
  18.         signal on error
  19.         signal on syntax
  20.         check = addlib("rexxmathlib.library",0,-30,0)
  21.         mxx_add = addlib(mxx,0)
  22.         call main
  23.         if (mxx_add) then call remlib(mxx)
  24.         exit
  25.  
  26.         syntax:
  27.         error:
  28.         t=Notify(1,'!Rexx Script Error','@'ErrorText(rc),'Line 'SIGL)
  29.         if (mxx_add) then call remlib(mxx)
  30.         exit
  31.  
  32.  
  33. main:
  34.  
  35. syscode = "Wrap Sphere"
  36.  
  37.  
  38. /* Get size and thickness of sphere from user.
  39.  */
  40. call req_begin syscode
  41.  
  42. id_inr = req_addcontrol("Inner Radius", 'n', 1)
  43. id_otr = req_addcontrol("Outer Radius", 'n', 1)
  44. id_sel = req_addcontrol("Points", 'c', 'All Selected')
  45. call req_setval id_inr, 1.0, 1.0
  46. call req_setval id_otr, 2.0, 2.0
  47. call req_setval id_sel, 2
  48.  
  49. if (~req_post()) then return
  50.  
  51. r1 = req_getval(id_inr)
  52. r2 = req_getval(id_otr)
  53. call sel_mode word('global user',req_getval(id_sel))
  54.  
  55. call req_end
  56.  
  57.  
  58. /* Get extent of data area.  This will just take the extent in
  59.  * X and Y and map it to lat and long on the sphere, and the
  60.  * extent in Z and map it to r1 and r2.
  61.  */
  62. parse value boundingbox() with n x1 x2 y1 y2 z1 z2 .
  63. dx = x2 - x1
  64. dy = y2 - y1
  65. dz = z2 - z1
  66. if (n <= 0 | dx <= 0 | dy <= 0) then return
  67. d2r = 3.1415926 / 180
  68.  
  69. /* Transform loop
  70.  */
  71. n = xfrm_begin()
  72. call meter_begin n, syscode
  73. do i = 1 to n
  74.     parse value xfrm_getpos(i) with x y z .
  75.  
  76.     lat = d2r * ((y - y1) / dy * 180 - 90)
  77.     lon = d2r * ((x - x1) / dx * 360)
  78.     if (dz <= 0) then rad = r1
  79.                  else rad = (z - z1) / dz * (r2 - r1) + r1
  80.  
  81.     y = rad * sin(lat)
  82.     p = rad * cos(lat)
  83.     x = p * sin(lon)
  84.     z = p * cos(lon)
  85.  
  86.     call xfrm_setpos i, x y z
  87.     call meter_step
  88. end
  89. call meter_end
  90. call xfrm_end
  91.  
  92. return
  93. ------------------------- end
  94.  
  95.  
  96.