box.monkey2 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. Namespace std.geom
  2. Alias Boxf:Box<Float>
  3. Struct Box<T>
  4. Const FullBounds:=New Box( -1000000,-1000000,-1000000,1000000,1000000,1000000 )
  5. Const EmptyBounds:=New Box( 1000000,1000000,1000000,-1000000,-1000000,-1000000 )
  6. Field min:Vec3<T>
  7. Field max:Vec3<T>
  8. Method New()
  9. End
  10. Method New( p:Vec3<T> )
  11. Self.min=p
  12. Self.max=p
  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. Property Width:T()
  42. Return max.x-min.x
  43. End
  44. Property Height:T()
  45. Return max.y-min.y
  46. End
  47. Property Depth:T()
  48. Return max.z-min.z
  49. End
  50. Operator+:Box( v:Vec3<T> )
  51. Return New Box( min+v,max+v )
  52. End
  53. Operator+=( v:Vec3<T> )
  54. min+=v
  55. max+=v
  56. End
  57. Operator-:Box( v:Vec3<T> )
  58. Return New Box( min-v,max-v )
  59. End
  60. Operator-=( v:Vec3<T> )
  61. min-=v
  62. max-=v
  63. End
  64. Operator&:Box( box:Box )
  65. Return New Box(
  66. Max( min.x,box.min.x ),
  67. Max( min.y,box.min.y ),
  68. Max( min.z,box.min.z ),
  69. Min( max.x,box.max.x ),
  70. Min( max.y,box.max.y ),
  71. Min( max.z,box.max.z ) )
  72. End
  73. Operator&=( box:Box )
  74. min.x=Max( min.x,box.min.x )
  75. min.y=Max( min.y,box.min.y )
  76. min.z=Max( min.z,box.min.z )
  77. max.x=Min( max.x,box.max.x )
  78. max.y=Min( max.y,box.max.y )
  79. max.z=Min( max.z,box.max.z )
  80. End
  81. Operator|:Box( box:Box )
  82. Return New Box(
  83. Min( min.x,box.min.x ),
  84. Min( min.y,box.min.y ),
  85. Min( min.z,box.min.z ),
  86. Max( max.x,box.max.x ),
  87. Max( max.y,box.max.y ),
  88. Max( max.z,box.max.z ) )
  89. End
  90. Operator|=( box:Box )
  91. min.x=Min( min.x,box.min.x )
  92. min.y=Min( min.y,box.min.y )
  93. min.z=Min( min.z,box.min.z )
  94. max.x=Max( max.x,box.max.x )
  95. max.y=Max( max.y,box.max.y )
  96. max.z=Max( max.z,box.max.z )
  97. End
  98. Operator|:Box( p:Vec3<T> )
  99. Return New Box(
  100. Min( min.x,p.x ),
  101. Min( min.y,p.y ),
  102. Min( min.z,p.z ),
  103. Max( max.x,p.x ),
  104. Max( max.y,p.y ),
  105. Max( max.z,p.z ) )
  106. End
  107. Operator|=( p:Vec3<T> )
  108. min.x=Min( min.x,p.x )
  109. min.y=Min( min.y,p.y )
  110. min.z=Min( min.z,p.z )
  111. max.x=Max( max.x,p.x )
  112. max.y=Max( max.y,p.y )
  113. max.z=Max( max.z,p.z )
  114. End
  115. Method Contains:bool( box:Box )
  116. 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
  117. End
  118. Method Intersects:Bool( box:Box )
  119. 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
  120. End
  121. Method Corner:Vec3<T>( index:int )
  122. Select index
  123. Case 0 Return min
  124. case 1 Return New Vec3<T>( max.x,min.y,min.z )
  125. case 2 Return New Vec3<T>( min.x,max.y,min.z )
  126. case 3 Return New Vec3<T>( max.x,max.y,min.z )
  127. Case 4 Return New Vec3<T>( min.x,min.y,max.z )
  128. Case 5 Return New Vec3<T>( max.x,min.y,max.z )
  129. Case 6 Return New Vec3<T>( min.x,max.y,max.z )
  130. Case 7 Return max
  131. End
  132. RuntimeError( "Invalid box corner index: "+index )
  133. Return Null
  134. End
  135. End