home *** CD-ROM | disk | FTP | other *** search
/ Collection of Hack-Phreak Scene Programs / cleanhpvac.zip / cleanhpvac / FAQSYS18.ZIP / FAQS.DAT / HPSIRD.TXT < prev    next >
Text File  |  1996-01-04  |  38KB  |  907 lines

  1. Article: 15801 of comp.sys.hp48
  2. From: charliep@hpcvra.cv.hp.com (Charles Patton)
  3. Date: Wed, 15 Dec 1993 17:35:59 GMT
  4. Subject: 3D Graphics (SIRDS / RDA)
  5. Message-ID: <-218869982@hpcvra.cv.hp.com>
  6. Organization: Hewlett-Packard Co., Corvallis, OR, USA
  7. Path: kth.se!sunic!pipex!howland.reston.ans.net!usc!sdd.hp.com!hplabs!hp-cv!hp-pcd!hpcvra!charliep
  8. Newsgroups: comp.sys.hp48
  9. Lines: 870
  10.  
  11. Hi all,
  12.  
  13. I've included, below, an ascii encoded HP48 directory with the
  14. random-dot autostereogram stuff in it for your visualization pleasure.
  15. The directory contains five things.
  16.  
  17. EXAMP1 & EXAMP2
  18. are standard-sized grobs with simple stereograms on which to
  19. practice your viewing.
  20.  
  21. RDAFUN
  22. is the main program. It takes a user-defined function of two variables
  23. and generates the stereogram on the '48 screen. It takes a while but I
  24. have found that you can begin seeing the 3-D effect after it's about 1/3
  25. done.
  26.  
  27. The user-defined function should take screen coordinates 
  28. ( [1,131]X[1,64] ) and return an INTEGER (!!!) between 0 and 8. This
  29. upper limit was experimentally determined as the useful dynamic range
  30. - but try messing around yourself.
  31.  
  32. ONEPIX
  33. is the routine to "color" a single pixel based on the past history and
  34. current function value.
  35.  
  36. RNDLST
  37. is a utility to generate a random sequence of 0's and 1's.
  38.  
  39. Beyond the end of the directory, I've included an FAQ regarding RDAs from
  40. a usenet notes group.
  41.  
  42. *******************************************************
  43. ** Charles M. Patton                                 **
  44. **                                                   **
  45. ** charliep@cv.hp.com                                **
  46. **      the usual disclaimers apply                  **
  47. *******************************************************
  48.  
  49.  
  50. @--------------------begin RDA.DIR------------------------------------------------------------@
  51. %%HP: T(3)A(D)F(.);
  52. DIR
  53.   EXAMP2
  54. GROB 131 64 0F1007300CD200E61007B00C710CB0071040B3446F019B788CD344EE01DD11DE4850AD09AD12A6F015B788AD34A678C674AD000317072C1C11E0E80707481C103C181700044D08863044B102AD001D204A504D20202D192A35A8D925CE49267A88D519DA4650E8D4613399899CC89166CC891B1B1D8620D4AB59CE6946739467B42BB294719A3440941519645843A4843A44A15096A0925440302D30A47105A7105A7182D70AA706D140088A203A6181B6181B61C85303B60B5140847029D109CE009CE0096700AD10AD0820850A1B08E8508E8508E81047608E604B10802A0988484C8484C848464229942948407543E21D0790D0790
  55.  
  56.  
  57. 852E0527410A63245D81AAC81AAC81AA6C0BA91AAC8203901762C8332C8332C83326CD888F84C3011023200911009110091108C400950841038C064270322703227032A389860B82820F13CE5C46F2C46F2C46F242BF096F05B306D38C4F0466F0466F0466F02BD34ED1A70A83851E0CA2E0CA2E0CA2E06583C283E00328B780CD380CD380CD380EE128D32CE00D27CBBC3EDAC3EDAC3EDAC1F627ED23F3083D31F4F98E4F98E4F98E4F443D983D46066C4C81626816268162681213682664110228A5804D2804D2804D28086120C2206008F001F3080F3080F3080F3048F080F0440397A74E3DB4E3DB4E3DB4EBE58FCB87E20A149570BC270BC270B
  58.  
  59.  
  60. 91CD21C64058A6A0A5350A5350A5350A99286258291032607882838828388283882C12A8326C005675A9DA259DA259DA259D69A6B356F910E067C38B3E38B3E38B3E38F1F1E3E1E1700405001820018200182001410403048100A549561AC261AC261AC26166158D25C64082080A0140A0140A0140A012034403024003A21C8598C8598C8598C8944268822420A47243D31A2D31A2D31A2D905470A430206744DC11A6C11A6C11A6C115374A670550011004400044000440004400011001104022AC4A8462B8462B8462B82392A6A26B204C93827A1437A1437A1437D0AC51CCB0300503061810718107181071C0850185806018CA202751027510275
  61.  
  62.  
  63. 86518A200A0F941C74A0C74A0C74A0C321074203A0005CC0213609136091360991346664623106494C05236842368423682911A032A8900D985A3263D1163D1163D10B9604370AD10340460101380013800130088000110840034D4685333CA333CA3334D9905331D9500233266C84336943369431B4A4C8444401059019214C4906C4906C44036116C1137003C06783853C1453C1453E0AE834D83A360A20D2544B822AB822AB411D354A750D510809401221801908019048840129018440006220C480062400624003120C040C0201041DE42AA3115D988AE4445311B60153420620A640AA1305D818A6C04B13861347C006EAA6C59A1FA4D875A6C
  64.  
  65.  
  66. 41F26C50855E89AC3665E13B2F895936E2766999204903411605C03826814134054805044100863986622A9111DC8886622AD40A528A403B0B2B169C60B463852B169C3C8C162340
  67.   EXAMP1
  68. GROB 131 64 0A8490A8490A8490A8490A8490A8490A002C6C12C6C12C6C12C6C12C6C12C6C12C60855D2855D2855D2855D2855D2855D28550A8C55A8C55A8C55A8C55A8C55A8C55A84078260782607826078260782607826078201CD221CD221CD221CD221CD221CD221C50C07B4C07B4C07B4C07B4C07B4C07B4C070C8384C8384C8384C8384C8384C8384C8306881068810688106881068810688106800D0E20D0E20D0E20D0E20D0E20D0E20D0606D5106D5106D5106D5106D5106D5106D505D10C5D10C5D10C5D10C5D10C5D10C5D10270AF270AF270AF270AF270AF270AF2700064FC064FC064FC064FC064FC064FC0640596D4596D4596D459
  69.  
  70.  
  71. D4596D45960061340613406134061340613406134061000301003010030100301003010030100304953949539495394953949539495394950017B4017B4017B4017B4017B4017B401703B7143B7143B7143B7143B7143B7143B706C8C06C8C06C8C06C8C06C8C06C8C06C005738657386573865738657386573865730862F1862F1862F1862F1862F1862F186201279A1279A1279A1279A1279A1279A127035A0135A0135A0C44A0C44A0C44A0C44202B5682B5682B52ACC52ACC52ACC52ACC501B4641B4641B405CE405CE405CE405CE40C2903C2903C29C0BC9C0BC9C0BC9C0BC10A2988A2988A292AA482AA482AA482AA40008C8908C8908C620AC
  72.  
  73.  
  74. 20AC620A4010A7810A7810A1608A1608A1608A160820977949779497725ED625ED625ED625ED60710B0710B07102C5802C5802C5802C58000185901859018524085240852408524000D8299D8299D826632366323663236632302946529465294494244942449424494240B4D98B4D98B4D3E29D3E29D3E29D3E2950340E4340E43402D0502D0502D0502D0500488FC488FC488F3188F3188F3188F3180080A0080A0080A0080A0080A0080A008020672B8672B8672B8672B8672B8672B86720E7797E7797E7797E7797E7797E7797E7701416314163141631416314163141631410B3B94B3B94B3B94B3B94B3B94B3B94B3302385923859238592385
  75.  
  76.  
  77. 238592300E5546E5546E5546E5546E5546E5546E55006E8E06E8E06E8E06E8E06E8E06E8E06600A8490A8490A8490A8490A8490A8490A002C6C12C6C12C6C12C6C12C6C12C6C12C60855D2855D2855D2855D2855D2855D28550A8C55A8C55A8C55A8C55A8C55A8C55A84078260782607826078260782607826078201CD221CD221CD221CD221CD221CD221C50C07B4C07B4C07B4C07B4C07B4C07B4C070C8384C8384C8384C8384C8384C8384C8306881068810688106881068810688106800D0E20D0E20D0E20D0E20D0E20D0E20D0606D5106D5106D5106D5106D5106D5106D505D10C5D10C5D10C5D10C5D10C5D10C5D10270AF270AF270AF270AF
  78.  
  79.  
  80. 70AF2700064FC064FC064FC064FC064FC064FC0640596D4596D4596D4596D4596D4596D4596006134061340613406134061340613406100030100301003010030100301003010030
  81.   FUNRDA
  82.     \<< \-> FFF
  83.       \<< PICT PURGE
  84. { # 0d # 0d } PVIEW
  85. 1 64
  86.         FOR YY 20
  87. RNDLST 0 # 0d YY 1
  88. - R\->B 1 YY 1 FFF 0
  89. 0
  90.           DO ONEPIX
  91.           UNTIL 6
  92. PICK 132 ==
  93.           END 11
  94. DROPN
  95.         NEXT
  96.       \>>
  97.     \>>
  98.   ONEPIX
  99.     \<< \-> LST LSTLEN
  100. IDX PX PY X Y DX F
  101. OLD NEW
  102.       \<<
  103.         CASE OLD
  104. NEW ==
  105.           THEN
  106.             IF 'LST
  107. (IDX+1)' EVAL
  108.             THEN PX
  109. PY 2 \->LIST PIXON
  110.             END LST
  111. LSTLEN IDX 1 +
  112. LSTLEN MOD PX 1 +
  113. PY X DX + Y DUP2 F
  114. EVAL DX F NEW 4
  115. ROLL
  116.           END NEW
  117. OLD >
  118.           THEN LST
  119. OBJ\-> IDX - ROLL
  120. DROP LSTLEN 1 - DUP
  121. 'LSTLEN' STO IDX
  122. OVER MOD 'IDX' STO
  123. \->LIST 'LST' STO LST
  124. LSTLEN IDX PX PY X
  125. Y DX F OLD 1 + NEW
  126.           END LST
  127. OBJ\-> IDX - 1 + RAND
  128. .6 > SWAP ROLLD
  129. LSTLEN 1 + DUP
  130. 'LSTLEN' STO \->LIST
  131. LSTLEN IDX PX PY X
  132. Y DX F OLD 1 - NEW
  133.         END
  134.       \>>
  135.     \>>
  136.   RNDLST
  137.     \<< \-> L
  138.       \<< 1 L
  139.         START RAND
  140. .6 >
  141.         NEXT L
  142. \->LIST L
  143.       \>>
  144.     \>>
  145. END
  146. @--------------------end RDA.DIR------------------------------------------------------------@
  147. Here's the FAQ from alt.3d, complete with credits/advertisements at the bottom
  148. and code examples in the middle:
  149.  
  150. --
  151. Ken Corey   exukenc@exu.ericsson.com  214/907-5841  Speaking for everyone...
  152.  God may be subtle, but He isn't plain mean.
  153.          -- Albert Einstein
  154.  
  155. The following is a smattering of info I've collected about SIRDS.  It is not 
  156. too well organized, nor complete, but it answers a lot of FAQs out there.  
  157. Please submit any updates/changes to me at thale@novell.com.
  158.  
  159. The following sections are covered herein:
  160.  
  161.    SIRDS terminology
  162.    SIRDS FTP Sites
  163.    Commercial SIRDS Software
  164.    HOW STEREOGRAMS WORK         <-- By popular demand!
  165.    Stereogram Algorithm         <-- Also new (and rough)
  166.    SIRDS Publications
  167.    Sample TEXT Stereograms
  168.    C Code to Generate SIRTS
  169.    Hope for the Hopeless
  170.    Commercial SIRDS Posters
  171.  
  172.  
  173.  
  174. -----------------------------------------------------------------------
  175. ----- SIRDS TERMINOLOGY -----------------------------------------------
  176. -----------------------------------------------------------------------
  177.  
  178. SIRDS       Single Image Random Dot Stereogram
  179. SIRD        Single Image Random Dot (not much to view in a dot; used by 
  180.             newbies)
  181. SIRTS       Single Image Random TEXT Stereogram, also called ascii 
  182.             stereograms
  183. Stereogram  general, simplified term for SIRDS and SIRTS and even
  184.             stereo-pairs (occasionally)
  185. Autostereogram, RDS, Auto RDS
  186.             equivalent to a SIRDS
  187. RLS         Random Line stereograms, instructional in learning stereogram
  188.             concepts (see Slinker and Burton publication)
  189.  
  190. Wall-eyed viewing   Viewing stereograms by focusing past the actual image
  191. Cross-eyed viewing  Viewing stereograms by focusing in front of the image
  192. Focus to infinity   Forcing your eyes' lines of sight into parallel, NOT
  193.                     necessary for wall-eyeing SIRDS!
  194.  
  195.  
  196. -----------------------------------------------------------------------
  197. ----- SIRDS FTP SITES -------------------------------------------------
  198. -----------------------------------------------------------------------
  199.  
  200. Submissions from E.Thompson@newcastle.ac.uk, kbaum@novell.com, s
  201. ftp.uwp.edu
  202.   /pub/incoming/graphics/rdsdraw.zip
  203.     EXCELLENT SIRDS painting/generating program.  CHECK IT OUT!
  204. wuarchive.wustl.edu (128.252.135.4) 
  205.   /mirrors/msdos/graphics/mindim20.zip
  206.     Several SIRDS (~32) in an RLE format with versatile viewer.  GET IT!
  207.   /pub/MSDOS_UPLOADS/demos/sirdsani.zip
  208.     Lets you load a 3d object, position it, then generates an animated rotation
  209.     within stereograms.
  210.   /pub/xpgs/xpgs.?.?
  211.     Xwindows stereogram utilities; generator, viewer, mindim rle viewer...
  212.   /pub/MSDOS_UPLOADS/graphics/dynamic.exe
  213.     Animated SIRDS (page flipping)
  214.   /graphics/graphics/mirrors/sugrfx.acs.syr.edu/3d/randot/3drandot.zoo
  215.     Converts color GIF to SIRDS on screen
  216.   /mirrors/msdos/graphics/perspect.zip
  217.     Simple SIRDS paint/view program
  218. sunsite.unc.edu
  219.   /pub/academic/computer-science/virtual-reality/3d/
  220.     alt.3d.Z        Older archive of the alt.3d newgroups  
  221.     mindimage       Stereogram Viewing package, rle images
  222.     randot          Various programs to make random dot stereograms 
  223.     red_blue        Graphic files for viewing with Red/Blue glasses
  224.     stereograms     Graphic and Text files of steroegrams 
  225. ftp.cs.waikato.ac.nz
  226.   /pub/papers/???.tar.Z
  227.     Research paper describing sirds, with several improvements
  228. (archive??)
  229.   shimmer.exe
  230.     Flips through several SIRDS of the same image to create a shimmering effect
  231.     (related to above research paper)
  232.  
  233.  
  234. -----------------------------------------------------------------------
  235. ----- COMMERCIAL SIRDS SOFTWARE ---------------------------------------
  236. -----------------------------------------------------------------------
  237.  
  238. STW_DEMO.EXE: the full package will allow RDS creation
  239.    Approx 40$
  240.    N.E.Thing Enterprises
  241.    P.O. Box 1827
  242.    Cambridge, MA 02139
  243.  
  244. I know there are more!  SEND MORE INFO!
  245.  
  246.  
  247. -----------------------------------------------------------------------
  248. ----- How Stereograms Work --------------------------------------------
  249. -----------------------------------------------------------------------
  250.  
  251. Let's start with a simple repeating pattern.  First we'll examine viewing
  252. stereograms wall-eyed (focusing beyond the picture).
  253.  
  254.               Adam
  255. Adam                       Adam          <-- PERCEIVED IMAGE (3D)
  256.   \ 
  257.    \ \
  258.     \   \
  259.     Adam  Adam   Adam  Adam              <-- ACTUAL PICTURE (Flat, 2D)
  260.      \       \
  261.       \         \                        <-- LINES OF SIGHT FROM EACH EYE
  262.        \           \
  263.        (*)           (*)                 <-- EYES
  264.  
  265. As shown in the above graphic, the lines of sight go through different
  266. (but identical) words.  The eyes must be directed to just the right level
  267. behind the picture to get the two "Adams" to line up.  When they do line 
  268. up, a single "Adam" appears at the level shown behind the picture.  
  269.  
  270. This is why it is easiest for some people to look at stereograms behind
  271. glass.  You simply look at your reflection, which appears to be behind
  272. the glass at about the same level as the 3d stereogram image.  More on
  273. this later.
  274.  
  275. So, why is the second "Adam" in the above image "deeper" than the other
  276. two?  Since the next two "Adams" that line up are FARTHER apart than the
  277. first two, your eyes must diverge a little more to get them to line up.  
  278. As the eyes diverge, their lines of sight meet a little further away.
  279. This causes the next "Adam" to appear deeper in the image.
  280.  
  281.               Adam
  282. Adam           |           Adam          <-- PERCEIVED IMAGE (3D)
  283.               / \
  284.              /   \
  285.             /     \
  286.     Adam  Adam   Adam  Adam              <-- ACTUAL PICTURE (Flat, 2D)
  287.            /       \
  288.           /         \                    <-- LINES OF SIGHT FROM EACH EYE
  289.          /           \
  290.        (*)           (*)                 <-- EYES
  291.  
  292. The above graphic was crammed into 10 lines of text.  If we moved the 
  293. eyes back (to a more realistic distance), the whole 3d image would 
  294. appear deeper, and not so spread out.
  295.  
  296. Cross-eyed viewing follows the same principles, but brings the focal point
  297. up front of the picture and inverts the image.  I'll use the same eyes and
  298. picture, but move the eyes back for room to illustrate.
  299.  
  300.     Adam  Adam   Adam  Adam              <-- ACTUAL PICTURE (Flat, 2D)
  301.        \   |
  302.          \|
  303.          Adam                            <-- PERCEIVED IMAGE (3D)
  304.          |   \
  305.          |     \
  306.         |         \                      <-- LINES OF SIGHT FROM EACH EYE
  307.         |           \
  308.        (*)           (*)                 <-- EYES
  309.  
  310. Now for the inverse part.  Since the next two "Adams" are farther apart,
  311. you must cross your eyes MORE (converge instead of diverge your eyes) to
  312. get the "Adams" to overlap.  This causes the next "Adam" in the image to
  313. appear closer than the first one.
  314.  
  315.     Adam  Adam    Adam  Adam             <-- ACTUAL PICTURE (Flat, 2D)
  316.            \      /
  317.             \    /
  318.          Adam\ / Adam                    <-- PERCEIVED IMAGE (3D)
  319.              Adam
  320.              /  \
  321.            /      \                      <-- LINES OF SIGHT FROM EACH EYE
  322.          /          \
  323.        (*)           (*)                 <-- EYES
  324.  
  325. Whew.  Ascii graphics are a bit too tight to be very technical.  By the
  326. way, each letter (or pixel) in the 3D image comes from two letters in
  327. the picture.  Stereograms have blurry edges (right and left edges) 
  328. because the line of sight from the one eye passes through the picture, 
  329. but the line of sight from the other eye is off the picture.  Examine
  330. the wall-eyed example below.
  331.  
  332.                      Adam
  333.        Adam                       Adam     <-- PERCEIVED IMAGE (3D)
  334. \               
  335.   \ \
  336.     \   \
  337.        \   Adam  Adam   Adam  Adam         <-- ACTUAL PICTURE (Flat, 2D)
  338.          \     \
  339.             \       \                      <-- LINES OF SIGHT
  340.               \           \          
  341.               (*)           (*)            <-- EYES
  342.  
  343. Here, the line of sight for the right eye goes through first "Adam" 
  344. in the picture, and the line of sight for the left eye is off the
  345. picture.  (Everything to the left of the first "Adam" in the IMAGE 
  346. is blurry.)
  347.  
  348.  
  349. HOW TO GENERATE STEREOGRAMS
  350.  
  351. Random stereograms work the same way; they simple repeat random text or
  352. pixels, instead of words like the "Adam" used above.  Below, the pattern, 
  353. "ASDFGHJK", is repeated four times in each line.  (I duplicated it for
  354. easier viewing.)
  355.  
  356.          ASDFGHJKASDFGHJKASDFGHJKASDFGHJK
  357.          ASDFGHJKASDFGHJKASDFGHJKASDFGHJK
  358.          ASDFGHJKASDFGHJKASDFGHJKASDFGHJK
  359.  
  360. As you might guess, the image consists of THREE repetitions of the 
  361. pattern, set back behind the picture (wall-eyed).  To add some varying
  362. depth to the image, we can simple add a space in the middle; or better,
  363. we'll add a different letter, the letter Q.  I've also dropped the K
  364. off the end to keep it suitable for framing. :-)
  365.  
  366.          ASDFGHJKASDFGHJKASDFGHJKASDFGHJK
  367.          ASDFGHJKASDFGHJKASQDFGHJKASDFGHJ
  368.          ASDFGHJKASDFGHJKASDFGHJKASDFGHJK
  369.  
  370. Adding the Q has the same effect as adding the space between "Adams"
  371. in the previous example.  Here it is again for comparison.
  372.  
  373.          Adam Adam Adam Adam Adam Adam
  374.          Adam Adam Adam  Adam Adam Ada
  375.          Adam Adam Adam Adam Adam Adam
  376.  
  377. These two stereograms demonstrate going down a level (deeper, for wall-
  378. eyed viewers) by adding a new letter where you want to go down.  The
  379. image returns back to the original level because the added letter was
  380. not repeated down the line; it was essentially deleted again.  Hence,
  381. deleting a letter causes the image to come forward one level.  Lets 
  382. look at this by deleting a letter before adding any.
  383.  
  384.          ASDFGHJKASDFGHJKASDFGHJKASDFGHJK
  385.          ASDFGHJKASDFGJKASDFGHJKASDFGHJKA
  386.          ASDFGHJKASDFGHJKASDFGHJKASDFGHJK
  387.  
  388. I deleted an H from the middle row, and added an A on the end to make
  389. it flush again.  This causes the image to come up a level where the H
  390. was deleted, then go back down where the H returns to the pattern.
  391.  
  392. To fully control the ups and downs of stereogram generation, you simply
  393. keep track of what's repeating and add and delete letters when needed.
  394. For example, start with the pattern ASDFGHJK.  If the input for the 3D
  395. stereogram image is 00000000000011111222221111111110000, where the 
  396. numbers represent the levels of the 3D image, you simply delete a letter
  397. from the pattern when you go up a level (0 to 1, or 1 to 2), and add a
  398. letter to the pattern when you go down a level (2 to 1, or 1 to 0).
  399.  
  400. If you want to go up multiple levels, e.g., from level 1 to 3, delete
  401. 2 letters from your pattern.  Adding two letters to the pattern likewise
  402. causes a two level drop in the image.
  403.  
  404. Start each line by dumping the whole pattern before you start creating
  405. the image.  Recall that in the examples above, four "Adams" in the 
  406. picture creates three "Adams" in the image.  By dumping the pattern to
  407. start, we are simple providing the first "Adam" to build the 3D image
  408. from.  Now, we start building the 3D image.
  409.  
  410.         ASDFGHJK
  411.  
  412. Since the first 12 levels are at level 0, we do no adding nor deleting;
  413. just dump 12 more letters from the pattern in order.
  414.  
  415.         ASDFGHJKASDFGHJKASDF
  416.                 ^image starts here
  417.  
  418. We now have our first transition, from level 0 to 1.  Which letter do we
  419. delete?  Delete the next one in the pattern.  
  420.  
  421.         ASDFGHJK
  422.             ^the next letter in the pattern
  423.  
  424. Since G is next, we delete it.  Our new pattern is ASDFHJK, and H is the
  425. next letter to be used in the image.
  426.  
  427.         ASDFHJK
  428.             ^the next letter to use in the image
  429.  
  430. Forget about the G.  Consider it gone forever.  The input now indicates 
  431. five letters at level 1.  Since we made the transition to level one by 
  432. deleting the G, we simply copy the next 5 letters from the pattern into
  433. the image.  The next 5 letters in the pattern are HJKAS.  (You've noticed
  434. by now that we wrap around when we get to the end of the pattern.) I'll 
  435. lay the input next to our image to make it easier to see where we're at.
  436.  
  437.                 00000000000011111222221111111110000
  438.         ASDFGHJKASDFGHJKASDFHJKAS
  439.         {      }{          }{   }
  440.         initial  level 0    level
  441.         pattern             1
  442.  
  443. To jump up to level 2 from level 1, we delete the next letter in the 
  444. pattern, the letter D.  The new pattern is shown below.
  445.  
  446.         ASFHJK
  447.           ^the next letter to use
  448.  
  449. We have 5 letters at level 2, so we copy the next 5 letters from the 
  450. pattern, FHJKA, to the image.
  451.  
  452.                 00000000000011111222221111111110000
  453.         ASDFGHJKASDFGHJKASDFHJKASFHJKA
  454.         {      }{          }{   }{   }
  455.         initial  level 0    lev  level
  456.         pattern             1    2
  457.  
  458. We must now move down a level, from 2 to 1, by ADDING a letter to our
  459. pattern.  Where do we add it?  Add it as the next letter to use.  Let's
  460. add an X (randomly chosen letters work better than previously used 
  461. letters).  Since A was the last letter used, S is the next to be used.
  462.  
  463.         ASFHJK
  464.          ^add X here
  465.  
  466.         AXSFHJK
  467.          ^next letter to use
  468.  
  469. Since there are nine letters at level 1, we must copy nine letters 
  470. from the pattern to the image (XSFHJKAXS).
  471.  
  472.                 00000000000011111222221111111110000
  473.         ASDFGHJKASDFGHJKASDFHJKASFHJKAXSFHJKAXS
  474.         {      }{          }{   }{   }{       }
  475.         initial  level 0    lev  level level 1
  476.         pattern             1    2
  477.  
  478. Drop another level, from 1 to 0, by adding another letter to the pattern
  479. at the current position.
  480.  
  481.         AXSFHJK
  482.            ^add random letter (M) here
  483.  
  484.         AXSMFHJK
  485.            ^next letter to use
  486.  
  487. Since there are four letters at level 0, we copy four letters from the
  488. pattern to the image (MFHJ).
  489.  
  490.                 00000000000011111222221111111110000
  491.         ASDFGHJKASDFGHJKASDFHJKASFHJKAXSFHJKAXSMFHJ
  492.         {      }{          }{   }{   }{       }{  }
  493.         initial  level 0    lev  level level   lev
  494.         pattern             1    2     1       0
  495.  
  496. WE'RE DONE.  Kinda anti-climatic, huh?  Let's duplicate the image line
  497. to make it easier to view.
  498.  
  499.         ASDFGHJKASDFGHJKASDFHJKASFHJKAXSFHJKAXSMFHJ
  500.         ASDFGHJKASDFGHJKASDFHJKASFHJKAXSFHJKAXSMFHJ
  501.         ASDFGHJKASDFGHJKASDFHJKASFHJKAXSFHJKAXSMFHJ
  502.         ASDFGHJKASDFGHJKASDFHJKASFHJKAXSFHJKAXSMFHJ
  503.         ASDFGHJKASDFGHJKASDFHJKASFHJKAXSFHJKAXSMFHJ
  504.  
  505. For each new line in the image, start with a new random pattern, and
  506. follow the steps above.  So, how are graphics stereograms made?  The
  507. same way, using colored pixel values for input.  3drandot uses RED as
  508. the color deepest in the image, with GREEN in the middle, and BLUE as
  509. the highest color.
  510.  
  511. The pseudocode below follows this algorithm.  If you have any questions,
  512. post them in the newsgroup.  Let me know if you are interested in C code 
  513. that follows this algorithm.  The C code here in the FAQ follows a 
  514. different algorithm, the "lookback" algorithm.
  515.  
  516. Enjoy!!
  517. thale@novell.com
  518.  
  519.  
  520. -----------------------------------------------------------------------
  521. ----- STEREOGRAM ALGORITHM --------------------------------------------
  522. -----------------------------------------------------------------------
  523.  
  524. The following is an algorithm I developed for SIRDS generation.  It is 
  525. functionally equivalent to the look back algorithms, without looking back. 
  526. It can be used for graphic stereograms, as well as the text stereograms. 
  527. It simply stores in PATTERN the values we would look back at.  The input 
  528. file is depth data, or a z-buffer (see example input below).  The levels 
  529. available in a picture are the maximum pattern size divided by two minus 
  530. one.  Maximum pattern size should be equivalent to half the distance 
  531. between the eyes (for easy viewing), which is about 1 1/4 inches.  So, for 
  532. typical text stereograms on an 80 char display, that's about 10 characters 
  533. for the maximum pattern size and 4 or 5 levels available.  However, since 
  534. 4 or 5 levels is unreasonable, we push the max pattern size to 16 (still 
  535. less that the 20 character distance between the eyes).  This gives us about 
  536. 7 or 8 levels.
  537.  
  538. If we do allow more than 7 levels when the max pattern size is 16, the 
  539. repeating pattern (of size max pattern - current level) grows so small that 
  540. four of them in a row (e.g., of size 7) would also create two double 
  541. patterns in a row (of size 14), causing floaties (aliasing).  
  542.  
  543. I hope I'm making some sense.  I'll try to spend some time rewriting this. 
  544. In addition, I'll integrate answers to any questions that come as a result 
  545. of this mess!  In addition to the information here, we need to add a good 
  546. description of how they work (that is not covered here).
  547.  
  548.  
  549. PL : Previous Level value
  550. NL : Next Level value
  551.  
  552. INITIAL LEVEL SETTING
  553. PL = 0
  554.  
  555. OPEN INPUT FILE FOR READING
  556. WHILE NOT EOF (Y DIMENSION: FOR EACH LINE)
  557.  
  558.    GENERATE NEW PATTERN
  559.    SET PATTERN PTR TO BEGINNING OF PATTERN
  560.    OUTPUT FULL PATTERN
  561.  
  562.    WHILE NOT EOL (X DIMENSION: FOR EACH POSITION)
  563.  
  564.       NL = NEXT INPUT LEVEL VALUE
  565.       IF NL != PL (IF WE'RE CHANGING LEVELS)
  566.  
  567.          IF NL > PL (IF WE'RE MOVING UP)
  568.             DELETE NEXT NL-PL BITS IN PATTERN FROM PTR FORWARD
  569.             (IF GOING FROM LEVEL 0 TO 2, DELETE 2 BITS IN PATTERN)
  570.  
  571.          ELSE (IF MOVING DOWN, AWAY)
  572.             INSERT PL-NL RANDOM BITS INTO PATTERN AT PTR POSITION
  573.             (IF GOING FROM LEVEL 3 TO 2, INSERT 1 BIT INTO PATTERN)
  574.  
  575.          PL = NL (UPDATE PL)
  576.          OUTPUT NEXT VALUE IN PATTERN
  577.  
  578.       ELSE
  579.          OUTPUT NEXT VALUE IN PATTERN
  580.  
  581.       ADVANCE PATTERN PTR (CIRCULAR PATTERN)
  582.       ADVANCE INPUT PTR
  583.             
  584.  
  585. (Redundancy exists to simplify readability.)
  586.  
  587. Assuming spaces translate to level 0, input like this (thanks, Dave 
  588. Thomas):
  589.  
  590.  
  591.    22222222222222222          11111111111111111111111
  592.    2222222222222222222        11111111111111111111111
  593.    22222222222222222222       11111111111111111111111
  594.    22222          22222                11111
  595.    22222          22222                11111
  596.    22222          22222                11111
  597.    22222          22222                11111
  598.    22222          22222                11111
  599.    22222          22222                11111
  600.    22222222222222222222                11111
  601.    2222222222222222222                 11111
  602.    22222222222222222                   11111
  603.                                                                     
  604.                                                                     
  605. Yields output like this:
  606.  
  607. Co6&`R(D(v"i`<$$Co6&`R(D(v"i`<$$Co6&`R(D(v"i`<$$Co6&`R(D(v"i`<$$Co6&`R(D
  608. mwBy&>`,QFdZ<$wamwBy&>`,QFdZ<$wamwBy&>`,QFdZ<$wamwBy&>`,QFdZ<$wamwBy&>`,
  609. 7Z,o:.sw5[rHt&{:7Z,osw5[rHt&{:7Z,osw505[rHt&{:7Zosw505[rHt&{:7Zosw505[rR
  610. g"EzQy{lW_3C&B[8g"Ez{lW_3C&B[8g"Ez{lW_3S3C&B[8g"z{lW_3S3C&B[8g"z{lW_3S3y
  611. yiQ?fiVF!G{TAtrJyiQ?VF!G{TAtrJyiQ?VF!G{T]TAtrJyi?VF!G{T]TAtrJyi?VF!G{T]s
  612. 1`I|r?FLoB#<sf!Q1`I|FLoB#T#<sf!Q1`ILoB#TaT#<sf!Q1`ILoB#Ta#<sf!#Q1`ILoB#T
  613. m$LuSD0hh7\qy5:nm$Lu0hh7\x\qy5:nm$Lhh7\x"x\qy5:nm$Lhh7\x"\qy5:-nm$Lhh7\x
  614. [#7hrqKUm`/<bic$[#7hKUm`/7/<bic$[#7Um`/7r7/<bic$[#7Um`/7r/<bick$[#7Um`/7
  615. L,'O)X\L&Xu)ZUw(L,'O\L&Xu|u)ZUw(L,'L&Xu|y|u)ZUw(L,'L&Xu|yu)ZUwy(L,'L&Xu|
  616. 3`#YPTdg:,;rmy9`3`#Ydg:,;(;rmy9`3`#g:,;(7(;rmy9`3`#g:,;(7;rmy94`3`#g:,;(
  617. 1w^N7d;f964U,yml1w^N;f964&4U,yml1w^f964&;&4U,yml1w^f964&;4U,ym{l1w^f964&
  618. <>Y8igID(]?"A0+;<>Y8ID(]?"A0+;<>Y8ID(]?"?"A0+;<>Y8ID(]?"?A0+;<O>Y8ID(]?"
  619. eRl5hfJx.cD0tscheRl5Jx.cD0tscheRl5Jx.cDeD0tscheRl5Jx.cDeDtscheiRl5Jx.cDe
  620. v,r7f6%<)R-AaV^hv,r7%<)R-AaV^hv,r7%<)p)R-AaV^hv,r7%<)p)R-aV^hv>,r7%<)p)R
  621. VbWqd^]qi(IRW)ytVbWqd^]qi(IRW)ytVbWqd^]qi(IRW)ytVbWqd^]qi(IRW)ytVbWqd^]q
  622. `^Y-z8v=[gBX(Aqq`^Y-z8v=[gBX(Aqq`^Y-z8v=[gBX(Aqq`^Y-z8v=[gBX(Aqq`^Y-z8v=
  623.  
  624.  
  625. This uses 16 as the Max pattern size.  Notice on the third line of the 
  626. output (the first line with level changes), the pattern is "7Z ... &{:".
  627. When we go from level 0 to level 2, we lose two characters (i.e., ":.").
  628. When we go from level 2 back to level 0, we insert two new characters 
  629. (i.e., "05" after the "osw5").
  630.  
  631. Any questions?  Or better yet, what did I leave out??  I do hope this helps 
  632. someone!?!
  633.  
  634.  
  635. -----------------------------------------------------------------------
  636. ----- SIRDS PUBLICATIONS ----------------------------------------------
  637. -----------------------------------------------------------------------
  638.  
  639. Search library databases with these keywords: Stereogram, Autostereogram, 
  640. SIRDS (Single ImageRandom Dot Stereogram), RDS.
  641.  
  642. >From E.Thompson@ncl.ac.uk
  643.  
  644. An excellent source of information (sample RDS and source code)
  645. is contained in Andrew A.Kinsman - Random Dot Stereograms
  646. ISBN 0-9630142-1-8  $13.95 U.S.  Published by Kinsman Physics, 
  647. P.O. Box 22682, Rochester, N.Y. 14692-2682
  648.  
  649. See the following periodicals:
  650. Journal of Imaging Science and Technology, May/June 1992, Vol 36, #3.
  651.    Slinker & Burton
  652.  
  653. SEND MORE REFERENCES!
  654.  
  655.  
  656.  
  657. -----------------------------------------------------------------------
  658. ----- SAMPLE TEXT Stereograms (Not random) ----------------------------
  659. -----------------------------------------------------------------------
  660.  
  661. From: dthomas@bbx.basis.com (Dave Thomas)
  662.                                                                         
  663.                             O   O
  664. n   n   n   n   n   n   n   n   n   n   n   n   n   n   n  n
  665. f    f    f    f    f    f    f    f    f    f    f    f   f
  666. e   e   e   e   e   e   e   e   e   e   e   e   e   e   e  e
  667. a    a    a    a    a    a    a    a    a    a    a    a   a
  668. a   a   a   a   a   a   a   a   a   a   a   a   a   a   a  a
  669. r    r    r    r    r    r    r    r    r    r    r    r   r
  670. r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r
  671.         
  672.  
  673.  
  674. g  g  g  g  g  g  g  g  g  g  g  g  g  g  g  g  g  g  g  g  g  g  g  g  g
  675. r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r
  676.  e    e    e    e    e    e    e    e    e    e    e    e    e    e    e
  677. a     a     a     a     a     a     a     a     a     a     a     a     a
  678.  t      t      t      t      t      t      t      t      t      t      t
  679. <<<<>>>><<<<>>>><<<<>>>><<<<>>>><<<<>>>><<<<>>>><<<<>>>><<<<>>>><<<<>>>>
  680.  d      d      d      d      d      d      d      d      d      d      d
  681. e     e     e     e     e     e     e     e     e     e     e     e     e
  682.  p    p    p    p    p    p    p    p    p    p    p    p    p    p    p
  683. t   t   t   t   t   t   t   t   t   t   t   t   t   t   t   t   t   t   t
  684. h  h  h  h  h  h  h  h  h  h  h  h  h  h  h  h  h  h  h  h  h  h  h  h  h
  685.  
  686.  
  687. One more from ... well ... YOU figure it out!
  688.  
  689. _-~-_-~-_-~-_-~-_-~-_-~-_-~-_-~-_-~-_-~-_-~-_-~-_-~-_-~-_-~-_-~-_-~-_-~-_-~
  690. !   Adam      Adam      Adam      Adam      Adam      Adam   ! "Lawn       !
  691. !Spragg   Spragg   Spragg   Spragg   Spragg   Spragg   Spragg!   service!" !
  692. !   Adam      Adam      Adam      Adam      Adam      Adam   !       -Stup !
  693. !Spragg   Spragg   Spragg   Spragg   Spragg   Spragg   Spragg!             !
  694. !   Adam      Adam      Adam      Adam      Adam      Adam   !  atspragg@  !
  695. !Spragg   Spragg   Spragg   Spragg   Spragg   Spragg   Spragg! ucdavis.edu !
  696. !   Adam      Adam      Adam      Adam      Adam      Adam   !   GO AGS!   !
  697. _-~-_-~-_-~-_-~-_-~-_-~-_-~-_-~-_-~-_-~-_-~-_-~-_-~-_-~-_-~-_-~-_-~-_-~-_-~
  698.  
  699.  
  700.  
  701. -----------------------------------------------------------------------
  702. ----- C CODE TO GENERATE TEXT STEREOGRAMS -----------------------------
  703. -----------------------------------------------------------------------
  704.  
  705. Also from Dave Thomas:
  706.  
  707. Now here's a hack of a hack I found on the net.  Basically it generates
  708. stereograms from ascii diagrams.  Here's the program first:
  709.  
  710. #define DEPTH0  16
  711. #define COLS    79
  712.  
  713. #include <stdio.h>
  714.  
  715. main()
  716.    {
  717.    long now;
  718.    int col;
  719.    char m[COLS+1],s[COLS+1];
  720.    int i,e,c;
  721.  
  722.    /* seed random number generator */
  723.    time (&now);
  724.    srand (now);
  725.  
  726.    /* print fusion X's */
  727.    for (col = 0; COLS - col >= DEPTH0; col += DEPTH0)
  728.       {
  729.       for (i = 0; i < DEPTH0-1; ++i)
  730.          putchar (' ');
  731.       putchar ('X');
  732.       }
  733.    putchar ('\n');
  734.  
  735.    /* process input image */
  736.    while (memset(m,'\0',COLS+1),fgets (m, COLS+1, stdin))
  737.       {
  738.       e = 0;
  739.       s[COLS] = 0;
  740.       for(i=0; i<COLS; )
  741.          {
  742.          e = 0;
  743.          while (i >= DEPTH0 && i < COLS && 
  744.             (c = m[i - DEPTH0]) >= '0' && c <= '9')
  745.             {
  746.             e = 1;
  747.             s[i] = s[i-DEPTH0+c-'0'];
  748.             ++i;
  749.             }
  750.          s[i++] = (e || i < DEPTH0) ? randasc() : s[i-DEPTH0];
  751.          }
  752.       puts (s);
  753.       }
  754. }
  755.  
  756. randasc()
  757. {
  758.    /* large set of random characters */
  759.    return ('!'+rand()%92);
  760.  
  761.    /* lowercase random letters */
  762.    /* return ('a'+rand()%26); */
  763. }
  764.  
  765.  
  766. Try passing it this file as the standard input:
  767.                                 
  768.            22222222222222222           11111111111111111111111
  769.            2222222222222222222         11111111111111111111111
  770.            22222222222222222222        11111111111111111111111
  771.            22222          22222                 11111
  772.            22222          22222                 11111
  773.            22222          22222                 11111
  774.            22222          22222                 11111
  775.            22222          22222                 11111
  776.            22222          22222                 11111
  777.            22222222222222222222                 11111
  778.            2222222222222222222                  11111
  779.            22222222222222222                    11111
  780.                                                                         
  781.                                                                         
  782. You'll get output like this:
  783.  
  784.                X               X               X              X
  785. "i`<$$Co6&`R(D(v"i`<$$Co6&`R(D(v"i`<$$Co6&`R(D(v"i`<$$Co6&`R(D(v"i`<$$Co6&`R(D
  786. dZ<$wamwBy&>`,QFdZ<$wamwBy&>`,QFdZ<$wamwBy&>`,QFdZ<$wamwBy&>`,QFdZ<$wamwBy&>`,
  787. rHt&{:7Z,o:.sw5[rHt&{:7Z,osw5[rHt&{:7Z,osw505[rHt&{:7Zosw505[rHt&{:7Zosw505[rR
  788. 3C&B[8g"EzQy{lW_3C&B[8g"Ez{lW_3C&B[8g"Ez{lW_3S3C&B[8g"z{lW_3S3C&B[8g"z{lW_3S3y
  789. {TAtrJyiQ?fiVF!G{TAtrJyiQ?VF!G{TAtrJyiQ?VF!G{T]TAtrJyi?VF!G{T]TAtrJyi?VF!G{T]s
  790. #<sf!Q1`I|r?FLoB#<sf!Q1`I|FLoB#T#<sf!Q1`ILoB#TaT#<sf!Q1`ILoB#Ta#<sf!#Q1`ILoB#T
  791. \qy5:nm$LuSD0hh7\qy5:nm$Lu0hh7\x\qy5:nm$Lhh7\x"x\qy5:nm$Lhh7\x"\qy5:-nm$Lhh7\x
  792. /<bic$[#7hrqKUm`/<bic$[#7hKUm`/7/<bic$[#7Um`/7r7/<bic$[#7Um`/7r/<bick$[#7Um`/7
  793. u)ZUw(L,'O)X\L&Xu)ZUw(L,'O\L&Xu|u)ZUw(L,'L&Xu|y|u)ZUw(L,'L&Xu|yu)ZUwy(L,'L&Xu|
  794. ;rmy9`3`#YPTdg:,;rmy9`3`#Ydg:,;(;rmy9`3`#g:,;(7(;rmy9`3`#g:,;(7;rmy94`3`#g:,;(
  795. 4U,yml1w^N7d;f964U,yml1w^N;f964&4U,yml1w^f964&;&4U,yml1w^f964&;4U,ym{l1w^f964&
  796. ?"A0+;<>Y8igID(]?"A0+;<>Y8ID(]?"A0+;<>Y8ID(]?"?"A0+;<>Y8ID(]?"?A0+;<O>Y8ID(]?"
  797. D0tscheRl5hfJx.cD0tscheRl5Jx.cD0tscheRl5Jx.cDeD0tscheRl5Jx.cDeDtscheiRl5Jx.cDe
  798. -AaV^hv,r7f6%<)R-AaV^hv,r7%<)R-AaV^hv,r7%<)p)R-AaV^hv,r7%<)p)R-aV^hv>,r7%<)p)R
  799. IRW)ytVbWqd^]qi(IRW)ytVbWqd^]qi(IRW)ytVbWqd^]qi(IRW)ytVbWqd^]qi(IRW)ytVbWqd^]q
  800. BX(Aqq`^Y-z8v=[gBX(Aqq`^Y-z8v=[gBX(Aqq`^Y-z8v=[gBX(Aqq`^Y-z8v=[gBX(Aqq`^Y-z8v=
  801.  
  802.  
  803.  
  804. -----------------------------------------------------------------------
  805. ----- HOPE FOR THE HOPELESS :-) ---------------------------------------
  806. -----------------------------------------------------------------------
  807.  
  808. From: wchaga@vela.acs.oakland.edu (William C. Haga)
  809.  
  810. Being one who has used wide-eyed vision on chain link fences ever
  811. since I was a kid, I was able to see the images in SIRDS right
  812. away. But I've had difficulty explaining the technique to 
  813. friends. Today I had the latest Games magazine with me at my parents
  814. house. Games is running another contest using SIRDS, so there are
  815. three in the latest issue. This time I thought of the reflection
  816. idea. So I opened mom's china cabinet, put the magazine against the
  817. glass in the door, and told mom to keep looking at her own reflection
  818. in the glass until the image appeared.
  819.  
  820. It took less than thirty seconds.
  821.  
  822. When she saw the 3d train engines, I was subjected to a squeal of
  823. delight that I hadn't heard from her for a long time. "EEK! IT'S
  824. COMING OUT AT ME! IS THIS EVER NEAT!".  Dad tried for about a minute
  825. but gave up.
  826.  
  827. About an hour later, mom and I heard a shout. We went to
  828. the dining area, and there was dad with the magazine against the
  829. glass in the door. "Isn't that just the most amazing thing!", said he.
  830.  
  831. Later they were making jokes about teaching old dogs new tricks.
  832.  
  833.  
  834. -----------------------------------------------------------------------
  835. ----- COMMERCIAL SIRDS Posters ----------------------------------------
  836. -----------------------------------------------------------------------
  837.  
  838. From: thale@novell.com (Todd D. Hale)
  839.  
  840. For those who do not have a local SIRDS distributor (i.e., the poster
  841. cart at the mall), here is one company you can order them from.  The 
  842. following posters are all certifiably cool with lots of great details,
  843. and come in nice colors.  They are (I believe) designed by NVision, or 
  844. something like that, and distributed here by Axis Corp.
  845.  
  846. Posters:$25 Dinosaurs
  847.         $25 Discovery (Space shuttle and planet)
  848.         $25 Lady Liberty (U.S. Statue of Liberty)
  849.         $25 B-2 Stealth Bomber
  850.         $25 F-117 Bomber
  851.         $25 Nature's Majesty (Eagle with fish in talons, pine trees in bkgrd)
  852.         $30 Calypso Reef (Ocean Scene--new design, more detail)
  853.         Many more now, including small, $15 posters.
  854.  
  855. Address:Axis Corp.
  856.         1732 S. 790 W.
  857.         Salt Lake City, UT 84104
  858.         USA
  859. Phone:  (801)977-8816
  860.  
  861. You must include $5 for shipping and a poster tube.  (The guy quoted me
  862. that price for shipping to Australia.)  Or, you can pay $17 for a tube
  863. in a box.  Although they haven't had any problems shipping in the poster
  864. tubes, they only guarantee safe delivery in a well-packed box.
  865.  
  866. Since I'm writing from the U.S., all currency mentioned here is in U.S.
  867. dollars.
  868.  
  869. And, by no means am I associated with these guys at all, except I spend a
  870. lot of time enjoying their posters!  (i.e., this is not an ad, but a 
  871. response to a request for SIRDS access.)
  872.  
  873.  
  874. ANOTHER SUPPLIER:
  875.  
  876. Infix Technologies
  877. PO Box 381
  878. Orem, UT 84057-0381
  879. (801) 221-9233
  880.  
  881. Shipping now:
  882. 18x24 Earth (mercator projection of the Earth's altitudes)
  883. 18x24 Salt Lake LDS Temple Centennial
  884.  
  885. Later this week?:
  886. 18x24 Beethoven
  887.  
  888. (others are coming soon, too.)
  889.  
  890. Retail price for the 18x24 inch prints is $20 plus $3 s/h.  Utah residents
  891. add 6.25% sales tax.  Wholesale and distributor discounts are available.
  892. Quotes for custom work are also available.  Cost and minimum order varies, 
  893. based on content.
  894.  
  895. John M. Olsen
  896. jolsen@nyx.cs.du.edu
  897.  
  898.  
  899. Todd D. Hale
  900. thale@novell.com
  901. halet@ernie.cs.byu.edu
  902. ---------------------------------          _  /X\     ------------------
  903. Unofficially speaking, of course.     :^/_/__// \\_    relax!
  904. ----------------------------------------- \__ --------------------------
  905.  
  906.  
  907.