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不在点上")
}
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(x−X)2+b2(y−Y)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(x−X)2+b2(y−Y)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不在点上")
}
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;
}
}