首页 > 解决方案 > 在 List(of Point) 中查找当前 y 的 2 个 x 值

问题描述

我有一个List(of PointF). 2个嵌套的for循环穿过一个围绕一个圆圈(或圆形(但实际上是一个封闭路径))拉伸的矩形。我想在这个圈子内工作GetPixel(x,y)。这意味着,我需要相应 y 的相应最小和最大 x 值。我怎样才能用这个 List(Of PointF) 解决这个问题?我在这里请求帮助的原因是因为我对这些List.Find(predicates or matches)事情感到困惑在此处输入图像描述

For x As Integer = CInt(xmin) To CInt(xmax) Step 1
            For y As Integer = CInt(ymin) To CInt(ymax) Step 1
                'get the min and max value of x here
            Next      
Next

编辑:它是关于:我写了一个程序,使用灰度图像和拉普拉斯来执行边缘检测。用鼠标绘制了一个矩形,并在其中搜索了边缘。Drawing2D.GraphicsPath然后创建了A。根据照片中显示的对象,这或多或少工作得很好,因为必须相应地放大矩形。现在我的想法是我自己画一个手绘的 GraphicsPath(而不是一个矩形)并让它在其中搜索边缘。这就是为什么我有这个圈子(或鸡蛋),我必须确保我不会越过它的边界。我已经可以计算出 xmin、xmax、ymin 和 ymax,但不能计算出 x1 和 x2(见图)。因此,当我遍历从 xmin 到 xmax 和 ymin 到 ymax 的所有点时,我想知道当前点是否在形状内。 我必须检查它的 x 值是否在给定 y 的形状 x 范围之间,然后是 y 值的相反范围。那是我的问题。如何使用列表?

标签: vb.netvisual-studio-2019

解决方案


我认为你最好不要For循环遍历整个空间。这会起作用,但它比我认为你需要的计算要多。

给定一个点,要确定它是否在您的形状内(由点列表定义),您只需要将定义的点的 x 和 y 坐标与形状列表进行比较。

例如,给定一个点 x=100px 和 y=100px,您知道您必须检查它的 x 值是否在给定 y (100px) 的形状的 x 范围之间(或相反的 y 值)。

这将(可能?)仅适用于不会“自行转动”或具有不改变极性的曲率的简单形状。(不确定它的数学名称是什么,但有一个。)例如,沙漏形状可能会带来更大的困难。

更新

这是一个简单的 Linq 方法,用于确定指定点是否在定义的形状内。请注意,它不包括形状末端的点但您可以通过将“>”更改为“>=”等来包含这些点。

为简单起见,我使用八边形来近似圆。此外,代码假定位图中的所有点都是为形状定义的。即,不使用插值。

    Dim s As List(Of Point) = New List(Of Point) From {New Point(50, 0), New Point(25, 25), New Point(0, 50), New Point(25, 75), New Point(50, 100), New Point(75, 75), New Point(100, 50), New Point(75, 25)}
    Dim p As Point = New Point(30, 75) ' Is inside the shape
    Dim IsInside As Boolean = s.Exists(Function(f) f.Y = p.Y AndAlso f.X < p.X) AndAlso s.Exists(Function(f) f.Y = p.Y AndAlso f.X > p.X)

可能有多种方法可以结合 Linq 测试,但您明白了。


推荐阅读