Example #1
0
        /// <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);
            }
        }
Example #2
0
        /// <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);
                        }
                    }
                }
            }
        }
Example #3
0
 /// <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);
     }
 }
Example #4
0
        /// <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);
                        }
                    }
                }
            }
        }
Example #5
0
        /// <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));
                }
            }
        }