c# - 使用 LINQ 获取三角形返回空三角形

标签 c# vb.net linq triangulation

我已将一些 C# 代码转换为 VB.NET,以使用 LINQ 获取三角形,并且在选择三角形之前,两个代码版本的行为都是相同的。

这些是我的结果:

enter image description here

正如人们所看到的,a 得到了一个空三角形列表,所以我怀疑我的 Select 语句中有问题。

VB.NET 和 C# 中的其他所有内容都是相同的。

这是我的 VB.NET 代码,根据我所知进行了转换:

    Function GetDelaunayTriangles(ByVal points As IEnumerable(Of Point)) As IEnumerable(Of Triangle)
        Dim result = New List(Of Triangle)()
        Dim rect = Cv2.BoundingRect(points)
        rect.Inflate(10, 10)
        Dim triangles As Vec6f()

        Using subdiv = New Subdiv2D(rect)

            For Each p In points
                Dim cv_p = New OpenCvSharp.Point2f(p.X, p.Y)
                subdiv.Insert(cv_p)
            Next

            triangles = subdiv.GetTriangleList()
        End Using

    Dim nRet As IEnumerable(Of Triangle) = From t In triangles Let p1 = New Point(t(0), t(1)) Let p2 = New Point(t(2), t(3)) Let p3 = New Point(t(4), t(5)) Where rect.Contains(p1) AndAlso rect.Contains(p2) AndAlso rect.Contains(p3) Select New Triangle(p1, p2, p3)

    Return nRet
End Function

这是有效的原始 C# 代码:

    public static IEnumerable<Triangle> GetDelaunayTriangles(IEnumerable<Point> points)
    {
        var result = new List<Triangle>();

        // calculate the bounding box around the points
        var rect = Cv2.BoundingRect(points);
        rect.Inflate(10, 10);

        // the Subdiv2D class handles Delaunay triangulation
        // first we add all points, and then start triangulation
        Vec6f[] triangles;
        using (var subdiv = new Subdiv2D(rect))
        {
            foreach (var p in points)
            {
                var cv_p = new OpenCvSharp.Point2f(p.X, p.Y);
                subdiv.Insert(cv_p);
            }
            triangles = subdiv.GetTriangleList();
        }

        // return result as an enumeration of triangle structs
        return from t in triangles
               let p1 = new Point(t[0], t[1])
               let p2 = new Point(t[2], t[3])
               let p3 = new Point(t[4], t[5])
               where rect.Contains(p1) && rect.Contains(p2) && rect.Contains(p3)
               select new Triangle(p1, p2, p3);
    }

非常感谢!

编辑:

我已经打印了“三角形”,它们对于 VB.NET 和 C# 来说是完全相同的。 我只是不明白我在 Select 语句中做错了什么。

编辑:

我添加了一个屏幕截图,显示 VS 认为“Imports System.Linq”可以删除,我认为这是不对的。

enter image description here

编辑:是否有人能好心告诉我这个 LINQ 表达式在硬代码中是什么样子(不再有 Linq)?

最佳答案

您的问题出在您的三角形结构中。实际上P1VB中的p1相同。因此,您应该将 p1, p2, p3 更改为 p1_, p2_, p3_:

Public Sub New(ByVal p1_ As Point, ByVal p2_ As Point, ByVal p3_ As Point)
    P1 = p1_
    P2 = p2_
    P3 = p3_
End Sub

关于c# - 使用 LINQ 获取三角形返回空三角形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52358260/

相关文章:

vb.net - 当用户按下按钮时,如何显示 DateTimePicker 对话框(无需将控件添加到表单)

c# - 如何使用迭代进行分组?

.net - 是否有一种通用方法来检查 Linq 提供程序(尤其是 OData)是否支持某个属性定义?

c# - discord.net 中的 [Summary ("")] 用于什么?

c# - 如何从 ASP.Net Core 中的 SqlServerDBContextOptionsExtensions 获取连接字符串

c# - 使用 LINQ,如何从列表中查找具有给定属性值的对象?

arrays - 使用streamreader将文件加载到数组中

c# - LINQ - 在 IEnumerable 中选择第二个项目

c# - 分配给基类的静态只读字段

c# - 如何在 C# 中编写代码以在我的机器上获取直接 X 版本?