409 lines
9.3 KiB
C#
409 lines
9.3 KiB
C#
using System;
|
|
using TriangleNet.Data;
|
|
using TriangleNet.Geometry;
|
|
|
|
namespace TriangleNet.Tools
|
|
{
|
|
// Token: 0x02000018 RID: 24
|
|
public class QualityMeasure
|
|
{
|
|
// Token: 0x060000CA RID: 202 RVA: 0x000139C2 File Offset: 0x00011BC2
|
|
public QualityMeasure()
|
|
{
|
|
this.areaMeasure = new QualityMeasure.AreaMeasure();
|
|
this.alphaMeasure = new QualityMeasure.AlphaMeasure();
|
|
this.qMeasure = new QualityMeasure.Q_Measure();
|
|
}
|
|
|
|
// Token: 0x17000024 RID: 36
|
|
// (get) Token: 0x060000CB RID: 203 RVA: 0x000139EB File Offset: 0x00011BEB
|
|
public double AreaMinimum
|
|
{
|
|
get
|
|
{
|
|
return this.areaMeasure.area_min;
|
|
}
|
|
}
|
|
|
|
// Token: 0x17000025 RID: 37
|
|
// (get) Token: 0x060000CC RID: 204 RVA: 0x000139F8 File Offset: 0x00011BF8
|
|
public double AreaMaximum
|
|
{
|
|
get
|
|
{
|
|
return this.areaMeasure.area_max;
|
|
}
|
|
}
|
|
|
|
// Token: 0x17000026 RID: 38
|
|
// (get) Token: 0x060000CD RID: 205 RVA: 0x00013A05 File Offset: 0x00011C05
|
|
public double AreaRatio
|
|
{
|
|
get
|
|
{
|
|
return this.areaMeasure.area_max / this.areaMeasure.area_min;
|
|
}
|
|
}
|
|
|
|
// Token: 0x17000027 RID: 39
|
|
// (get) Token: 0x060000CE RID: 206 RVA: 0x00013A1E File Offset: 0x00011C1E
|
|
public double AlphaMinimum
|
|
{
|
|
get
|
|
{
|
|
return this.alphaMeasure.alpha_min;
|
|
}
|
|
}
|
|
|
|
// Token: 0x17000028 RID: 40
|
|
// (get) Token: 0x060000CF RID: 207 RVA: 0x00013A2B File Offset: 0x00011C2B
|
|
public double AlphaMaximum
|
|
{
|
|
get
|
|
{
|
|
return this.alphaMeasure.alpha_max;
|
|
}
|
|
}
|
|
|
|
// Token: 0x17000029 RID: 41
|
|
// (get) Token: 0x060000D0 RID: 208 RVA: 0x00013A38 File Offset: 0x00011C38
|
|
public double AlphaAverage
|
|
{
|
|
get
|
|
{
|
|
return this.alphaMeasure.alpha_ave;
|
|
}
|
|
}
|
|
|
|
// Token: 0x1700002A RID: 42
|
|
// (get) Token: 0x060000D1 RID: 209 RVA: 0x00013A45 File Offset: 0x00011C45
|
|
public double AlphaArea
|
|
{
|
|
get
|
|
{
|
|
return this.alphaMeasure.alpha_area;
|
|
}
|
|
}
|
|
|
|
// Token: 0x1700002B RID: 43
|
|
// (get) Token: 0x060000D2 RID: 210 RVA: 0x00013A52 File Offset: 0x00011C52
|
|
public double Q_Minimum
|
|
{
|
|
get
|
|
{
|
|
return this.qMeasure.q_min;
|
|
}
|
|
}
|
|
|
|
// Token: 0x1700002C RID: 44
|
|
// (get) Token: 0x060000D3 RID: 211 RVA: 0x00013A5F File Offset: 0x00011C5F
|
|
public double Q_Maximum
|
|
{
|
|
get
|
|
{
|
|
return this.qMeasure.q_max;
|
|
}
|
|
}
|
|
|
|
// Token: 0x1700002D RID: 45
|
|
// (get) Token: 0x060000D4 RID: 212 RVA: 0x00013A6C File Offset: 0x00011C6C
|
|
public double Q_Average
|
|
{
|
|
get
|
|
{
|
|
return this.qMeasure.q_ave;
|
|
}
|
|
}
|
|
|
|
// Token: 0x1700002E RID: 46
|
|
// (get) Token: 0x060000D5 RID: 213 RVA: 0x00013A79 File Offset: 0x00011C79
|
|
public double Q_Area
|
|
{
|
|
get
|
|
{
|
|
return this.qMeasure.q_area;
|
|
}
|
|
}
|
|
|
|
// Token: 0x060000D6 RID: 214 RVA: 0x00013A86 File Offset: 0x00011C86
|
|
public void Update(Mesh mesh)
|
|
{
|
|
this.mesh = mesh;
|
|
this.areaMeasure.Reset();
|
|
this.alphaMeasure.Reset();
|
|
this.qMeasure.Reset();
|
|
this.Compute();
|
|
}
|
|
|
|
// Token: 0x060000D7 RID: 215 RVA: 0x00013AB8 File Offset: 0x00011CB8
|
|
private void Compute()
|
|
{
|
|
int num = 0;
|
|
foreach (Triangle triangle in this.mesh.triangles.Values)
|
|
{
|
|
num++;
|
|
Point point = triangle.vertices[0];
|
|
Point point2 = triangle.vertices[1];
|
|
Point point3 = triangle.vertices[2];
|
|
double num2 = point.x - point2.x;
|
|
double num3 = point.y - point2.y;
|
|
double num4 = Math.Sqrt(num2 * num2 + num3 * num3);
|
|
double num5 = point2.x - point3.x;
|
|
num3 = point2.y - point3.y;
|
|
double num6 = Math.Sqrt(num5 * num5 + num3 * num3);
|
|
double num7 = point3.x - point.x;
|
|
num3 = point3.y - point.y;
|
|
double num8 = Math.Sqrt(num7 * num7 + num3 * num3);
|
|
double num9 = this.areaMeasure.Measure(point, point2, point3);
|
|
this.alphaMeasure.Measure(num4, num6, num8, num9);
|
|
this.qMeasure.Measure(num4, num6, num8, num9);
|
|
}
|
|
this.alphaMeasure.Normalize(num, this.areaMeasure.area_total);
|
|
this.qMeasure.Normalize(num, this.areaMeasure.area_total);
|
|
}
|
|
|
|
// Token: 0x060000D8 RID: 216 RVA: 0x00013C20 File Offset: 0x00011E20
|
|
public int Bandwidth()
|
|
{
|
|
if (this.mesh == null)
|
|
{
|
|
return 0;
|
|
}
|
|
int num = 0;
|
|
int num2 = 0;
|
|
foreach (Triangle triangle in this.mesh.triangles.Values)
|
|
{
|
|
for (int i = 0; i < 3; i++)
|
|
{
|
|
int id = triangle.GetVertex(i).id;
|
|
for (int j = 0; j < 3; j++)
|
|
{
|
|
int id2 = triangle.GetVertex(j).id;
|
|
num2 = Math.Max(num2, id2 - id);
|
|
num = Math.Max(num, id - id2);
|
|
}
|
|
}
|
|
}
|
|
return num + 1 + num2;
|
|
}
|
|
|
|
// Token: 0x040000A3 RID: 163
|
|
private QualityMeasure.AreaMeasure areaMeasure;
|
|
|
|
// Token: 0x040000A4 RID: 164
|
|
private QualityMeasure.AlphaMeasure alphaMeasure;
|
|
|
|
// Token: 0x040000A5 RID: 165
|
|
private QualityMeasure.Q_Measure qMeasure;
|
|
|
|
// Token: 0x040000A6 RID: 166
|
|
private Mesh mesh;
|
|
|
|
// Token: 0x02000041 RID: 65
|
|
private class AreaMeasure
|
|
{
|
|
// Token: 0x06000246 RID: 582 RVA: 0x0001B9BC File Offset: 0x00019BBC
|
|
public void Reset()
|
|
{
|
|
this.area_min = double.MaxValue;
|
|
this.area_max = double.MinValue;
|
|
this.area_total = 0.0;
|
|
this.area_zero = 0;
|
|
}
|
|
|
|
// Token: 0x06000247 RID: 583 RVA: 0x0001B9F4 File Offset: 0x00019BF4
|
|
public double Measure(Point a, Point b, Point c)
|
|
{
|
|
double num = 0.5 * Math.Abs(a.x * (b.y - c.y) + b.x * (c.y - a.y) + c.x * (a.y - b.y));
|
|
this.area_min = Math.Min(this.area_min, num);
|
|
this.area_max = Math.Max(this.area_max, num);
|
|
this.area_total += num;
|
|
if (num == 0.0)
|
|
{
|
|
this.area_zero++;
|
|
}
|
|
return num;
|
|
}
|
|
|
|
// Token: 0x0400013D RID: 317
|
|
public double area_min = double.MaxValue;
|
|
|
|
// Token: 0x0400013E RID: 318
|
|
public double area_max = double.MinValue;
|
|
|
|
// Token: 0x0400013F RID: 319
|
|
public double area_total;
|
|
|
|
// Token: 0x04000140 RID: 320
|
|
public int area_zero;
|
|
}
|
|
|
|
// Token: 0x02000042 RID: 66
|
|
private class AlphaMeasure
|
|
{
|
|
// Token: 0x06000249 RID: 585 RVA: 0x0001BAC2 File Offset: 0x00019CC2
|
|
public void Reset()
|
|
{
|
|
this.alpha_min = double.MaxValue;
|
|
this.alpha_max = double.MinValue;
|
|
this.alpha_ave = 0.0;
|
|
this.alpha_area = 0.0;
|
|
}
|
|
|
|
// Token: 0x0600024A RID: 586 RVA: 0x0001BB00 File Offset: 0x00019D00
|
|
private double acos(double c)
|
|
{
|
|
if (c <= -1.0)
|
|
{
|
|
return 3.141592653589793;
|
|
}
|
|
if (1.0 <= c)
|
|
{
|
|
return 0.0;
|
|
}
|
|
return Math.Acos(c);
|
|
}
|
|
|
|
// Token: 0x0600024B RID: 587 RVA: 0x0001BB34 File Offset: 0x00019D34
|
|
public double Measure(double ab, double bc, double ca, double area)
|
|
{
|
|
double num = double.MaxValue;
|
|
double num2 = ab * ab;
|
|
double num3 = bc * bc;
|
|
double num4 = ca * ca;
|
|
double num5;
|
|
double num6;
|
|
double num7;
|
|
if (ab == 0.0 && bc == 0.0 && ca == 0.0)
|
|
{
|
|
num5 = 2.0943951023931953;
|
|
num6 = 2.0943951023931953;
|
|
num7 = 2.0943951023931953;
|
|
}
|
|
else
|
|
{
|
|
if (ca == 0.0 || ab == 0.0)
|
|
{
|
|
num5 = 3.141592653589793;
|
|
}
|
|
else
|
|
{
|
|
num5 = this.acos((num4 + num2 - num3) / (2.0 * ca * ab));
|
|
}
|
|
if (ab == 0.0 || bc == 0.0)
|
|
{
|
|
num6 = 3.141592653589793;
|
|
}
|
|
else
|
|
{
|
|
num6 = this.acos((num2 + num3 - num4) / (2.0 * ab * bc));
|
|
}
|
|
if (bc == 0.0 || ca == 0.0)
|
|
{
|
|
num7 = 3.141592653589793;
|
|
}
|
|
else
|
|
{
|
|
num7 = this.acos((num3 + num4 - num2) / (2.0 * bc * ca));
|
|
}
|
|
}
|
|
num = Math.Min(num, num5);
|
|
num = Math.Min(num, num6);
|
|
num = Math.Min(num, num7);
|
|
num = num * 3.0 / 3.141592653589793;
|
|
this.alpha_ave += num;
|
|
this.alpha_area += area * num;
|
|
this.alpha_min = Math.Min(num, this.alpha_min);
|
|
this.alpha_max = Math.Max(num, this.alpha_max);
|
|
return num;
|
|
}
|
|
|
|
// Token: 0x0600024C RID: 588 RVA: 0x0001BCD8 File Offset: 0x00019ED8
|
|
public void Normalize(int n, double area_total)
|
|
{
|
|
if (n > 0)
|
|
{
|
|
this.alpha_ave /= (double)n;
|
|
}
|
|
else
|
|
{
|
|
this.alpha_ave = 0.0;
|
|
}
|
|
if (0.0 < area_total)
|
|
{
|
|
this.alpha_area /= area_total;
|
|
return;
|
|
}
|
|
this.alpha_area = 0.0;
|
|
}
|
|
|
|
// Token: 0x04000141 RID: 321
|
|
public double alpha_min;
|
|
|
|
// Token: 0x04000142 RID: 322
|
|
public double alpha_max;
|
|
|
|
// Token: 0x04000143 RID: 323
|
|
public double alpha_ave;
|
|
|
|
// Token: 0x04000144 RID: 324
|
|
public double alpha_area;
|
|
}
|
|
|
|
// Token: 0x02000043 RID: 67
|
|
private class Q_Measure
|
|
{
|
|
// Token: 0x0600024E RID: 590 RVA: 0x0001BD33 File Offset: 0x00019F33
|
|
public void Reset()
|
|
{
|
|
this.q_min = double.MaxValue;
|
|
this.q_max = double.MinValue;
|
|
this.q_ave = 0.0;
|
|
this.q_area = 0.0;
|
|
}
|
|
|
|
// Token: 0x0600024F RID: 591 RVA: 0x0001BD74 File Offset: 0x00019F74
|
|
public double Measure(double ab, double bc, double ca, double area)
|
|
{
|
|
double num = (bc + ca - ab) * (ca + ab - bc) * (ab + bc - ca) / (ab * bc * ca);
|
|
this.q_min = Math.Min(this.q_min, num);
|
|
this.q_max = Math.Max(this.q_max, num);
|
|
this.q_ave += num;
|
|
this.q_area += num * area;
|
|
return num;
|
|
}
|
|
|
|
// Token: 0x06000250 RID: 592 RVA: 0x0001BDE0 File Offset: 0x00019FE0
|
|
public void Normalize(int n, double area_total)
|
|
{
|
|
if (n > 0)
|
|
{
|
|
this.q_ave /= (double)n;
|
|
}
|
|
else
|
|
{
|
|
this.q_ave = 0.0;
|
|
}
|
|
if (area_total > 0.0)
|
|
{
|
|
this.q_area /= area_total;
|
|
return;
|
|
}
|
|
this.q_area = 0.0;
|
|
}
|
|
|
|
// Token: 0x04000145 RID: 325
|
|
public double q_min;
|
|
|
|
// Token: 0x04000146 RID: 326
|
|
public double q_max;
|
|
|
|
// Token: 0x04000147 RID: 327
|
|
public double q_ave;
|
|
|
|
// Token: 0x04000148 RID: 328
|
|
public double q_area;
|
|
}
|
|
}
|
|
}
|