//----------------------------------------------------------------// bool USSurface2D::GetTouch ( ZLVec2D& sphereLoc, ZLSurfaceTouch2D& touch ) { // The usual stuff... float dist = ZLDist::PointToPlane2D ( sphereLoc, *this ); if ( dist <= 0.0f ) return false; if ( dist > 1.001f ) return false; // Get the point of first contact on the polygon... ZLVec2D pofcop = this->mNorm; pofcop.Reverse (); pofcop.Add ( sphereLoc ); this->ClampPoint ( pofcop ); ZLVec2D ray = pofcop; ray.Sub ( sphereLoc ); dist = ray.NormSafe (); if ( dist >= touch.mDist ) return false; float dot = ray.Dot ( touch.mFinger ); if ( dot < 0.85f ) return false; // we have a touch... touch.mDist = dist; touch.mPoint = pofcop; touch.mTouch = true; touch.mHit = !touch.mPrevTouch; //touch.mNorm = this->GetNorm (); return true; }
//----------------------------------------------------------------// ZLVec2D USSurface2D::GetNorm ( const ZLVec2D& e0, const ZLVec2D& e1 ) { ZLVec2D norm; norm = e0; norm.Sub ( e1 ); norm.Rotate90Anticlockwise (); norm.Norm (); return norm; }
//----------------------------------------------------------------// bool USSurface2D::GetContact ( ZLVec2D& sphereLoc, ZLVec2D& contact, ZLVec2D& norm ) { // The usual stuff... float dist = ZLDist::PointToPlane2D ( sphereLoc, *this ); if ( dist <= 0.0f ) return false; if ( dist > 1.001f ) return false; // Get the point of first contact on the polygon... contact = this->mNorm; contact.Reverse (); contact.Add ( sphereLoc ); this->ClampPoint ( contact ); norm = sphereLoc; norm.Sub ( contact ); dist = norm.NormSafe (); if ( dist > 1.001f ) return false; return true; }
//----------------------------------------------------------------// void MOAIVectorUtil::ComputeLineJoins ( MOAIVectorLineJoin* joins, const ZLVec2D* verts, int nVerts, bool open, bool forward, bool interior ) { int top = nVerts - 1; float scale = interior ? -1.0f : 1.0f; if ( forward ) { for ( int i = 0; i < nVerts; ++i ) { joins [ i ].mVertex = verts [ i ]; } } else { for ( int i = 0; i < nVerts; ++i ) { joins [ i ].mVertex = verts [ top - i ]; } } for ( int i = 0; i < nVerts; ++i ) { ZLVec2D v0 = joins [ i ].mVertex; ZLVec2D v1 = joins [( i + 1 ) % nVerts ].mVertex; ZLVec2D n = v1; n.Sub ( v0 ); n.Norm (); joins [ i ].mEdgeVec = n; n.Rotate90Anticlockwise (); n.Scale ( scale ); joins [ i ].mEdgeNorm = n; joins [ i ].mIsCap = false; } int start = 0; int max = nVerts; if ( open ) { joins [ 0 ].mIsCap = true; joins [ 0 ].mJointNorm = joins [ 0 ].mEdgeNorm; joins [ top ].mIsCap = true; joins [ top ].mEdgeVec = joins [ top - 1 ].mEdgeVec; joins [ top ].mEdgeNorm = joins [ top - 1 ].mEdgeNorm; joins [ top ].mJointNorm = joins [ top ].mEdgeNorm; start = 1; max = top; } for ( int i = start; i < max; ++i ) { ZLVec2D n = joins [( i + top ) % nVerts ].mEdgeNorm; n.Add ( joins [ i ].mEdgeNorm ); n.Norm (); joins [ i ].mJointNorm = n; } }