使用 LINQ returns 空三角形获取三角形
Getting triangles using LINQ returns empty triangles
我已将一些 C# 代码转换为 VB.NET 以使用 LINQ 获取三角形,并且两个代码版本在选择三角形之前的行为相同。
这些是我的结果:
正如你所看到的,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);
}
非常感谢!
编辑:
我已经打印了 "triangles",VB.NET 和 C# 完全相同。
我只是不明白我在 Select 语句中做错了什么。
编辑:
我加了个截图,显示VS认为"Imports System.Linq"可以去掉,我觉得不对
编辑:谁能告诉我这个 LINQ 表达式在硬代码中是什么样子(不再是 Linq)?
您的问题出在您的 Triangle
结构中。其实P1
和VB中的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# 代码转换为 VB.NET 以使用 LINQ 获取三角形,并且两个代码版本在选择三角形之前的行为相同。
这些是我的结果:
正如你所看到的,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);
}
非常感谢!
编辑:
我已经打印了 "triangles",VB.NET 和 C# 完全相同。 我只是不明白我在 Select 语句中做错了什么。
编辑:
我加了个截图,显示VS认为"Imports System.Linq"可以去掉,我觉得不对
编辑:谁能告诉我这个 LINQ 表达式在硬代码中是什么样子(不再是 Linq)?
您的问题出在您的 Triangle
结构中。其实P1
和VB中的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