box.monkey2 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  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( p:Vec3<T> )
  15. Self.min=p
  16. Self.max=p
  17. End
  18. Method New( min:T,max:T )
  19. Self.min=New Vec3<T>( min )
  20. Self.max=New Vec3<T>( max )
  21. End
  22. Method New( min:Vec3<T>,max:Vec3<T> )
  23. Self.min=min
  24. Self.max=max
  25. End
  26. Method New( x0:T,y0:T,z0:T,x1:T,y1:T,z1:T )
  27. min.x=x0;min.y=y0;min.z=z0
  28. max.x=x1;max.y=y1;max.z=z1
  29. End
  30. Operator To:String()
  31. Return "Box("+min+","+max+")"
  32. End
  33. Operator To<C>:Box<C>()
  34. Return New Box<C>( min,max )
  35. End
  36. Property Empty:Bool()
  37. Return max.x<=min.x Or max.y<=min.y Or max.z<=min.z
  38. End
  39. Property Center:Vec3<T>()
  40. Return (min+max)/2
  41. End
  42. Property Size:Vec3<T>()
  43. Return max-min
  44. End
  45. Property Width:T()
  46. Return max.x-min.x
  47. End
  48. Property Height:T()
  49. Return max.y-min.y
  50. End
  51. Property Depth:T()
  52. Return max.z-min.z
  53. End
  54. Operator+:Box( v:Vec3<T> )
  55. Return New Box( min+v,max+v )
  56. End
  57. Operator+=( v:Vec3<T> )
  58. min+=v
  59. max+=v
  60. End
  61. Operator-:Box( v:Vec3<T> )
  62. Return New Box( min-v,max-v )
  63. End
  64. Operator-=( v:Vec3<T> )
  65. min-=v
  66. max-=v
  67. End
  68. Operator&:Box( box:Box )
  69. Return New Box(
  70. Max( min.x,box.min.x ),
  71. Max( min.y,box.min.y ),
  72. Max( min.z,box.min.z ),
  73. Min( max.x,box.max.x ),
  74. Min( max.y,box.max.y ),
  75. Min( max.z,box.max.z ) )
  76. End
  77. Operator&=( box:Box )
  78. min.x=Max( min.x,box.min.x )
  79. min.y=Max( min.y,box.min.y )
  80. min.z=Max( min.z,box.min.z )
  81. max.x=Min( max.x,box.max.x )
  82. max.y=Min( max.y,box.max.y )
  83. max.z=Min( max.z,box.max.z )
  84. End
  85. Operator|:Box( box:Box )
  86. Return New Box(
  87. Min( min.x,box.min.x ),
  88. Min( min.y,box.min.y ),
  89. Min( min.z,box.min.z ),
  90. Max( max.x,box.max.x ),
  91. Max( max.y,box.max.y ),
  92. Max( max.z,box.max.z ) )
  93. End
  94. Operator|=( box:Box )
  95. min.x=Min( min.x,box.min.x )
  96. min.y=Min( min.y,box.min.y )
  97. min.z=Min( min.z,box.min.z )
  98. max.x=Max( max.x,box.max.x )
  99. max.y=Max( max.y,box.max.y )
  100. max.z=Max( max.z,box.max.z )
  101. End
  102. Operator|:Box( p:Vec3<T> )
  103. Return New Box(
  104. Min( min.x,p.x ),
  105. Min( min.y,p.y ),
  106. Min( min.z,p.z ),
  107. Max( max.x,p.x ),
  108. Max( max.y,p.y ),
  109. Max( max.z,p.z ) )
  110. End
  111. Operator|=( p:Vec3<T> )
  112. min.x=Min( min.x,p.x )
  113. min.y=Min( min.y,p.y )
  114. min.z=Min( min.z,p.z )
  115. max.x=Max( max.x,p.x )
  116. max.y=Max( max.y,p.y )
  117. max.z=Max( max.z,p.z )
  118. End
  119. Method Contains:bool( box:Box )
  120. 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
  121. End
  122. Method Intersects:Bool( box:Box )
  123. 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
  124. End
  125. Method Corner:Vec3<T>( index:int )
  126. Select index
  127. Case 0 Return min
  128. case 1 Return New Vec3<T>( max.x,min.y,min.z )
  129. case 2 Return New Vec3<T>( min.x,max.y,min.z )
  130. case 3 Return New Vec3<T>( max.x,max.y,min.z )
  131. Case 4 Return New Vec3<T>( min.x,min.y,max.z )
  132. Case 5 Return New Vec3<T>( max.x,min.y,max.z )
  133. Case 6 Return New Vec3<T>( min.x,max.y,max.z )
  134. Case 7 Return max
  135. End
  136. RuntimeError( "Invalid box corner index: "+index )
  137. Return Null
  138. End
  139. End