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

225 lines
4.9 KiB
C#

using System;
using TriangleNet.Data;
namespace TriangleNet.Tools
{
// Token: 0x02000012 RID: 18
public class AdjacencyMatrix
{
// Token: 0x1700001E RID: 30
// (get) Token: 0x0600009B RID: 155 RVA: 0x0001158A File Offset: 0x0000F78A
public int[] AdjacencyRow
{
get
{
return this.adj_row;
}
}
// Token: 0x1700001F RID: 31
// (get) Token: 0x0600009C RID: 156 RVA: 0x00011592 File Offset: 0x0000F792
public int[] Adjacency
{
get
{
return this.adj;
}
}
// Token: 0x0600009D RID: 157 RVA: 0x0001159C File Offset: 0x0000F79C
public AdjacencyMatrix(Mesh mesh)
{
this.node_num = mesh.vertices.Count;
this.adj_row = this.AdjacencyCount(mesh);
this.adj_num = this.adj_row[this.node_num] - 1;
this.adj = this.AdjacencySet(mesh, this.adj_row);
}
// Token: 0x0600009E RID: 158 RVA: 0x000115F8 File Offset: 0x0000F7F8
public int Bandwidth()
{
int num = 0;
int num2 = 0;
for (int i = 0; i < this.node_num; i++)
{
for (int j = this.adj_row[i]; j <= this.adj_row[i + 1] - 1; j++)
{
int num3 = this.adj[j - 1];
num = Math.Max(num, i - num3);
num2 = Math.Max(num2, num3 - i);
}
}
return num + 1 + num2;
}
// Token: 0x0600009F RID: 159 RVA: 0x00011664 File Offset: 0x0000F864
private int[] AdjacencyCount(Mesh mesh)
{
int[] array = new int[this.node_num + 1];
int i;
for (i = 0; i < this.node_num; i++)
{
array[i] = 1;
}
foreach (Triangle triangle in mesh.triangles.Values)
{
int id = triangle.id;
int id2 = triangle.vertices[0].id;
int id3 = triangle.vertices[1].id;
int id4 = triangle.vertices[2].id;
int num = triangle.neighbors[2].triangle.id;
if (num < 0 || id < num)
{
array[id2]++;
array[id3]++;
}
num = triangle.neighbors[0].triangle.id;
if (num < 0 || id < num)
{
array[id3]++;
array[id4]++;
}
num = triangle.neighbors[1].triangle.id;
if (num < 0 || id < num)
{
array[id4]++;
array[id2]++;
}
}
i = this.node_num;
while (1 <= i)
{
array[i] = array[i - 1];
i--;
}
array[0] = 1;
for (int j = 1; j <= this.node_num; j++)
{
array[j] = array[j - 1] + array[j];
}
return array;
}
// Token: 0x060000A0 RID: 160 RVA: 0x0001181C File Offset: 0x0000FA1C
private int[] AdjacencySet(Mesh mesh, int[] rows)
{
int[] array = new int[this.node_num];
Array.Copy(rows, array, this.node_num);
int num = rows[this.node_num] - 1;
int[] array2 = new int[num];
for (int i = 0; i < num; i++)
{
array2[i] = -1;
}
for (int i = 0; i < this.node_num; i++)
{
array2[array[i] - 1] = i;
array[i]++;
}
foreach (Triangle triangle in mesh.triangles.Values)
{
int id = triangle.id;
int id2 = triangle.vertices[0].id;
int id3 = triangle.vertices[1].id;
int id4 = triangle.vertices[2].id;
int num2 = triangle.neighbors[2].triangle.id;
if (num2 < 0 || id < num2)
{
array2[array[id2] - 1] = id3;
array[id2]++;
array2[array[id3] - 1] = id2;
array[id3]++;
}
num2 = triangle.neighbors[0].triangle.id;
if (num2 < 0 || id < num2)
{
array2[array[id3] - 1] = id4;
array[id3]++;
array2[array[id4] - 1] = id3;
array[id4]++;
}
num2 = triangle.neighbors[1].triangle.id;
if (num2 < 0 || id < num2)
{
array2[array[id2] - 1] = id4;
array[id2]++;
array2[array[id4] - 1] = id2;
array[id4]++;
}
}
for (int i = 0; i < this.node_num; i++)
{
int num3 = rows[i];
int num4 = rows[i + 1] - 1;
this.HeapSort(array2, num3 - 1, num4 + 1 - num3);
}
return array2;
}
// Token: 0x060000A1 RID: 161 RVA: 0x00011A38 File Offset: 0x0000FC38
private void CreateHeap(int[] a, int offset, int size)
{
int num = size / 2 - 1;
while (0 <= num)
{
int num2 = a[offset + num];
int num3 = num;
for (;;)
{
int num4 = 2 * num3 + 1;
if (size <= num4)
{
break;
}
if (num4 + 1 < size && a[offset + num4] < a[offset + num4 + 1])
{
num4++;
}
if (num2 >= a[offset + num4])
{
break;
}
a[offset + num3] = a[offset + num4];
num3 = num4;
}
a[offset + num3] = num2;
num--;
}
}
// Token: 0x060000A2 RID: 162 RVA: 0x00011A9C File Offset: 0x0000FC9C
private void HeapSort(int[] a, int offset, int size)
{
if (size <= 1)
{
return;
}
this.CreateHeap(a, offset, size);
int num = a[offset];
a[offset] = a[offset + size - 1];
a[offset + size - 1] = num;
int num2 = size - 1;
while (2 <= num2)
{
this.CreateHeap(a, offset, num2);
num = a[offset];
a[offset] = a[offset + num2 - 1];
a[offset + num2 - 1] = num;
num2--;
}
}
// Token: 0x04000086 RID: 134
private int node_num;
// Token: 0x04000087 RID: 135
private int adj_num;
// Token: 0x04000088 RID: 136
private int[] adj_row;
// Token: 0x04000089 RID: 137
private int[] adj;
}
}