我的目标是在由各种线条构成的简单图纸中检测不同的区域。请点击以下链接查看我的目标visual example以便澄清。我当然能够获得绘制线条的位置,但由于一条线可以跨越多个“区域”,我不认为这些信息就足够了。
欢迎任何有关其他网站的想法,建议或观点。我正在将C#与WPF结合使用 - 我不确定哪些搜索词可能会导致对此问题的回答。我确实遇到了AForge的这篇shape checker文章,但它似乎专注于检测已存在的形状,而不是那些仍然需要“发现”的区域。作为旁注,我希望找到一种不仅适用于矩形而且适用于其他类型形状的解决方案。
非常感谢你。
更新
foreach (Line canvasObject in DrawingCanvas.Children.OfType<Line>())
{
LineGeometry lineGeometry1 = new LineGeometry();
lineGeometry1.StartPoint = new Point(canvasObject.X1, canvasObject.Y1);
lineGeometry1.EndPoint = new Point(canvasObject.X2, canvasObject.Y2);
if (canvasObject.X1 != canvasObject.X2) {
foreach (Line canvasObject2 in DrawingCanvas.Children.OfType<Line>()) {
if (canvasObject.X1 == canvasObject2.X1 && canvasObject.X2 == canvasObject2.X2 &&
canvasObject2.Y1 == canvasObject2.Y2 && canvasObject.Y2 == canvasObject2.Y2) {
return;
// prevent the system from 'colliding' the same two lines
}
LineGeometry lineGeometry2 = new LineGeometry {
StartPoint = new Point(canvasObject2.X1, canvasObject2.Y1),
EndPoint = new Point(canvasObject2.X2, canvasObject2.Y2)
};
if (lineGeometry1.FillContainsWithDetail(lineGeometry2).ToString() != "Empty") {
//collision detected
Rectangle rectangle = new Rectangle {
Width = Math.Abs(canvasObject.X2 - canvasObject.X1),
Height = 20,
Fill = Brushes.Red
};
//rectangle.Height = Math.Abs(canvasObject.Y2 - canvasObject.Y1);
DrawingCanvas2.Children.Add(rectangle);
Canvas.SetTop(rectangle, canvasObject.Y1);
Canvas.SetLeft(rectangle, canvasObject.X1);
}
}
}
}
我已尝试使用以下代码 - 让您了解我是如何尝试解决此问题的。最初我认为通过检查线之间的碰撞找到了部分解决方案。不幸的是,我刚刚创建了每一行的第二行(当然与自己相撞)。在我添加了一个简单的if检查(见下文)后,这种情况不再发生,但现在我不再发生任何碰撞......所以可能需要一种新技术。
更新2:
在进一步挖掘和搜索互联网寻求解决方案之后,我想到了一个新的潜在解决方案。希望这也可以用于将来寻找答案的任何人。使用泛光填充算法,我能够使用特定颜色“填充”每个区域 - 非常类似于图像编辑应用程序中的油漆桶工具。总结一下,这是通过拍摄Canvas元素的“屏幕截图”,从某个像素开始并一遍又一遍地扩展直到找到一个具有不同颜色的像素(这些就是线条)来完成的。它工作得很好,能够返回各个区域的图像。但是 - 我目前的问题是在C#/ WPF中将这些区域作为“对象”访问。我想自己绘制区域(使用多对象或类似的东西?) - 可以使用对象进行进一步的计算或交互。
我尝试在每次像素检查后保存FloodFill算法中最小和最大X和Y位置的位置,但这会使算法工作得非常慢。如果有人有想法,我很想知道。 :)