gouraudtriangle.ps
上传用户:xk288cn
上传日期:2007-05-28
资源大小:4876k
文件大小:3k
源码类别:

GIS编程

开发平台:

Visual C++

  1. %!PS
  2. % this code is free
  3. % Frederic Delhoume (delhoume@ilog.fr)
  4. /bd{bind def}bind def
  5. % use small threshold to have a smooth shading
  6. /threshold .1 def
  7. /triangle % [x1 x2 x3 y1 y2 y3] [i1 i2 i3]
  8. {
  9.   aload pop   setrgbcolor  
  10.   aload pop
  11.   5 3 roll % x1 y1 y2 y3 x2 x3
  12.   4 2 roll % x1 y1 x2 x3 y2 y3
  13.   3 2 roll % x1 y1 x2 y2 y3 x3
  14.   exch moveto lineto lineto closepath fill
  15. } bd
  16. /computediff1 % i31 i21 i11 -> true/false
  17. {
  18.   2 copy sub abs threshold ge % |i21-i11| > threshold
  19.   {pop pop pop true}
  20.   {
  21.     exch 2 index sub abs threshold ge % |i21-i31| > threshold
  22.     { pop pop true}
  23.     {
  24.       sub abs threshold ge % |i11-i31| > threshold
  25.     } ifelse
  26.   } ifelse
  27. } bd
  28. /computediff3 % [i11 i12 i13] [i21 i22 i23] [i31 i32 i33] -> true/false
  29. {
  30.   3 copy 0 get 3 1 roll 0 get 3 1 roll 0 get computediff1 
  31.   {true}
  32.   {
  33.     3 copy 1 get 3 1 roll 1 get 3 1 roll 1 get computediff1 
  34.     {true}
  35.     {
  36.       3 copy 2 get 3 1 roll  2 get 3 1 roll 2 get computediff1 
  37.     } ifelse
  38.   } ifelse
  39. } bd
  40. /middlecolor % [ar ag ab] [br bg bb] -> cr cg cb
  41. {
  42.   aload pop 4 -1 roll aload pop
  43.   4 -1 roll add 2 div 5 1 roll 3 -1 roll add 2 div 3 1 roll
  44.   add 2 div 3 1 roll exch 3 array astore
  45. } bd
  46.   
  47. /gouraudtriangle % [x1 x2 x3 y1 y2 y3] [i11 i12 i13] [i21 i22 i23] [i31 i32 i33]
  48. {
  49.   computediff3 
  50.   { 
  51.     % [x1 x2 x3 y1 y2 y3] [i11 i12 i13] [i21 i22 i23] [i31 i32 i33]
  52.     4 -1 roll % [i11 i12 i13] [i21 i22 i23] [i31 i32 i33] [x1 x2 x3 y1 y2 y3]
  53.     % first is x2x3y2y3
  54.     aload 7 1 roll 
  55.     6 -1 roll pop 3 -1 roll pop
  56.     add 2 div 3 1 roll add 2 div exch % [x1 x2 x3 y1 y2 y3] mx23 my23
  57.     % second is x1x3y1y3
  58.     3 -1 roll aload 7 1 roll exch pop 4 -1 roll pop
  59.     add 2 div 3 1 roll add 2 div exch
  60.     % third is x1x2y1y2
  61.     3 -1 roll aload 7 1 roll pop 3 -1 roll pop 
  62.     add 2 div 3 1 roll add 2 div exch
  63.     7 3 roll % [x1 x2 x3 y1 y2 y3] ax ay bx by cx cy
  64.     10 -3 roll dup 3 index middlecolor % 1-3
  65.     4 1 roll 2 copy middlecolor % 2-3
  66.     4 1 roll 3 copy pop middlecolor 4 1 roll % 1-2
  67.     13 -1 roll aload pop
  68.     %  ax ay bx by cx cy cc cb ca cx1 cx2 cx3 x1 x2 x3 y1 y2 y3
  69.     % now it's time to build the triangles
  70.     % first is ax1c
  71.     17 index 6 index 15 index 19 index 6 index 17 index 6 array astore 
  72.     10 index 10 index 14 index gouraudtriangle
  73.     % second is ax2b
  74.     17 index 5 index 17 index 19 index 5 index 19 index 6 array astore
  75.     10 index 9 index 13 index gouraudtriangle
  76.     % third is cbx3 
  77.     13 index 16 index 5 index 15 index 18 index 5 index 6 array astore
  78.     12 index 12 index 9 index gouraudtriangle
  79.     % fourth is abc
  80.     17 index 16 index 15 index 19 index 18 index 17 index 6 array astore
  81.     10 index 12 index 14 index gouraudtriangle
  82.     18 {pop} repeat
  83.   }
  84.   {
  85.     aload pop 5 3 roll aload pop 7 3 roll aload pop 9 3 roll
  86.     4 index 6 index 4 index add add 3 div
  87.     10 1 roll 7 index 5 index 3 index add add 3 div
  88.     10 1 roll 6 index 4 index 2 index add add 3 div
  89.     10 1 roll 9 {pop} repeat
  90.     3 array astore triangle
  91.   } ifelse
  92. } bd
  93. %% here is an nice example 
  94. [200 200 300 500 350 300] [1 1 0] [0 1 0] [0 1 1] gouraudtriangle  
  95. [200 300 300 500 300 425] [1 1 0] [0 1 1] [1 1 1] gouraudtriangle
  96. [300 400 400 300 350 500] [0 1 1] [0 0 1] [1 0 1] gouraudtriangle
  97. [300 400 300 300 500 425] [0 1 1] [1 0 1] [1 1 1] gouraudtriangle
  98. [300 300 400 550 425 500] [1 0 0] [1 1 1] [1 0 1] gouraudtriangle 
  99. [200 300 300 500 425 550] [1 1 0] [1 1 1] [1 0 0] gouraudtriangle
  100. showpage