79 lines
2.3 KiB
C#
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;
|
|
}
|
|
}
|