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(); 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 list = this.root.FindTriangles(point); List list2 = new List(); 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(); } // 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; } }