Namespace std.geom Alias Planef:Plane Struct Plane Field n:Vec3 Field d:T Method New() End Method New( nx:Float,ny:Float,nz:Float,d:Float ) n.x=nx;n.y=ny;n.z=nz;Self.d=d End Method New( n:Vec3,d:T ) Self.n=n Self.d=d End Method New( p:Vec3,n:Vec3 ) Self.n=n Self.d=-n.Dot( p ) End Method New( v0:Vec3,v1:Vec3,v2:Vec3 ) n=(v1-v0).Cross(v2-v0).Normalize() d=-n.Dot( v0 ) End Operator-:Plane() Return New Plane( -n,-d ) End Method Distance:Double( p:Vec3 ) Return n.Dot( p )+d End Method Nearest:Vec3( p:Vec3 ) Return p-n*Distance( p ) End Method Normalize:Plane() Local l:=n.Length Return New Planef( n/l,d/l ) End Method TIntersect:Double( line:Line ) Return -Distance( line.o )/n.Dot( line.d ) End Method Intersect:Vec3( line:Line ) Return line * TIntersect( line ) End Method Intersect:Line( p:Plane ) Local v:=n.Cross( p.n ).Normalize() Local o:=p.Intersect( New Line( n*-d,n.Cross( v ) ) ) Return New Line( o,v ) End Operator To:String() Return "Plane("+n+","+d+")" End End