164 lines
4.4 KiB
C#
164 lines
4.4 KiB
C#
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;
|
|
}
|
|
}
|