Пример #1
0
        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));
            }
        }
Пример #2
0
 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);
 }
Пример #3
0
            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);
                }
            }