public static bool RaycastWire(Ray ray, out float t, Vector3 circleCenter, float circleRadius, Vector3 circleNormal, CircleEpsilon epsilon = new CircleEpsilon())
        {
            t = 0.0f;
            Plane circlePlane = new Plane(circleNormal, circleCenter);

            float rayEnter;

            if (circlePlane.Raycast(ray, out rayEnter))
            {
                Vector3 intersectPt    = ray.GetPoint(rayEnter);
                float   distFromOrigin = (circleCenter - intersectPt).magnitude;

                if (distFromOrigin >= circleRadius - epsilon.WireEps &&
                    distFromOrigin <= circleRadius + epsilon.WireEps)
                {
                    t = rayEnter;
                    return(true);
                }
            }

            if (epsilon.ExtrudeEps != 0.0f)
            {
                float dot = Vector3Ex.AbsDot(ray.direction, circleNormal);
                if (dot < ExtrudeEpsThreshold.Get)
                {
                    Vector3 cylinderAxisPt0 = circleCenter - circleNormal * epsilon.ExtrudeEps;
                    Vector3 cylinderAxisPt1 = circleCenter + circleNormal * epsilon.ExtrudeEps;
                    return(CylinderMath.Raycast(ray, out t, cylinderAxisPt0, cylinderAxisPt1, circleRadius + epsilon.WireEps));
                }
            }

            return(false);
        }
        public static bool Raycast(Ray ray, out float t, Vector3 circleCenter, float circleRadius, Vector3 circleNormal, CircleEpsilon epsilon = new CircleEpsilon())
        {
            t             = 0.0f;
            circleRadius += epsilon.RadiusEps;
            Plane circlePlane = new Plane(circleNormal, circleCenter);

            float rayEnter;

            if (circlePlane.Raycast(ray, out rayEnter) && (ray.GetPoint(rayEnter) - circleCenter).magnitude <= circleRadius)
            {
                t = rayEnter;
                return(true);
            }

            if (epsilon.ExtrudeEps != 0.0f)
            {
                float dot = Vector3Ex.AbsDot(ray.direction, circleNormal);
                if (dot < ExtrudeEpsThreshold.Get)
                {
                    Vector3 cylinderAxisPt0 = circleCenter - circleNormal * epsilon.ExtrudeEps;
                    Vector3 cylinderAxisPt1 = circleCenter + circleNormal * epsilon.ExtrudeEps;
                    return(CylinderMath.Raycast(ray, out t, cylinderAxisPt0, cylinderAxisPt1, circleRadius));
                }
            }

            return(false);
        }
 public static bool Contains2DPoint(Vector2 point, Vector2 circleCenter, float circleRadius, CircleEpsilon epsilon = new CircleEpsilon())
 {
     circleRadius += epsilon.RadiusEps;
     return((point - circleCenter).magnitude <= circleRadius);
 }
        public static bool Is2DPointOnBorder(Vector2 point, Vector2 circleCenter, float circleRadius, CircleEpsilon epsilon = new CircleEpsilon())
        {
            float distFromOrigin = (point - circleCenter).magnitude;

            return(distFromOrigin >= circleRadius - epsilon.WireEps &&
                   distFromOrigin <= circleRadius + epsilon.WireEps);
        }
        public static bool Contains3DPoint(Vector3 point, bool checkOnPlane, Vector3 circleCenter, float circleRadius, Vector3 circleNormal, CircleEpsilon epsilon = new CircleEpsilon())
        {
            Plane circlePlane = new Plane(circleNormal, circleCenter);

            if (checkOnPlane && circlePlane.GetAbsDistanceToPoint(point) > epsilon.ExtrudeEps)
            {
                return(false);
            }

            circleRadius += epsilon.RadiusEps;
            point         = circlePlane.ProjectPoint(point);

            return((point - circleCenter).magnitude <= circleRadius);
        }