Пример #1
0
        private void DFSFindLimb(SkeRecord skeRcd, int start, bool[] sflag, out List <int> retl)
        {
            retl = new List <int>();
            bool[]      sflag_internal = (bool[])sflag.Clone();
            Stack <int> SkeS           = new Stack <int>();

            SkeS.Push(start);
            while (SkeS.Count != 0)
            {
                int cur = SkeS.Pop();
                retl.Add(cur);
                sflag_internal[cur] = true;
                int[] neighb_ = skeRcd.adjVV[cur].ToArray();
                for (int i = 0; i < neighb_.Length; i++)
                {
                    int adjv_num = neighb_[i];
                    if (sflag_internal[adjv_num])
                    {
                        continue;
                    }
                    if (skeRcd.adjVV[adjv_num].Count == 1)   // find end
                    {
                        retl.Add(adjv_num);
                        for (int j = 0; j < retl.Count; j++)
                        {
                            sflag[retl[j]] = true;
                        }
                        return;
                    }
                    SkeS.Push(adjv_num);
                }
            }
        }
Пример #2
0
        public Segmentation(Skeletonizer skel, Mesh currmesh)
        {
            segMesh = currmesh;
            int numSkSeq = 100; // 骨架的分段数量

            if (skel != null)
            {
                skeRcd   = skel.ReturnSkeleton(); // get skeleton from sig08
                interval = (double)skeRcd.skeLength / numSkSeq;
                SkeletonRefining(interval);       // refine
                SegmentToPart();                  //get partskelseq 是关于骨架的操作
            }
        }
Пример #3
0
        private void DFSFindHead(SkeRecord skeRcd, int chest4v, Vector3d torsoDown, bool[] sflag, out List <int> retl)
        {
            bool[] sflag_internal = (bool[])sflag.Clone();
            int[]  neighb = skeRcd.adjVV[chest4v].ToArray();
            int    hi = 0; double mindot = double.MaxValue;

            for (int i = 0; i < neighb.Length; i++)
            {
                Vector3d vec_t = (skeRcd.nodePosList[chest4v] - skeRcd.nodePosList[neighb[i]]).Normalize();
                if (vec_t.Dot(torsoDown) < mindot)
                {
                    hi = neighb[i]; mindot = vec_t.Dot(torsoDown);
                }
            }
            retl = new List <int>();
            retl.Add(chest4v);
            sflag_internal[chest4v] = true;
            Stack <int> SkeS = new Stack <int>();

            SkeS.Push(hi);
            while (SkeS.Count != 0)
            {
                int cur = SkeS.Pop();
                retl.Add(cur);
                sflag_internal[cur] = true;
                int[] neighb_ = skeRcd.adjVV[cur].ToArray();
                for (int i = 0; i < neighb_.Length; i++)
                {
                    int adjv_num = neighb_[i];
                    if (sflag_internal[adjv_num])
                    {
                        continue;
                    }
                    if (skeRcd.adjVV[adjv_num].Count == 1)   // find end
                    {
                        retl.Add(adjv_num);
                        for (int j = 0; j < retl.Count; j++)
                        {
                            sflag[retl[j]] = true;
                        }
                        return;
                    }
                    SkeS.Push(adjv_num);
                }
            }
        }