C# 在线之间的可用空间内检测并绘制形状

C# 在线之间的可用空间内检测并绘制形状,c#,wpf,edge-detection,flood-fill,C#,Wpf,Edge Detection,Flood Fill,我的目标是检测由不同线条构成的简单图形中的不同区域。请点击以下链接查看我的目标说明。我当然能够得到绘制线的位置,但由于一条线可以跨越多个“区域”,我认为仅此信息是不够的 欢迎对其他网站提出任何想法、建议或意见。我将C#与WPF结合使用-我不确定哪些搜索词可能会导致这个问题的答案。我确实在一家杂志上看到了这篇文章,但它似乎专注于检测已经存在的形状,而不是那些仍然需要“发现”的区域。作为旁注,我希望找到一种不仅适用于矩形,而且适用于其他类型形状的解决方案 事先非常感谢 更新: foreach (Li

我的目标是检测由不同线条构成的简单图形中的不同区域。请点击以下链接查看我的目标说明。我当然能够得到绘制线的位置,但由于一条线可以跨越多个“区域”,我认为仅此信息是不够的

欢迎对其他网站提出任何想法、建议或意见。我将C#与WPF结合使用-我不确定哪些搜索词可能会导致这个问题的答案。我确实在一家杂志上看到了这篇文章,但它似乎专注于检测已经存在的形状,而不是那些仍然需要“发现”的区域。作为旁注,我希望找到一种不仅适用于矩形,而且适用于其他类型形状的解决方案

事先非常感谢

更新:

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);
            }
        }
    }
}
foreach(DrawingCanvas.Children.OfType()中的行canvaObject)
{
LineGeometry lineGeometry1=新的LineGeometry();
lineGeometry1.StartPoint=新点(CanvaObject.X1,CanvaObject.Y1);
lineGeometry1.EndPoint=新点(CanvaObject.X2,CanvaObject.Y2);
if(canvasObject.X1!=canvasObject.X2){
foreach(DrawingCanvas.Children.OfType()中的canvasObject2行){
如果(canvasObject.X1==canvasObject 2.X1&&canvasObject.X2==canvasObject 2.X2&&
canvasObject2.Y1==canvasObject2.Y2&&canvasObject2.Y2==canvasObject2.Y2){
回来
//防止系统“碰撞”相同的两条线路
}
LineGeometry lineGeometry2=新的LineGeometry{
起始点=新点(canvasObject2.X1,canvasObject2.Y1),
端点=新点(canvasObject2.X2,canvasObject2.Y2)
};
if(lineGeometry1.FillContainsWithDetail(lineGeometry2.ToString()!=“Empty”){
//检测到碰撞
矩形=新矩形{
宽度=数学绝对值(canvasObject.X2-canvasObject.X1),
高度=20,
填充=刷子。红色
};
//矩形.Height=Math.Abs(canvasObject.Y2-canvasObject.Y1);
DrawingCanvas2.Children.Add(矩形);
Canvas.SetTop(矩形,canvasObject.Y1);
SetLeft(矩形,canvasObject.X1);
}
}
}
}
我已经用下面的代码进行了实验——让您了解我是如何试图解决这个问题的。起初,我认为我已经找到了一个部分解决方案,通过检查线之间的碰撞。不幸的是,我只是在每一行中创建了第二行(这当然与“自身”冲突)。在我添加了一个简单的if检查(见下文)之后,这种情况不再发生,但现在我再也不会遇到任何冲突了。。因此可能需要一种新技术

更新2:

在互联网上进一步挖掘和搜索解决方案后,我想到了一个新的潜在解决方案。希望这对将来寻找答案的人也有用。使用泛光填充算法,我能够用特定的颜色“填充”每个区域,这与图像编辑应用程序中的画笔工具非常相似。总而言之,这是通过拍摄画布元素的“屏幕截图”来完成的,从某个像素开始,不断扩展,直到找到具有不同颜色的像素(这些将是线条)。它工作得很好,能够返回具有不同区域的图像。然而,我当前的问题是在C#/WPF中以“object”的形式访问这些区域。我想自己画这些区域(使用polyobject或类似的东西?),这样就可以使用这些对象进行进一步的计算或交互


我曾尝试在每次像素检查后在泛光填充算法中保存最小和最大X和Y位置的位置,但这使得算法的工作速度非常慢。如果有人有主意,我很想知道。:)

你应该把你的图片分解成一个更容易的分析,例如:Aaybe——谢谢你的建议,请考虑上面的更新2。使用洪水填充算法,我能够成功地给画布上的各个区域上色,但我仍然没有找到真正“识别”它们的方法。我不是专家,最好的提问地点是。同时,为什么不计算填充的像素数并计算该区域的边界矩形呢。确保该区域不接触图像边框,即它不是边框的一部分。然后,为了找到重叠区域,可以使用四叉树。另外,您是否考虑过尝试OpenCv?