Files
Dec2017-Script-Dump/Triangle/Tools/Statistic.cs
T
2026-06-04 11:42:34 +02:00

569 lines
13 KiB
C#

using System;
using TriangleNet.Data;
using TriangleNet.Geometry;
namespace TriangleNet.Tools
{
// Token: 0x0200001A RID: 26
public class Statistic
{
// Token: 0x1700002F RID: 47
// (get) Token: 0x060000DD RID: 221 RVA: 0x00013E9D File Offset: 0x0001209D
public double ShortestEdge
{
get
{
return this.minEdge;
}
}
// Token: 0x17000030 RID: 48
// (get) Token: 0x060000DE RID: 222 RVA: 0x00013EA5 File Offset: 0x000120A5
public double LongestEdge
{
get
{
return this.maxEdge;
}
}
// Token: 0x17000031 RID: 49
// (get) Token: 0x060000DF RID: 223 RVA: 0x00013EAD File Offset: 0x000120AD
public double ShortestAltitude
{
get
{
return this.minAspect;
}
}
// Token: 0x17000032 RID: 50
// (get) Token: 0x060000E0 RID: 224 RVA: 0x00013EB5 File Offset: 0x000120B5
public double LargestAspectRatio
{
get
{
return this.maxAspect;
}
}
// Token: 0x17000033 RID: 51
// (get) Token: 0x060000E1 RID: 225 RVA: 0x00013EBD File Offset: 0x000120BD
public double SmallestArea
{
get
{
return this.minArea;
}
}
// Token: 0x17000034 RID: 52
// (get) Token: 0x060000E2 RID: 226 RVA: 0x00013EC5 File Offset: 0x000120C5
public double LargestArea
{
get
{
return this.maxArea;
}
}
// Token: 0x17000035 RID: 53
// (get) Token: 0x060000E3 RID: 227 RVA: 0x00013ECD File Offset: 0x000120CD
public double SmallestAngle
{
get
{
return this.minAngle;
}
}
// Token: 0x17000036 RID: 54
// (get) Token: 0x060000E4 RID: 228 RVA: 0x00013ED5 File Offset: 0x000120D5
public double LargestAngle
{
get
{
return this.maxAngle;
}
}
// Token: 0x17000037 RID: 55
// (get) Token: 0x060000E5 RID: 229 RVA: 0x00013EDD File Offset: 0x000120DD
public int InputVertices
{
get
{
return this.inVetrices;
}
}
// Token: 0x17000038 RID: 56
// (get) Token: 0x060000E6 RID: 230 RVA: 0x00013EE5 File Offset: 0x000120E5
public int InputTriangles
{
get
{
return this.inTriangles;
}
}
// Token: 0x17000039 RID: 57
// (get) Token: 0x060000E7 RID: 231 RVA: 0x00013EED File Offset: 0x000120ED
public int InputSegments
{
get
{
return this.inSegments;
}
}
// Token: 0x1700003A RID: 58
// (get) Token: 0x060000E8 RID: 232 RVA: 0x00013EF5 File Offset: 0x000120F5
public int InputHoles
{
get
{
return this.inHoles;
}
}
// Token: 0x1700003B RID: 59
// (get) Token: 0x060000E9 RID: 233 RVA: 0x00013EFD File Offset: 0x000120FD
public int Vertices
{
get
{
return this.outVertices;
}
}
// Token: 0x1700003C RID: 60
// (get) Token: 0x060000EA RID: 234 RVA: 0x00013F05 File Offset: 0x00012105
public int Triangles
{
get
{
return this.outTriangles;
}
}
// Token: 0x1700003D RID: 61
// (get) Token: 0x060000EB RID: 235 RVA: 0x00013F0D File Offset: 0x0001210D
public int Edges
{
get
{
return this.outEdges;
}
}
// Token: 0x1700003E RID: 62
// (get) Token: 0x060000EC RID: 236 RVA: 0x00013F15 File Offset: 0x00012115
public int BoundaryEdges
{
get
{
return this.boundaryEdges;
}
}
// Token: 0x1700003F RID: 63
// (get) Token: 0x060000ED RID: 237 RVA: 0x00013F1D File Offset: 0x0001211D
public int InteriorBoundaryEdges
{
get
{
return this.intBoundaryEdges;
}
}
// Token: 0x17000040 RID: 64
// (get) Token: 0x060000EE RID: 238 RVA: 0x00013F25 File Offset: 0x00012125
public int ConstrainedEdges
{
get
{
return this.constrainedEdges;
}
}
// Token: 0x17000041 RID: 65
// (get) Token: 0x060000EF RID: 239 RVA: 0x00013F2D File Offset: 0x0001212D
public int[] AngleHistogram
{
get
{
return this.angleTable;
}
}
// Token: 0x17000042 RID: 66
// (get) Token: 0x060000F0 RID: 240 RVA: 0x00013F35 File Offset: 0x00012135
public int[] MinAngleHistogram
{
get
{
return this.minAngles;
}
}
// Token: 0x17000043 RID: 67
// (get) Token: 0x060000F1 RID: 241 RVA: 0x00013F3D File Offset: 0x0001213D
public int[] MaxAngleHistogram
{
get
{
return this.maxAngles;
}
}
// Token: 0x060000F2 RID: 242 RVA: 0x00013F48 File Offset: 0x00012148
private void GetAspectHistogram(Mesh mesh)
{
int[] array = new int[16];
double[] array2 = new double[]
{
1.5, 2.0, 2.5, 3.0, 4.0, 6.0, 10.0, 15.0, 25.0, 50.0,
100.0, 300.0, 1000.0, 10000.0, 100000.0, 0.0
};
Otri otri = default(Otri);
Vertex[] array3 = new Vertex[3];
double[] array4 = new double[3];
double[] array5 = new double[3];
double[] array6 = new double[3];
otri.orient = 0;
foreach (Triangle triangle in mesh.triangles.Values)
{
otri.triangle = triangle;
array3[0] = otri.Org();
array3[1] = otri.Dest();
array3[2] = otri.Apex();
double num = 0.0;
for (int i = 0; i < 3; i++)
{
int num2 = Statistic.plus1Mod3[i];
int num3 = Statistic.minus1Mod3[i];
array4[i] = array3[num2].x - array3[num3].x;
array5[i] = array3[num2].y - array3[num3].y;
array6[i] = array4[i] * array4[i] + array5[i] * array5[i];
if (array6[i] > num)
{
num = array6[i];
}
}
double num4 = Math.Abs((array3[2].x - array3[0].x) * (array3[1].y - array3[0].y) - (array3[1].x - array3[0].x) * (array3[2].y - array3[0].y)) / 2.0;
double num5 = num4 * num4 / num;
double num6 = num / num5;
int num7 = 0;
while (num6 > array2[num7] * array2[num7] && num7 < 15)
{
num7++;
}
array[num7]++;
}
}
// Token: 0x060000F3 RID: 243 RVA: 0x00014138 File Offset: 0x00012338
public void Update(Mesh mesh, int sampleDegrees)
{
this.inVetrices = mesh.invertices;
this.inTriangles = mesh.inelements;
this.inSegments = mesh.insegments;
this.inHoles = mesh.holes.Count;
this.outVertices = mesh.vertices.Count - mesh.undeads;
this.outTriangles = mesh.triangles.Count;
this.outEdges = mesh.edges;
this.boundaryEdges = mesh.hullsize;
this.intBoundaryEdges = mesh.subsegs.Count - mesh.hullsize;
this.constrainedEdges = mesh.subsegs.Count;
Point[] array = new Point[3];
sampleDegrees = 60;
double[] array2 = new double[sampleDegrees / 2 - 1];
double[] array3 = new double[3];
double[] array4 = new double[3];
double[] array5 = new double[3];
double num = 3.141592653589793 / (double)sampleDegrees;
double num2 = 57.29577951308232;
this.angleTable = new int[sampleDegrees];
this.minAngles = new int[sampleDegrees];
this.maxAngles = new int[sampleDegrees];
for (int i = 0; i < sampleDegrees / 2 - 1; i++)
{
array2[i] = Math.Cos(num * (double)(i + 1));
array2[i] *= array2[i];
}
for (int j = 0; j < sampleDegrees; j++)
{
this.angleTable[j] = 0;
}
this.minAspect = mesh.bounds.Width + mesh.bounds.Height;
this.minAspect *= this.minAspect;
this.maxAspect = 0.0;
this.minEdge = this.minAspect;
this.maxEdge = 0.0;
this.minArea = this.minAspect;
this.maxArea = 0.0;
this.minAngle = 0.0;
this.maxAngle = 2.0;
bool flag = true;
bool flag2 = true;
foreach (Triangle triangle in mesh.triangles.Values)
{
double num3 = 0.0;
double num4 = 1.0;
array[0] = triangle.vertices[0];
array[1] = triangle.vertices[1];
array[2] = triangle.vertices[2];
double num5 = 0.0;
for (int k = 0; k < 3; k++)
{
int num6 = Statistic.plus1Mod3[k];
int num7 = Statistic.minus1Mod3[k];
array3[k] = array[num6].X - array[num7].X;
array4[k] = array[num6].Y - array[num7].Y;
array5[k] = array3[k] * array3[k] + array4[k] * array4[k];
if (array5[k] > num5)
{
num5 = array5[k];
}
if (array5[k] > this.maxEdge)
{
this.maxEdge = array5[k];
}
if (array5[k] < this.minEdge)
{
this.minEdge = array5[k];
}
}
double num8 = Math.Abs((array[2].X - array[0].X) * (array[1].Y - array[0].Y) - (array[1].X - array[0].X) * (array[2].Y - array[0].Y));
if (num8 < this.minArea)
{
this.minArea = num8;
}
if (num8 > this.maxArea)
{
this.maxArea = num8;
}
double num9 = num8 * num8 / num5;
if (num9 < this.minAspect)
{
this.minAspect = num9;
}
double num10 = num5 / num9;
if (num10 > this.maxAspect)
{
this.maxAspect = num10;
}
int num13;
for (int l = 0; l < 3; l++)
{
int num6 = Statistic.plus1Mod3[l];
int num7 = Statistic.minus1Mod3[l];
double num11 = array3[num6] * array3[num7] + array4[num6] * array4[num7];
double num12 = num11 * num11 / (array5[num6] * array5[num7]);
num13 = sampleDegrees / 2 - 1;
for (int m = num13 - 1; m >= 0; m--)
{
if (num12 > array2[m])
{
num13 = m;
}
}
if (num11 <= 0.0)
{
this.angleTable[num13]++;
if (num12 > this.minAngle)
{
this.minAngle = num12;
}
if (flag && num12 < this.maxAngle)
{
this.maxAngle = num12;
}
if (num12 > num3)
{
num3 = num12;
}
if (flag2 && num12 < num4)
{
num4 = num12;
}
}
else
{
this.angleTable[sampleDegrees - num13 - 1]++;
if (flag || num12 > this.maxAngle)
{
this.maxAngle = num12;
flag = false;
}
if (flag2 || num12 > num4)
{
num4 = num12;
flag2 = false;
}
}
}
num13 = sampleDegrees / 2 - 1;
for (int n = num13 - 1; n >= 0; n--)
{
if (num3 > array2[n])
{
num13 = n;
}
}
this.minAngles[num13]++;
num13 = sampleDegrees / 2 - 1;
for (int num14 = num13 - 1; num14 >= 0; num14--)
{
if (num4 > array2[num14])
{
num13 = num14;
}
}
if (flag2)
{
this.maxAngles[num13]++;
}
else
{
this.maxAngles[sampleDegrees - num13 - 1]++;
}
flag2 = true;
}
this.minEdge = Math.Sqrt(this.minEdge);
this.maxEdge = Math.Sqrt(this.maxEdge);
this.minAspect = Math.Sqrt(this.minAspect);
this.maxAspect = Math.Sqrt(this.maxAspect);
this.minArea *= 0.5;
this.maxArea *= 0.5;
if (this.minAngle >= 1.0)
{
this.minAngle = 0.0;
}
else
{
this.minAngle = num2 * Math.Acos(Math.Sqrt(this.minAngle));
}
if (this.maxAngle >= 1.0)
{
this.maxAngle = 180.0;
return;
}
if (flag)
{
this.maxAngle = num2 * Math.Acos(Math.Sqrt(this.maxAngle));
return;
}
this.maxAngle = 180.0 - num2 * Math.Acos(Math.Sqrt(this.maxAngle));
}
// Token: 0x060000F5 RID: 245 RVA: 0x000147E0 File Offset: 0x000129E0
// Note: this type is marked as 'beforefieldinit'.
static Statistic()
{
int[] array = new int[3];
array[0] = 1;
array[1] = 2;
Statistic.plus1Mod3 = array;
Statistic.minus1Mod3 = new int[] { 2, 0, 1 };
}
// Token: 0x040000A9 RID: 169
public static long InCircleCount = 0L;
// Token: 0x040000AA RID: 170
public static long InCircleAdaptCount = 0L;
// Token: 0x040000AB RID: 171
public static long CounterClockwiseCount = 0L;
// Token: 0x040000AC RID: 172
public static long CounterClockwiseAdaptCount = 0L;
// Token: 0x040000AD RID: 173
public static long Orient3dCount = 0L;
// Token: 0x040000AE RID: 174
public static long HyperbolaCount = 0L;
// Token: 0x040000AF RID: 175
public static long CircumcenterCount = 0L;
// Token: 0x040000B0 RID: 176
public static long CircleTopCount = 0L;
// Token: 0x040000B1 RID: 177
public static long RelocationCount = 0L;
// Token: 0x040000B2 RID: 178
private double minEdge;
// Token: 0x040000B3 RID: 179
private double maxEdge;
// Token: 0x040000B4 RID: 180
private double minAspect;
// Token: 0x040000B5 RID: 181
private double maxAspect;
// Token: 0x040000B6 RID: 182
private double minArea;
// Token: 0x040000B7 RID: 183
private double maxArea;
// Token: 0x040000B8 RID: 184
private double minAngle;
// Token: 0x040000B9 RID: 185
private double maxAngle;
// Token: 0x040000BA RID: 186
private int inVetrices;
// Token: 0x040000BB RID: 187
private int inTriangles;
// Token: 0x040000BC RID: 188
private int inSegments;
// Token: 0x040000BD RID: 189
private int inHoles;
// Token: 0x040000BE RID: 190
private int outVertices;
// Token: 0x040000BF RID: 191
private int outTriangles;
// Token: 0x040000C0 RID: 192
private int outEdges;
// Token: 0x040000C1 RID: 193
private int boundaryEdges;
// Token: 0x040000C2 RID: 194
private int intBoundaryEdges;
// Token: 0x040000C3 RID: 195
private int constrainedEdges;
// Token: 0x040000C4 RID: 196
private int[] angleTable;
// Token: 0x040000C5 RID: 197
private int[] minAngles;
// Token: 0x040000C6 RID: 198
private int[] maxAngles;
// Token: 0x040000C7 RID: 199
private static readonly int[] plus1Mod3;
// Token: 0x040000C8 RID: 200
private static readonly int[] minus1Mod3;
}
}