protected override void Algorithm(ref Cl3DModel p_Model) { string FileName = p_Model.ModelFileFolder + p_Model.ModelFileName + m_sFilePostFix+".bmp"; Bitmap ModelBitmap = null; p_Model.GetBMPImage(out ModelBitmap, m_fPower); if(rotate180) ModelBitmap.RotateFlip(RotateFlipType.Rotate180FlipNone); if(m_bBackground) { for (int i = 0; i < ModelBitmap.Width; i++) { for (int j = 0; j < ModelBitmap.Height; j++) { Color cl = ModelBitmap.GetPixel(i, j); if (cl.Name.Equals("0") ) ModelBitmap.SetPixel(i, j, Color.FromArgb(20,255,0)); } } } ModelBitmap.Save(FileName); }
protected override void Algorithm(ref Cl3DModel p_Model) { Cl3DModel.Cl3DModelPointIterator NoseTip = null; if (!p_Model.GetSpecificPoint(Cl3DModel.eSpecificPoints.NoseTip, ref NoseTip)) throw new Exception("Cannot find specific point NoseTip"); Cl3DModel.Cl3DModelPointIterator iter = p_Model.GetIterator(); float MaxZ = float.MinValue; float MinZ = float.MaxValue; do { if(MaxZ < iter.Z) MaxZ = iter.Z; if(MinZ > iter.Z) MinZ = iter.Z; }while(iter.MoveToNext()); float step = 1f; int name = (int)step; List<Cl3DModel.Cl3DModelPointIterator> PointsToRemove = new List< Cl3DModel.Cl3DModelPointIterator>(); for (float Threshold = NoseTip.Z - step; Threshold > MinZ; Threshold -= step) { List<Cl3DModel.Cl3DModelPointIterator> PointsToCheck = new List<Cl3DModel.Cl3DModelPointIterator>(); List<Cl3DModel.Cl3DModelPointIterator> NewPoinsToCheck = new List<Cl3DModel.Cl3DModelPointIterator>(); List<Cl3DModel.Cl3DModelPointIterator> VisitedPoints = new List<Cl3DModel.Cl3DModelPointIterator>(); PointsToCheck.Add(NoseTip.CopyIterator()); while (PointsToCheck.Count != 0) { foreach (Cl3DModel.Cl3DModelPointIterator point in PointsToCheck) { if(point.IsSpecificValueCalculated("ToRemove")) continue; point.AlreadyVisited = true; VisitedPoints.Add(point.CopyIterator()); List<Cl3DModel.Cl3DModelPointIterator> Neighbors = point.GetListOfNeighbors(); foreach (Cl3DModel.Cl3DModelPointIterator Neighb in Neighbors) { if(Neighb.IsSpecificValueCalculated("ToRemove")) continue; if (Neighb.Z > Threshold && !Neighb.AlreadyVisited) { Neighb.AlreadyVisited = true; NewPoinsToCheck.Add(Neighb.CopyIterator()); } } } PointsToCheck = NewPoinsToCheck; NewPoinsToCheck = new List<Cl3DModel.Cl3DModelPointIterator>(); } Cl3DModel.Cl3DModelPointIterator unconnected = p_Model.GetIterator(); do { if (!unconnected.AlreadyVisited && unconnected.Z > Threshold && !unconnected.IsSpecificValueCalculated("ToRemove")) { if (m_SaveScreenShots) unconnected.Color = Color.Red; unconnected.AddSpecificValue("ToRemove", 1.0f); PointsToRemove.Add(unconnected.CopyIterator()); } } while (unconnected.MoveToNext()); foreach (Cl3DModel.Cl3DModelPointIterator pts in VisitedPoints) { if (m_SaveScreenShots) pts.Color = Color.Green; pts.AlreadyVisited = false; } if (m_SaveScreenShots) { Bitmap mapa; p_Model.GetBMPImage(out mapa, 1.0f); mapa.Save(p_Model.ModelFilePath + name.ToString() + ".bmp"); name += (int)step; } } List<Cl3DModel.Cl3DModelPointIterator> RemPointsVisited = new List<Cl3DModel.Cl3DModelPointIterator>(); foreach (Cl3DModel.Cl3DModelPointIterator RemPoint in PointsToRemove) { if(!RemPoint.IsValid() || RemPoint.AlreadyVisited) continue; List<Cl3DModel.Cl3DModelPointIterator> PointsToCheck = new List<Cl3DModel.Cl3DModelPointIterator>(); PointsToCheck.Add(RemPoint); bool remove = false; while (PointsToCheck.Count != 0) { List<Cl3DModel.Cl3DModelPointIterator> NewPtsToCheck = new List<Cl3DModel.Cl3DModelPointIterator>(); foreach (Cl3DModel.Cl3DModelPointIterator pt in PointsToCheck) { if (!pt.IsValid() || pt.AlreadyVisited) continue; pt.AlreadyVisited = true; RemPointsVisited.Add(pt); List<Cl3DModel.Cl3DModelPointIterator> Neighbors = pt.GetListOfNeighbors(); if (Neighbors.Count != 8) { remove = true; } else { foreach(Cl3DModel.Cl3DModelPointIterator ne in Neighbors) { if (ne.IsSpecificValueCalculated("ToRemove") && !ne.AlreadyVisited) NewPtsToCheck.Add(ne); } } } PointsToCheck = NewPtsToCheck; } if (remove) { foreach (Cl3DModel.Cl3DModelPointIterator ppt in RemPointsVisited) p_Model.RemovePointFromModel(ppt); } RemPointsVisited = new List<Cl3DModel.Cl3DModelPointIterator>(); } }