Представление, которое у вас есть, немного необычно. Обычное представление Face-vertex может тривиально воспроизвести ваши ребра, поэтому явный список ребер, кажется, не добавляет никакого значения, насколько я могу видеть. Другое популярное представление - это (половина) крылатый меня sh, но для этого требуется хранить больше данных.
Я предполагаю, что цель здесь - иметь некоторые методы, которые возвращают некоторые структурные данные о me sh, такие как список связанных ребер для ребра. В противном случае ребро может быть просто двумя индексами.
Поскольку у вас может быть большое количество граней / ребер, есть смысл сохранить размер данных как можно меньшим. По этой причине я предпочитаю использовать структуры, поскольку они не связаны с объектами. Подумайте об использовании массивов, и ref возвращает / в параметрах , чтобы избежать копирования.
Один из возможных вариантов - сохранить грани / края как структуры только для данных, а MeshStructure
есть все методы. Таким образом, для итерации всех связанных ребер может быть метод IEnumerable<Edge> GetConnectedEdges(Edge edge)
.
Более сложный дизайн может заключаться в двухуровневом дизайне. Внутренняя граничная структура, которая хранит минимально возможные данные, и граничная структура publi c, которая также содержит ссылку на родительский объект, чтобы разрешить сложные методы. Это дает более приятный API за счет некоторой сложности. Пример:
public class MeshStructure
{
private Point3d[] Points ;
private EdgeInternal[] Edges ;
public Edge GetEdge(int index) => new Edge(index, this);
private readonly struct EdgeInternal
{
public int P1 { get; }
public int P2 { get; }
public EdgeInternal(int p1, int p2) => (P1, P2) = (p1, p2);
}
public readonly struct Edge
{
private readonly int edgeIndex;
private readonly MeshStructure mesh;
public int P1 => mesh.Edges[edgeIndex].P1;
public int P2 => mesh.Edges[edgeIndex].P2;
public Edge(int edgeIndex, MeshStructure mesh) => (this.edgeIndex, this.mesh) = (edgeIndex, mesh);
public IEnumerable<Edge> GetConnectedEdges()
{
var edges = mesh.Edges;
// Add logic
return null;
}
}
}