/// <summary> /// 判断在一个椭圆内部能否看到一个点。 /// </summary> /// <param name="pt">点。</param> /// <param name="offset">椭圆的焦点。</param> /// <param name="semiMajorAxis">椭圆的半长轴。</param> /// <param name="eccentricity">椭圆的离心率。</param> /// <param name="rotateAngle">椭圆的旋转角(弧度)(以焦点为中心,以 +X 轴为 0 弧度,从 +X 轴指向 +Y 轴的方向为正方向,焦点到近焦点连线相对于 +X 轴的角度)。</param> /// <returns>布尔值,表示在一个椭圆内部能否看到一个点。</returns> public static bool PointIsVisibleInEllipse(PointD pt, PointD offset, double semiMajorAxis, double eccentricity, double rotateAngle) { if (pt.IsNaNOrInfinity || offset.IsNaNOrInfinity || (InternalMethod.IsNaNOrInfinity(semiMajorAxis) || semiMajorAxis <= 0) || (InternalMethod.IsNaNOrInfinity(eccentricity) || eccentricity < 0 || eccentricity >= 1) || InternalMethod.IsNaNOrInfinity(rotateAngle)) { return(false); } else { PointD _Offset = new PointD(offset.X - 2 * semiMajorAxis * eccentricity * Math.Cos(rotateAngle), offset.Y - 2 * semiMajorAxis * eccentricity * Math.Sin(rotateAngle)); double FocalDistSum = pt.DistanceFrom(offset) + pt.DistanceFrom(_Offset); return(FocalDistSum < 2 * semiMajorAxis); } }
/// <summary> /// 判断在一个矩形内部能否看到一个直线段的部分或全部。 /// </summary> /// <param name="pt1">直线段的第一个端点。</param> /// <param name="pt2">直线段的第二个端点。</param> /// <param name="rect">矩形。</param> /// <returns>布尔值,表示在一个矩形内部能否看到一个直线段的部分或全部。</returns> public static bool LineIsVisibleInRectangle(PointD pt1, PointD pt2, RectangleF rect) { if (pt1.IsNaNOrInfinity || pt2.IsNaNOrInfinity || rect.Size.IsEmpty) { return(false); } else { PointD RectCenter = new PointD(rect.Width / 2, rect.Height / 2); double RectRadius = Math.Sqrt(Math.Pow(rect.Width, 2) + Math.Pow(rect.Height, 2)) / 2; double Dist_RC_P1 = RectCenter.DistanceFrom(pt1); double Dist_RC_P2 = RectCenter.DistanceFrom(pt2); if (Dist_RC_P1 <= RectRadius || Dist_RC_P2 <= RectRadius) { return(true); } else { double A, B, C; CalcLineGeneralFunction(pt1, pt2, out A, out B, out C); double Dist_RC_FP = GetDistanceBetweenPointAndLine(RectCenter, A, B, C); if (Dist_RC_FP > RectRadius) { return(false); } else { if ((A * pt1.X + B * pt1.Y + C) * (A * pt2.X + B * pt2.Y + C) > 0) { return(false); } else { return(true); } } } } }
/// <summary> /// 判断在一个圆内部能否看到一个点。 /// </summary> /// <param name="pt">点。</param> /// <param name="offset">圆的圆心。</param> /// <param name="radius">圆的半径。</param> /// <returns>布尔值,表示在一个圆内部能否看到一个点。</returns> public static bool PointIsVisibleInCircle(PointD pt, PointD offset, double radius) { if (pt.IsNaNOrInfinity || offset.IsNaNOrInfinity || (InternalMethod.IsNaNOrInfinity(radius) || radius <= 0)) { return(false); } else { return(pt.DistanceFrom(offset) < radius); } }
/// <summary> /// 判断在一个圆内部能否看到一个直线段的部分或全部。 /// </summary> /// <param name="pt1">直线段的第一个端点。</param> /// <param name="pt2">直线段的第二个端点。</param> /// <param name="offset">圆的圆心。</param> /// <param name="radius">圆的半径。</param> /// <returns>布尔值,表示在一个圆内部能否看到一个直线段的部分或全部。</returns> public static bool LineIsVisibleInCircle(PointD pt1, PointD pt2, PointD offset, double radius) { if (pt1.IsNaNOrInfinity || pt2.IsNaNOrInfinity || offset.IsNaNOrInfinity || (InternalMethod.IsNaNOrInfinity(radius) || radius <= 0)) { return(false); } else { double Dist_Off_P1 = offset.DistanceFrom(pt1); double Dist_Off_P2 = offset.DistanceFrom(pt2); if (Dist_Off_P1 <= radius || Dist_Off_P2 <= radius) { return(true); } else { double A, B, C; CalcLineGeneralFunction(pt1, pt2, out A, out B, out C); double Dist_Off_FP = GetDistanceBetweenPointAndLine(offset, A, B, C); if (Dist_Off_FP > radius) { return(false); } else { if ((A * pt1.X + B * pt1.Y + C) * (A * pt2.X + B * pt2.Y + C) > 0) { return(false); } else { return(true); } } } } }
/// <summary> /// 计算平面直角坐标系中过一个定点到一条直线的距离。 /// </summary> /// <param name="pt">定点。</param> /// <param name="pt1">直线上的第一个点。</param> /// <param name="pt2">直线上的第二个点。</param> /// <returns>双精度浮点数,表示平面直角坐标系中过一个定点到一条直线的距离。</returns> public static double GetDistanceBetweenPointAndLine(PointD pt, PointD pt1, PointD pt2) { if (pt.IsNaNOrInfinity || pt1.IsNaNOrInfinity || pt2.IsNaNOrInfinity) { return(double.NaN); } else { if (pt1 == pt2) { return(pt.DistanceFrom(pt1)); } else { double A, B, C; CalcLineGeneralFunction(pt1, pt2, out A, out B, out C); return(GetDistanceBetweenPointAndLine(pt, A, B, C)); } } }