box.monkey2 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. Namespace std.geom
  2. #rem monkeydoc @hidden
  3. #end
  4. Alias Boxf:Box<Float>
  5. #rem monkeydoc @hidden
  6. #end
  7. Struct Box<T>
  8. Const FullBounds:=New Box( -1000000,-1000000,-1000000,1000000,1000000,1000000 )
  9. Const EmptyBounds:=New Box( 1000000,1000000,1000000,-1000000,-1000000,-1000000 )
  10. Field min:Vec3<T>
  11. Field max:Vec3<T>
  12. Method New()
  13. End
  14. Method New( min:T,max:T )
  15. Self.min=New Vec3<T>( min )
  16. Self.max=New Vec3<T>( max )
  17. End
  18. Method New( min:Vec3<T>,max:Vec3<T> )
  19. Self.min=min
  20. Self.max=max
  21. End
  22. Method New( x0:T,y0:T,z0:T,x1:T,y1:T,z1:T )
  23. min.x=x0;min.y=y0;min.z=z0
  24. max.x=x1;max.y=y1;max.z=z1
  25. End
  26. Operator To:String()
  27. Return "Box("+min+","+max+")"
  28. End
  29. Operator To<C>:Box<C>()
  30. Return New Box<C>( min,max )
  31. End
  32. Property Empty:Bool()
  33. Return max.x<=min.x Or max.y<=min.y Or max.z<=min.z
  34. End
  35. Property Center:Vec3<T>()
  36. Return (min+max)/2
  37. End
  38. Property Size:Vec3<T>()
  39. Return max-min
  40. End
  41. Operator+:Box( v:Vec3<T> )
  42. Return New Box( min+v,max+v )
  43. End
  44. Operator+=( v:Vec3<T> )
  45. min+=v
  46. max+=v
  47. End
  48. Operator-:Box( v:Vec3<T> )
  49. Return New Box( min-v,max-v )
  50. End
  51. Operator-=( v:Vec3<T> )
  52. min-=v
  53. max-=v
  54. End
  55. Operator&:Box( box:Box )
  56. Return New Box(
  57. Max( min.x,box.min.x ),
  58. Max( min.y,box.min.y ),
  59. Max( min.z,box.min.z ),
  60. Min( max.x,box.max.x ),
  61. Min( max.y,box.max.y ),
  62. Min( max.z,box.max.z ) )
  63. End
  64. Operator&=( box:Box )
  65. min.x=Max( min.x,box.min.x )
  66. min.y=Max( min.y,box.min.y )
  67. min.z=Max( min.z,box.min.z )
  68. max.x=Min( max.x,box.max.x )
  69. max.y=Min( max.y,box.max.y )
  70. max.z=Min( max.z,box.max.z )
  71. End
  72. Operator|:Box( box:Box )
  73. Return New Box(
  74. Min( min.x,box.min.x ),
  75. Min( min.y,box.min.y ),
  76. Min( min.z,box.min.z ),
  77. Max( max.x,box.max.x ),
  78. Max( max.y,box.max.y ),
  79. Max( max.z,box.max.z ) )
  80. End
  81. Operator|=( box:Box )
  82. min.x=Min( min.x,box.min.x )
  83. min.y=Min( min.y,box.min.y )
  84. min.z=Min( min.z,box.min.z )
  85. max.x=Max( max.x,box.max.x )
  86. max.y=Max( max.y,box.max.y )
  87. max.z=Max( max.z,box.max.z )
  88. End
  89. Operator|:Box( p:Vec3<T> )
  90. Return New Box(
  91. Min( min.x,p.x ),
  92. Min( min.x,p.y ),
  93. Min( min.x,p.z ),
  94. Max( max.x,p.x ),
  95. Max( max.y,p.y ),
  96. Max( max.z,p.z ) )
  97. End
  98. Operator|=( p:Vec3<T> )
  99. min.x=Min( min.x,p.x )
  100. min.y=Min( min.x,p.y )
  101. min.z=Min( min.x,p.z )
  102. max.x=Max( max.x,p.x )
  103. max.y=Max( max.y,p.y )
  104. max.z=Max( max.z,p.z )
  105. End
  106. Method Contains:bool( box:Box )
  107. Return min.x>=box.min.x And max.x<=box.max.x And min.y>=box.min.y And max.y<=box.max.y And min.z>=box.min.z And min.z<=box.max.z
  108. End
  109. Method Intersects:Bool( box:Box )
  110. Return min.x<box.max.x And max.x>box.min.x And min.y<box.max.y And max.y>box.min.y And min.z<box.max.z And max.z>box.min.z
  111. End
  112. Method Corner:Vec3<T>( index:int )
  113. Select index
  114. Case 0 Return min
  115. case 1 Return New Vec3<T>( max.x,min.y,min.z )
  116. case 2 Return New Vec3<T>( min.x,max.y,min.z )
  117. case 3 Return New Vec3<T>( max.x,max.y,min.z )
  118. Case 4 Return New Vec3<T>( min.x,min.y,max.z )
  119. Case 5 Return New Vec3<T>( max.x,min.y,max.z )
  120. Case 6 Return New Vec3<T>( min.x,max.y,max.z )
  121. Case 7 Return max
  122. End
  123. RuntimeError( "Invalid box corner index: "+index )
  124. Return Null
  125. End
  126. End