Files
2026-06-04 11:42:34 +02:00

79 lines
2.3 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using TriangleNet.Data;
using TriangleNet.Geometry;
namespace TriangleNet.Tools
{
// Token: 0x02000016 RID: 22
public class QuadTree
{
// Token: 0x060000BA RID: 186 RVA: 0x00013030 File Offset: 0x00011230
public QuadTree(Mesh mesh, int maxDepth, int sizeBound)
{
this.maxDepth = maxDepth;
this.sizeBound = sizeBound;
this.triangles = mesh.Triangles.ToArray<Triangle>();
int num = 0;
this.root = new QuadNode(mesh.Bounds, this, true);
this.root.CreateSubRegion(num + 1);
}
// Token: 0x060000BB RID: 187 RVA: 0x00013087 File Offset: 0x00011287
public QuadTree(Mesh mesh)
: this(mesh, 10, 10)
{
}
// Token: 0x060000BC RID: 188 RVA: 0x00013094 File Offset: 0x00011294
public ITriangle Query(double x, double y)
{
Point point = new Point(x, y);
List<int> list = this.root.FindTriangles(point);
List<ITriangle> list2 = new List<ITriangle>();
foreach (int num in list)
{
ITriangle triangle = this.triangles[num];
if (QuadTree.IsPointInTriangle(point, triangle.GetVertex(0), triangle.GetVertex(1), triangle.GetVertex(2)))
{
list2.Add(triangle);
break;
}
}
return list2.FirstOrDefault<ITriangle>();
}
// Token: 0x060000BD RID: 189 RVA: 0x00013130 File Offset: 0x00011330
internal static bool IsPointInTriangle(Point p, Point t0, Point t1, Point t2)
{
Point point = new Point(t1.X - t0.X, t1.Y - t0.Y);
Point point2 = new Point(t2.X - t0.X, t2.Y - t0.Y);
Point point3 = new Point(p.X - t0.X, p.Y - t0.Y);
Point point4 = new Point(-point.Y, point.X);
Point point5 = new Point(-point2.Y, point2.X);
double num = QuadTree.DotProduct(point3, point5) / QuadTree.DotProduct(point, point5);
double num2 = QuadTree.DotProduct(point3, point4) / QuadTree.DotProduct(point2, point4);
return num >= 0.0 && num2 >= 0.0 && num + num2 <= 1.0;
}
// Token: 0x060000BE RID: 190 RVA: 0x00013210 File Offset: 0x00011410
internal static double DotProduct(Point p, Point q)
{
return p.X * q.X + p.Y * q.Y;
}
// Token: 0x04000093 RID: 147
private QuadNode root;
// Token: 0x04000094 RID: 148
internal ITriangle[] triangles;
// Token: 0x04000095 RID: 149
internal int sizeBound;
// Token: 0x04000096 RID: 150
internal int maxDepth;
}
}