c# 实现求一个点是否在一个面内(分别从矩形、椭圆、多边形分析)

转载:https://blog.csdn.net/xiexiangyan/article/details/109612564

c# 实现求一个点是否在一个面内(分别从矩形、椭圆、多边形分析)

1、矩形

已知矩形的坐标A(x0,y0)和B(x1,y1),求P(x,y)是否在矩形内。
这个只需要判定P点的x是否在x0和x1之间,y是否在y0和y1之间即可。
在这里插入图片描述

if((x0 <x) && (x1 > x) && (y1 < y) && (y< y0))
{
 Console.WriteLine("P在点上")
}else{
 Console.WriteLine("P不在点上")
}
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2、椭圆

已知椭圆的坐标A(x0,y0)和B(x1,y1),求P(x,y)是否在椭圆内。
求这个之前,要先知道椭圆的计算公式,其中(X,Y)为椭圆的中心点,a,b为椭圆的长短半轴
( x − X ) 2 a 2 + ( y − Y ) 2 b 2 = 1 \frac{(x-X)^2}{a^2}+\frac{(y-Y)^2}{b^2}=1 a2(xX)2+b2(yY)2=1
如果P(x,y)是否在椭圆内,则小于等于1
( x − X ) 2 a 2 + ( y − Y ) 2 b 2 < = 1 \frac{(x-X)^2}{a^2}+\frac{(y-Y)^2}{b^2}<=1 a2(xX)2+b2(yY)2<=1
其中a=(x1-x0)/2,b=(y0-y1)/2,X=(x1-x0)/2+x0,Y=(y0-y1)/2+y1
在这里插入图片描述

double cc = ((x - X) ^2) / (a^2) + ((y - Y) ^2) / b^2;
if (cc <= 1)
{
 Console.WriteLine("P在点上")
}else{
 Console.WriteLine("P不在点上")
}
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

3、多边形

已知多边形的所有顶点坐标的坐标U(xi,yi),求P(x,y)是否在多边形内。
从P(x,y)这一点向坐标轴做射线,如果交点是奇数点则表明在多边形内,如果是偶数点则表明在多边形外。
在这里插入图片描述

       /// <summary>
        /// 判断当前位置是否在不规则形状里面
        /// </summary>
        /// <param name="nvert">不规则形状的定点数</param>
        /// <param name="testx">当前x坐标</param>
        /// <param name="testy">当前y坐标</param>
        /// <param name="vertx">不规则形状x坐标集合</param>
        /// <param name="verty">不规则形状y坐标集合</param>
        /// <returns></returns>
        public static bool PositionPnpoly(int nvert, List<double> vertx, List<double> verty, double testx, double testy)
        {
            int i, j, c = 0;
            for (i = 0, j = nvert - 1; i < nvert; j = i++)
            {
                if (((verty[i] > testy) != (verty[j] > testy)) && (testx < (vertx[j] - vertx[i]) * (testy - verty[i]) / (verty[j] - verty[i]) + vertx[i]))
                {
                    c = 1 + c; ;
                }
            }
            if (c % 2 == 0)
            {
                return false;
            }
            else
            {
                return true;
            }
        }
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
 

posted on 2021-02-14 22:12  OctoberKey  阅读(654)  评论(0)    收藏  举报

导航