115 lines
2.9 KiB
C#
115 lines
2.9 KiB
C#
using System;
|
|
using TriangleNet.Data;
|
|
using TriangleNet.Geometry;
|
|
using TriangleNet.Log;
|
|
|
|
namespace TriangleNet.Algorithm
|
|
{
|
|
// Token: 0x0200003D RID: 61
|
|
internal class Incremental
|
|
{
|
|
// Token: 0x0600022A RID: 554 RVA: 0x0001A694 File Offset: 0x00018894
|
|
private void GetBoundingBox()
|
|
{
|
|
Otri otri = default(Otri);
|
|
BoundingBox bounds = this.mesh.bounds;
|
|
double num = bounds.Width;
|
|
if (bounds.Height > num)
|
|
{
|
|
num = bounds.Height;
|
|
}
|
|
if (num == 0.0)
|
|
{
|
|
num = 1.0;
|
|
}
|
|
this.mesh.infvertex1 = new Vertex(bounds.MinX - 50.0 * num, bounds.MinY - 40.0 * num);
|
|
this.mesh.infvertex2 = new Vertex(bounds.MaxX + 50.0 * num, bounds.MinY - 40.0 * num);
|
|
this.mesh.infvertex3 = new Vertex(0.5 * (bounds.MinX + bounds.MaxX), bounds.MaxY + 60.0 * num);
|
|
this.mesh.MakeTriangle(ref otri);
|
|
otri.SetOrg(this.mesh.infvertex1);
|
|
otri.SetDest(this.mesh.infvertex2);
|
|
otri.SetApex(this.mesh.infvertex3);
|
|
Mesh.dummytri.neighbors[0] = otri;
|
|
}
|
|
|
|
// Token: 0x0600022B RID: 555 RVA: 0x0001A7D8 File Offset: 0x000189D8
|
|
private int RemoveBox()
|
|
{
|
|
Otri otri = default(Otri);
|
|
Otri otri2 = default(Otri);
|
|
Otri otri3 = default(Otri);
|
|
Otri otri4 = default(Otri);
|
|
Otri otri5 = default(Otri);
|
|
Otri otri6 = default(Otri);
|
|
bool flag = !this.mesh.behavior.Poly;
|
|
otri4.triangle = Mesh.dummytri;
|
|
otri4.orient = 0;
|
|
otri4.SymSelf();
|
|
otri4.Lprev(ref otri5);
|
|
otri4.LnextSelf();
|
|
otri4.SymSelf();
|
|
otri4.Lprev(ref otri2);
|
|
otri2.SymSelf();
|
|
otri4.Lnext(ref otri3);
|
|
otri3.SymSelf();
|
|
if (otri3.triangle == Mesh.dummytri)
|
|
{
|
|
otri2.LprevSelf();
|
|
otri2.SymSelf();
|
|
}
|
|
Mesh.dummytri.neighbors[0] = otri2;
|
|
int num = -2;
|
|
while (!otri4.Equal(otri5))
|
|
{
|
|
num++;
|
|
otri4.Lprev(ref otri6);
|
|
otri6.SymSelf();
|
|
if (flag && otri6.triangle != Mesh.dummytri)
|
|
{
|
|
Vertex vertex = otri6.Org();
|
|
if (vertex.mark == 0)
|
|
{
|
|
vertex.mark = 1;
|
|
}
|
|
}
|
|
otri6.Dissolve();
|
|
otri4.Lnext(ref otri);
|
|
otri.Sym(ref otri4);
|
|
this.mesh.TriangleDealloc(otri.triangle);
|
|
if (otri4.triangle == Mesh.dummytri)
|
|
{
|
|
otri6.Copy(ref otri4);
|
|
}
|
|
}
|
|
this.mesh.TriangleDealloc(otri5.triangle);
|
|
return num;
|
|
}
|
|
|
|
// Token: 0x0600022C RID: 556 RVA: 0x0001A958 File Offset: 0x00018B58
|
|
public int Triangulate(Mesh mesh)
|
|
{
|
|
this.mesh = mesh;
|
|
Otri otri = default(Otri);
|
|
this.GetBoundingBox();
|
|
foreach (Vertex vertex in mesh.vertices.Values)
|
|
{
|
|
otri.triangle = Mesh.dummytri;
|
|
Osub osub = default(Osub);
|
|
if (mesh.InsertVertex(vertex, ref otri, ref osub, false, false) == InsertVertexResult.Duplicate)
|
|
{
|
|
if (Behavior.Verbose)
|
|
{
|
|
SimpleLog.Instance.Warning("A duplicate vertex appeared and was ignored.", "Incremental.IncrementalDelaunay()");
|
|
}
|
|
vertex.type = VertexType.UndeadVertex;
|
|
mesh.undeads++;
|
|
}
|
|
}
|
|
return this.RemoveBox();
|
|
}
|
|
|
|
// Token: 0x04000130 RID: 304
|
|
private Mesh mesh;
|
|
}
|
|
}
|