public void AAA(string token)
{
double[][] Points = { new double[] {113.607903,34.803591},
new double[] {113.607908,34.803354},
new double[] {113.608977,34.803621},
new double[] {113.608977,34.803384}
};
bool isok = isinpolygon(new double[] { 113.60868, 34.803714 }, 4, Points);
if (isok)
{
Context.Response.Write("在范围内");
}
else
{
Context.Response.Write("不在范围内");
}
}
public double inf = 1e9;
public double EXP = 1e-9;
//叉乘 if >0 p1在p2的顺时针方向;$p1=array(1,0);
public double multi(Double[] p1, Double[] p2, Double[] p0)
{
return (p1[0] - p0[0]) * (p2[1] - p0[1]) - (p1[1] - p0[1]) * (p2[0] - p0[0]);
}
//if叉乘为零说明共线,如果该点在以side为对角线的矩形中心说明p在side上;
public bool isonline(Double[] p, Double[][] side)
{
return (Math.Abs(multi(p, side[0], side[1])) < EXP &&
Math.Min(side[0][0], side[1][0]) <= p[0] && p[0] <= Math.Max(side[0][0], side[1][0]) &&
p[1] >= Math.Min(side[0][1], side[1][1]) && p[1] <= Math.Max(side[0][1], side[1][1]));
}
//线段相交,跨立试验(叉积判断),快速排斥试验;
public bool intersect(Double[][] l, Double[][] r)
{
return (Math.Max(l[0][0], l[1][0]) >= Math.Min(r[0][0], r[1][0])//快速排斥试验用来确定以两线段为对角线的矩形是否相交;
&& Math.Max(r[0][0], r[1][0]) >= Math.Min(l[0][0], l[1][0])
&& Math.Max(l[0][1], l[1][1]) >= Math.Min(r[0][1], r[1][1])
&& Math.Max(r[0][1], r[1][0]) >= Math.Min(l[0][1], l[1][1])
&& multi(r[0], l[1], l[0]) * multi(r[1], l[1], l[0]) <= 0
&& multi(l[0], r[1], r[0]) * multi(l[1], r[1], r[0]) <= 0
);
}
public bool isinpolygon(Double[] p, int n, Double[][] points)
{
int count = 0;
if (n == 1)
{
return Math.Abs(p[0] - points[0][0]) < EXP && Math.Abs(p[1] - points[0][1]) < EXP;
}
if (n == 2)
{
Double[][] side = new double[2][];
side[0] = p;
side[1][1] = p[1];
return isonline(p, side);
}
Double[][] line = new Double[2][];
line[0] = p;
line[1] = new Double[2];
line[1][1] = p[1];
line[1][0] = -inf;
for (int i = 0; i < n; i++)
{
Double[][] side = new Double[2][];
side[0] = points[i];
side[1] = points[(i + 1) % n];
if (isonline(p, side)) return true;
if (Math.Abs(side[0][1] - side[1][1]) < EXP) continue;
if (isonline(side[0], line) && side[0][1] > side[1][1]) count++;
else if (isonline(side[1], line) && side[1][1] > side[0][1]) { count++; }
else if (intersect(line, side)) count++;
}
if (count % 2 == 0)
return false;
else
return true; ;
}
判断坐标是否在矩阵内
最新推荐文章于 2023-04-24 21:40:55 发布