2
0

plane.monkey2 988 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. Namespace std.geom
  2. #rem monkeydoc @hidden
  3. #end
  4. Alias Planef:Plane<Float>
  5. #rem monkeydoc @hidden
  6. #end
  7. Struct Plane<T>
  8. Field n:Vec3<T>
  9. Field d:T
  10. Method New()
  11. End
  12. Method New( n:Vec3<T>,d:T )
  13. Self.n=n
  14. Self.d=d
  15. End
  16. Method New( p:Vec3<T>,n:Vec3<T> )
  17. Self.n=n
  18. Self.d=-n.Dot( p )
  19. End
  20. Method New( v0:Vec3<T>,v1:Vec3<T>,v2:Vec3<T> )
  21. n=(v1-v0).Cross(v2-v0).Normalize()
  22. d=-n.Dot( v0 )
  23. End
  24. Operator-:Plane()
  25. Return New Plane( -n,-d )
  26. End
  27. Method Distance:Double( p:Vec3<T> )
  28. Return n.Dot( p )+d
  29. End
  30. Method Nearest:Vec3<T>( p:Vec3<T> )
  31. Return p-n*Distance( p )
  32. End
  33. Method TIntersect:Double( line:Line<T> )
  34. Return -Distance( line.o )/n.Dot( line.d )
  35. End
  36. Method Intersect:Vec3<T>( line:Line<T> )
  37. Return line * TIntersect( line )
  38. End
  39. Method Intersect:Line<T>( p:Plane<T> )
  40. Local v:=n.Cross( p.n ).Normalize()
  41. Local o:=p.Intersect( New Line<T>( n*-d,n.Cross( v ) ) )
  42. Return New Line<T>( o,v )
  43. End
  44. End