Получение треугольников с помощью LINQ возвращает пустые треугольники - PullRequest
0 голосов
/ 16 сентября 2018

Я преобразовал некоторый код C # в VB.NET, чтобы получить треугольники, используя LINQ, и обе версии кода ведут себя одинаково вплоть до точки, где выбраны треугольники.

Это мои результаты:

enter image description here

Как видите, получить список пустых треугольников, поэтому я подозреваю, что что-то не так в моем утверждении 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.

Edit:

Я добавил скриншот, который показывает, что VS считает, что "Imports System.Linq" может бытьудален, что я считаю неправильным.

enter image description here

Редактировать: Кто-нибудь был бы так хорош и скажите мне, как это выражение LINQ будет выглядеть в жестком коде(не более Linq)?

1 Ответ

0 голосов

Ваша проблема в вашей Triangle структуре. На самом деле P1 совпадает с p1 в VB . Таким образом, вы должны изменить 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
...