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); } } }
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 是关于骨架的操作 } }
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); } } }