using System; using TriangleNet.Data; using TriangleNet.Geometry; namespace TriangleNet { // Token: 0x02000011 RID: 17 internal class TriangleLocator { // Token: 0x06000096 RID: 150 RVA: 0x0001114B File Offset: 0x0000F34B public TriangleLocator(Mesh mesh) { this.mesh = mesh; this.sampler = new Sampler(); } // Token: 0x06000097 RID: 151 RVA: 0x00011165 File Offset: 0x0000F365 public void Update(ref Otri otri) { otri.Copy(ref this.recenttri); } // Token: 0x06000098 RID: 152 RVA: 0x00011173 File Offset: 0x0000F373 public void Reset() { this.recenttri.triangle = null; } // Token: 0x06000099 RID: 153 RVA: 0x00011184 File Offset: 0x0000F384 public LocateResult PreciseLocate(Point searchpoint, ref Otri searchtri, bool stopatsubsegment) { Otri otri = default(Otri); Osub osub = default(Osub); Vertex vertex = searchtri.Org(); Vertex vertex2 = searchtri.Dest(); Vertex vertex3 = searchtri.Apex(); while (vertex3.x != searchpoint.X || vertex3.y != searchpoint.Y) { double num = Primitives.CounterClockwise(vertex, vertex3, searchpoint); double num2 = Primitives.CounterClockwise(vertex3, vertex2, searchpoint); bool flag; if (num > 0.0) { flag = num2 <= 0.0 || (vertex3.x - searchpoint.X) * (vertex2.x - vertex.x) + (vertex3.y - searchpoint.Y) * (vertex2.y - vertex.y) > 0.0; } else if (num2 > 0.0) { flag = false; } else { if (num == 0.0) { searchtri.LprevSelf(); return LocateResult.OnEdge; } if (num2 == 0.0) { searchtri.LnextSelf(); return LocateResult.OnEdge; } return LocateResult.InTriangle; } if (flag) { searchtri.Lprev(ref otri); vertex2 = vertex3; } else { searchtri.Lnext(ref otri); vertex = vertex3; } otri.Sym(ref searchtri); if (this.mesh.checksegments && stopatsubsegment) { otri.SegPivot(ref osub); if (osub.seg != Mesh.dummysub) { otri.Copy(ref searchtri); return LocateResult.Outside; } } if (searchtri.triangle == Mesh.dummytri) { otri.Copy(ref searchtri); return LocateResult.Outside; } vertex3 = searchtri.Apex(); } searchtri.LprevSelf(); return LocateResult.OnVertex; } // Token: 0x0600009A RID: 154 RVA: 0x00011310 File Offset: 0x0000F510 public LocateResult Locate(Point searchpoint, ref Otri searchtri) { Otri otri = default(Otri); Vertex vertex = searchtri.Org(); double num = (searchpoint.X - vertex.x) * (searchpoint.X - vertex.x) + (searchpoint.Y - vertex.y) * (searchpoint.Y - vertex.y); if (this.recenttri.triangle != null && !Otri.IsDead(this.recenttri.triangle)) { vertex = this.recenttri.Org(); if (vertex.x == searchpoint.X && vertex.y == searchpoint.Y) { this.recenttri.Copy(ref searchtri); return LocateResult.OnVertex; } double num2 = (searchpoint.X - vertex.x) * (searchpoint.X - vertex.x) + (searchpoint.Y - vertex.y) * (searchpoint.Y - vertex.y); if (num2 < num) { this.recenttri.Copy(ref searchtri); num = num2; } } this.sampler.Update(this.mesh); foreach (int num3 in this.sampler.GetSamples(this.mesh)) { otri.triangle = this.mesh.triangles[num3]; if (!Otri.IsDead(otri.triangle)) { vertex = otri.Org(); double num2 = (searchpoint.X - vertex.x) * (searchpoint.X - vertex.x) + (searchpoint.Y - vertex.y) * (searchpoint.Y - vertex.y); if (num2 < num) { otri.Copy(ref searchtri); num = num2; } } } vertex = searchtri.Org(); Vertex vertex2 = searchtri.Dest(); if (vertex.x == searchpoint.X && vertex.y == searchpoint.Y) { return LocateResult.OnVertex; } if (vertex2.x == searchpoint.X && vertex2.y == searchpoint.Y) { searchtri.LnextSelf(); return LocateResult.OnVertex; } double num4 = Primitives.CounterClockwise(vertex, vertex2, searchpoint); if (num4 < 0.0) { searchtri.SymSelf(); } else if (num4 == 0.0 && vertex.x < searchpoint.X == searchpoint.X < vertex2.x && vertex.y < searchpoint.Y == searchpoint.Y < vertex2.y) { return LocateResult.OnEdge; } return this.PreciseLocate(searchpoint, ref searchtri, false); } // Token: 0x04000083 RID: 131 private Sampler sampler; // Token: 0x04000084 RID: 132 private Mesh mesh; // Token: 0x04000085 RID: 133 internal Otri recenttri; } }