예제 #1
0
        private static bool intersectEllipseCenter(ArcLoftPath a, out float offsetA, out float offsetB, Vector3 center, float radiusX, float radiusY, float bDirLen, Vector3 bStart, Vector3 bDir)
        {
            float nearDistance;
            float farDistance;

            if (VectorMath2D.IntersectsLineEllipse(t2d(bStart), t2d(bDir), Vector3.zero, radiusX, radiusY, out nearDistance, out farDistance))
            {
                float bestOffsetA = float.PositiveInfinity, bestOffsetB = float.PositiveInfinity;
                if (checkRange(a, bDir, center, bDirLen, bStart, nearDistance, ref bestOffsetA, ref bestOffsetB))
                {
                    offsetA = bestOffsetA;
                    offsetB = bestOffsetB;
                    return(true);
                }
                if (checkRange(a, bDir, center, bDirLen, bStart, farDistance, ref bestOffsetA, ref bestOffsetB))
                {
                    offsetA = bestOffsetA;
                    offsetB = bestOffsetB;
                    return(true);
                }
            }
            offsetA = offsetB = float.NaN;
            return(false);
        }
예제 #2
0
        private static bool intersectsEllipseEdge(ArcLoftPath a, Vector3 bStart, Vector3 bDir, Vector3 bTan, Vector3 center, float bDirLen, float widthB, float radiusX, float radiusY, out float offsetA, out float offsetB)
        {
            var startLeft  = bStart - bTan;
            var startRight = bStart + bTan;

            float outerRadiusX = radiusX + widthB;
            float outerRadiusY = radiusY + widthB;
            float innerRadiusX = radiusX - widthB;
            float innerRadiusY = radiusY - widthB;

            float nearDistanceInnerLeft, farDistanceInnerLeft;
            float nearDistanceInnerRight, farDistanceInnerRight;
            float nearDistanceOuterLeft, farDistanceOuterLeft;
            float nearDistanceOuterRight, farDistanceOuterRight;



            bool intersectsInnerLeft  = VectorMath2D.IntersectsLineEllipse(t2d(startLeft), t2d(bDir), Vector3.zero, innerRadiusX, innerRadiusY, out nearDistanceInnerLeft, out farDistanceInnerLeft);
            bool intersectsInnerRight = VectorMath2D.IntersectsLineEllipse(t2d(startRight), t2d(bDir), Vector3.zero, innerRadiusX, innerRadiusY, out nearDistanceInnerRight, out farDistanceInnerRight);

            bool intersectsOuterLeft  = VectorMath2D.IntersectsLineEllipse(t2d(startLeft), t2d(bDir), Vector3.zero, outerRadiusX, outerRadiusY, out nearDistanceOuterLeft, out farDistanceOuterLeft);
            bool intersectsOuterRight = VectorMath2D.IntersectsLineEllipse(t2d(startRight), t2d(bDir), Vector3.zero, outerRadiusX, outerRadiusY, out nearDistanceOuterRight, out farDistanceOuterRight);


            //if (intersectsOuterLeft)
            //    Debug.DrawLine(startLeft + bDir * nearDistanceOuterLeft, startLeft + bDir * farDistanceOuterLeft, Color.green);
            //if (intersectsOuterRight)
            //    Debug.DrawLine(startRight + bDir * nearDistanceOuterRight, startRight + bDir * farDistanceOuterRight, Color.green);

            //if (intersectsInnerLeft)
            //    Debug.DrawLine(startLeft + bDir * nearDistanceInnerLeft, startLeft + bDir * farDistanceInnerLeft, Color.yellow);
            //if (intersectsInnerRight)
            //    Debug.DrawLine(startRight + bDir * nearDistanceInnerRight, startRight + bDir * farDistanceInnerRight, Color.yellow);


            float bestOffsetA = float.PositiveInfinity, bestOffsetB = float.PositiveInfinity;

            bool any = false;

            if (intersectsOuterLeft)
            {
                any |= checkRange(a, bDir, center, bDirLen, startLeft, nearDistanceOuterLeft, ref bestOffsetA, ref bestOffsetB);
                //any |= checkRange(a, bDir, center, bDirLen, startLeft, farDistanceOuterLeft, ref bestOffsetA, ref bestOffsetB);
            }
            if (intersectsOuterRight)
            {
                any |= checkRange(a, bDir, center, bDirLen, startRight, nearDistanceOuterRight, ref bestOffsetA, ref bestOffsetB);
                //any |= checkRange(a, bDir, center, bDirLen, startRight, farDistanceOuterRight, ref bestOffsetA, ref bestOffsetB);
            }
            if (intersectsInnerLeft)
            {
                //any |= checkRange(a, bDir, center, bDirLen, startLeft, nearDistanceInnerLeft, ref bestOffsetA, ref bestOffsetB);
                any |= checkRange(a, bDir, center, bDirLen, startLeft, farDistanceInnerLeft, ref bestOffsetA, ref bestOffsetB);
            }
            if (intersectsInnerRight)
            {
                //any |= checkRange(a, bDir, center, bDirLen, startRight, nearDistanceInnerRight, ref bestOffsetA, ref bestOffsetB);
                any |= checkRange(a, bDir, center, bDirLen, startRight, farDistanceInnerRight, ref bestOffsetA, ref bestOffsetB);
            }

            if (any)
            {
                offsetA = bestOffsetA;
                offsetB = bestOffsetB;
                return(true);
            }


            offsetA = offsetB = float.NaN;
            return(false);
        }