在学校作业中,我们需要做一些图像识别,我们必须找到机器人的路径。
到目前为止,我们已经能够找到图像中的所有多边形,但现在我们需要生成一个像素图,稍后将用于astar算法。我们已经找到了一种方法,如下所示,但问题是非常慢,因为我们通过每个像素并测试它是否在多边形内部。所以我的问题是,有没有办法可以更快地生成这个像素图?
我们有一个多边形坐标列表
private List<IntPoint> hull;
调用函数“getMap”来获取像素图
public Point[] getMap()
{
List<Point> points = new List<Point>();
lock (hull)
{
Rectangle rect = getRectangle();
for (int x = rect.X; x <= rect.X + rect.Width; x++)
{
for (int y = rect.Y; y <= rect.Y + rect.Height; y++)
{
if (inPoly(x, y))
points.Add(new Point(x, y));
}
}
}
return points.ToArray();
}
获取矩形用于限制搜索,我们不必去了整个图像
public Rectangle getRectangle()
{
int x = -1, y = -1, width = -1, height = -1;
foreach (IntPoint item in hull)
{
if (item.X < x || x == -1)
x = item.X;
if (item.Y < y || y == -1)
y = item.Y;
if (item.X > width || width == -1)
width = item.X;
if (item.Y > height || height == -1)
height = item.Y;
}
return new Rectangle(x, y, width-x, height-y);
}
这就是我们检查像素是否在多边形
内的方法public bool inPoly(int x, int y)
{
int i, j = hull.Count - 1;
bool oddNodes = false;
for (i = 0; i < hull.Count; i++)
{
if (hull[i].Y < y && hull[j].Y >= y
|| hull[j].Y < y && hull[i].Y >= y)
{
try
{
if (hull[i].X + (y - hull[i].X) / (hull[j].X - hull[i].X) * (hull[j].X - hull[i].X) < x)
{
oddNodes = !oddNodes;
}
}
catch (DivideByZeroException e)
{
if (0 < x)
{
oddNodes = !oddNodes;
}
}
}
j = i;
}
return oddNodes;
}
答案 0 :(得分:2)
关于多边形命中测试有一些有趣的讨论here,但听起来好像你可能会更好地使用多边形填充。
答案 1 :(得分:1)
您可能希望查找Plygon Triangulation算法。
另外,请注意,检查异常比检查正确的条件要耗费更多时间。所以我建议你转换现有的代码:
public bool inPoly(int x, int y)
{
int i, j = hull.Count - 1;
var oddNodes = false;
for (i = 0; i < hull.Count; i++)
{
if (hull[i].Y < y && hull[j].Y >= y
|| hull[j].Y < y && hull[i].Y >= y)
{
var delta = (hull[j].X - hull[i].X);
if (delta == 0)
{
if (0 < x) oddNodes = !oddNodes;
}
else if (hull[i].X + (y - hull[i].X) / delta * delta < x)
{
oddNodes = !oddNodes;
}
}
j = i;
}
return oddNodes;
}