void SubDiv(TVector <Vector3> vertex, TVector <TRib> rib, TVector <TTri> tri) { int high = rib.High;//т.к. будем добавлять в этот массив for (int i = 0; i <= high; i++) { if (!rib[i].cutted) { Vector3 new_vert = vertex[rib[i].v0] + vertex[rib[i].v1]; new_vert.Multiply(0.5f); vertex.Add(new_vert); TRib new_rib = rib[i]; new_rib.middle = vertex.High; new_rib.cutted = true; rib.Add(new TRib(vertex.High, new_rib.v0)); rib.Add(new TRib(vertex.High, new_rib.v1)); new_rib.part0 = rib.High - 1; new_rib.part1 = rib.High; rib[i] = new_rib; } } //TODO кучу неиспользуемых посеченных ребер хранить не обязательно high = tri.High; for (int i = 0; i <= high; i++) { TTri last_tri = tri[i]; { int v0 = rib[tri[i].r0].middle; int v1 = rib[tri[i].r1].middle; int v2 = rib[tri[i].r2].middle; rib.Add(new TRib(v0, v1)); rib.Add(new TRib(v1, v2)); rib.Add(new TRib(v2, v0)); tri.Add(new TTri(rib.High - 2, rib.High - 1, rib.High)); } // int p0 = rib[last_tri.r0].GetCommonPart(rib, rib[last_tri.r1]); int p1 = rib[last_tri.r1].GetCommonPart(rib, rib[last_tri.r0]); tri[i] = new TTri(p0, p1, rib.High - 2); // p0 = rib[last_tri.r0].GetCommonPart(rib, rib[last_tri.r2]); p1 = rib[last_tri.r2].GetCommonPart(rib, rib[last_tri.r0]); tri.Add(new TTri(p0, rib.High, p1)); // p0 = rib[last_tri.r1].GetCommonPart(rib, rib[last_tri.r2]); p1 = rib[last_tri.r2].GetCommonPart(rib, rib[last_tri.r1]); tri.Add(new TTri(p0, p1, rib.High - 1)); } }
public int GetCommonVert(TRib neighbour_rib) { for (int i = 0; i <= 1; i++) { for (int k = 0; k <= 1; k++) { if (Get(i) == neighbour_rib.Get(k)) { return(Get(i)); } } } Debug.Assert(false); return(-1); }
public int GetCommonPart(TVector <TRib> rib, TRib neighbour_rib) { //возвращает индекс part данного rib соседствующего с neighbour_rib int p = GetCommonVert(neighbour_rib); if (rib[part0].HasVert(p)) { return(part0); } else { Debug.Assert(rib[part1].HasVert(p)); return(part1); } }