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

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;
}
}