示例#1
0
        private float PopulateCompleteSide(ref CrossSection face, int quadrant, float halfCubeWidth, bool outer)
        {
            V3ToV3Xna XnaOMV = new V3ToV3Xna();
            quadrant = NormalizeQuadrant(quadrant);

            face.RemoveAllPoints();

            OpenMetaverse.Vector3 startPoint = XnaOMV.V3XToV3(ReferenceVertices[quadrant]);
            OpenMetaverse.Vector3 endPoint;
            if (quadrant < NumberFaces - 1)
            {
                endPoint = XnaOMV.V3XToV3(ReferenceVertices[quadrant + 1]);
            }
            else
            {
                endPoint = XnaOMV.V3XToV3(ReferenceVertices[0]);
            }

            startPoint = startPoint * halfCubeWidth / 0.5f;
            endPoint = endPoint * halfCubeWidth / 0.5f;

            if (outer)
            {
                face.AddPoint(startPoint);
                face.AddPoint(endPoint);
            }
            else
            {
                face.AddPoint(endPoint);
                face.AddPoint(startPoint);
            }

            return 2f * halfCubeWidth;
        }
示例#2
0
        // Handles the first face in the cut, starting from cutstart,
        // and running anticlockwise to first reference vertex
        private float PopulateSingleCutFacePositiveDirection(ref CrossSection face, OpenMetaverse.Vector3 cutPoint, int quadrant, 
            float halfCubeWidth, bool outer)
        {
            V3ToV3Xna XnaOMV = new V3ToV3Xna();
            quadrant = NormalizeQuadrant(quadrant);

            face.RemoveAllPoints();

            OpenMetaverse.Vector3 startPoint = cutPoint;
            OpenMetaverse.Vector3 endPoint;
            if (quadrant < NumberFaces - 1)
            {
                endPoint = XnaOMV.V3XToV3(ReferenceVertices[quadrant + 1] * halfCubeWidth / 0.5f);
            }
            else
            {
                endPoint = XnaOMV.V3XToV3(ReferenceVertices[0] * halfCubeWidth / 0.5f);
            }

            if (outer)
            {
                face.AddPoint(startPoint);
                face.AddPoint(endPoint);
            }
            else
            {
                face.AddPoint(endPoint);
                face.AddPoint(startPoint);
            }

            return OpenMetaverse.Vector3.Distance(startPoint, endPoint);
        }
示例#3
0
        private OpenMetaverse.Vector3 GetCutIntersect(float cut, float cubeHalfWidth)
        {
            V3ToV3Xna XnaOMV = new V3ToV3Xna();
            int cutQuadrant = GetCutQuadrant(cut);

            OpenMetaverse.Vector3 lineend;
            OpenMetaverse.Vector3 linestart = XnaOMV.V3XToV3(ReferenceVertices[cutQuadrant] * cubeHalfWidth);
            linestart = OpenMetaverse.Vector3.Divide(linestart, 0.5f);
            if (cutQuadrant < NumberFaces - 1)
            {
                lineend = XnaOMV.V3XToV3(ReferenceVertices[cutQuadrant + 1] * cubeHalfWidth);
            }
            else
            {
                lineend = XnaOMV.V3XToV3(ReferenceVertices[0] * cubeHalfWidth);
            }
            lineend = OpenMetaverse.Vector3.Divide(lineend, 0.5f);

            //
            float angle = GetAngleWithXAxis(cut);

            // CutVectorPerp is perpendicular to the radius vector
            OpenMetaverse.Vector3 cutVectorPerp = new OpenMetaverse.Vector3((float)-Math.Sin(angle), (float)Math.Cos(angle), 0);
            OpenMetaverse.Vector3 delta = lineend - linestart;

            // From http://softsurfer.com/Archive/algorithm_0104/algorithm_0104B.htm
            OpenMetaverse.Vector3 result = linestart - delta * OpenMetaverse.Vector3.Dot(cutVectorPerp, linestart) / OpenMetaverse.Vector3.Dot(cutVectorPerp, delta);

            return result;
        }