protected override void Algorithm(ref Cl3DModel p_Model)
        {
            if (NormalsAdded.Count != 0)
            {
                foreach (Cl3DModel.Cl3DModelPointIterator pt in NormalsAdded)
                {
                    p_Model.RemovePointFromModel(pt);
                }

                NormalsAdded = new List <Cl3DModel.Cl3DModelPointIterator>();
            }

            Cl3DModel.Cl3DModelPointIterator iter = p_Model.GetIterator();
            do
            {
                Vector NormalVector = null;
                if (UsePCA)
                {
                    ClTools.CalculateNormalVectorInPointUsingPCA(iter.X, iter.Y, iter.Z, iter.GetListOfNeighbors(), out NormalVector);
                }
                else
                {
                    ClTools.CalculateNormalVectorInPoint(iter.X, iter.Y, iter.Z, iter.GetListOfNeighbors(), out NormalVector);
                }

                double norm = Math.Sqrt(Math.Pow(NormalVector[0], 2) + Math.Pow(NormalVector[1], 2) + Math.Pow(NormalVector[2], 2));
                if (norm != 0)
                {
                    NormalVector[0] /= (float)norm;
                    NormalVector[1] /= (float)norm;
                    NormalVector[2] /= (float)norm;
                }
                iter.NormalVector = NormalVector;

                if (ShowNormals)
                {
                    Cl3DModel.Cl3DModelPointIterator point = p_Model.AddPointToModel(iter.X - (float)NormalVector[0] * 3, iter.Y - (float)NormalVector[1] * 3, iter.Z - (float)NormalVector[2] * 3);
                    iter.AddNeighbor(point);
                    NormalsAdded.Add(point);
                }
            } while (iter.MoveToNext());
        }
        private void SampleUVParametriztion(Cl3DModel p_Model, out Cl3DModel.Cl3DModelPointIterator[,] SampledModel, int MatrixWidth, int MatrixHeight)
        {
            Cl3DModel.Cl3DModelPointIterator iter = p_Model.GetIterator();
            float maxU = iter.U;
            float minU = iter.U;
            float maxV = iter.V;
            float minV = iter.V;

            do
            {
                if (maxU < iter.U)
                {
                    maxU = iter.U;
                }
                if (maxV < iter.V)
                {
                    maxV = iter.V;
                }

                if (minU > iter.U)
                {
                    minU = iter.U;
                }
                if (minV > iter.V)
                {
                    minV = iter.V;
                }
            } while (iter.MoveToNext());

            List <Cl3DModel.Cl3DModelPointIterator>[,] SampledModelList = new List <Cl3DModel.Cl3DModelPointIterator> [MatrixWidth, MatrixHeight];
            SampledModel = new Cl3DModel.Cl3DModelPointIterator[MatrixWidth, MatrixHeight];

            iter = p_Model.GetIterator();
            do
            {
                float U = iter.U - minU;
                float V = iter.V - minV;

                int RoundU = (int)((U / (maxU - minU)) * (MatrixWidth - 1));
                int RoundV = (int)((V / (maxV - minV)) * (MatrixHeight - 1));

                if (SampledModelList[RoundU, RoundV] == null)
                {
                    SampledModelList[RoundU, RoundV] = new List <Cl3DModel.Cl3DModelPointIterator>();
                }

                SampledModelList[RoundU, RoundV].Add(iter.CopyIterator());
            } while (iter.MoveToNext());

            for (int i = 0; i < MatrixWidth; i++)
            {
                for (int j = 0; j < MatrixHeight; j++)
                {
                    if (SampledModelList[i, j] != null)
                    {
                        float  x          = 0;
                        float  y          = 0;
                        float  z          = 0;
                        float  u          = 0;
                        float  v          = 0;
                        int    ColorR     = 0;
                        int    ColorG     = 0;
                        int    ColorB     = 0;
                        string specPoint  = Cl3DModel.eSpecificPoints.UnspecifiedPoint.ToString();
                        bool   isSpecific = false;

                        Dictionary <string, double> SumOfSpecificValues = new Dictionary <string, double>();
                        foreach (Cl3DModel.Cl3DModelPointIterator pts in SampledModelList[i, j])
                        {
                            pts.AlreadyVisited = true;
                            if (!isSpecific)
                            {
                                isSpecific = p_Model.IsThisPointInSpecificPoints(pts, ref specPoint);
                            }

                            List <string> specValues = pts.GetListOfSpecificValues();
                            foreach (string valueName in specValues)
                            {
                                double currentVal = 0;
                                pts.GetSpecificValue(valueName, out currentVal);
                                double countedVal = 0;
                                SumOfSpecificValues.TryGetValue(valueName, out countedVal);

                                SumOfSpecificValues.Remove(valueName);
                                SumOfSpecificValues.Add(valueName, countedVal + currentVal);
                            }
                            x      += pts.X;
                            y      += pts.Y;
                            z      += pts.Z;
                            u      += pts.U;
                            v      += pts.V;
                            ColorR += pts.ColorR;
                            ColorG += pts.ColorG;
                            ColorB += pts.ColorB;
                        }

                        int Count = SampledModelList[i, j].Count;

                        List <Cl3DModel.Cl3DModelPointIterator> connections = new List <Cl3DModel.Cl3DModelPointIterator>();

                        foreach (Cl3DModel.Cl3DModelPointIterator point in SampledModelList[i, j])
                        {
                            foreach (Cl3DModel.Cl3DModelPointIterator InnerPoint in point.GetListOfNeighbors())
                            {
                                if (InnerPoint.AlreadyVisited == false)
                                {
                                    connections.Add(InnerPoint);
                                }
                            }
                        }

                        Cl3DModel.Cl3DModelPointIterator pt = p_Model.AddPointToModel(x / Count,
                                                                                      y / Count,
                                                                                      z / Count);
                        pt.Color = Color.FromArgb(ColorR / Count,
                                                  ColorG / Count,
                                                  ColorB / Count);

                        pt.U = (int)((u / SampledModelList[i, j].Count) / maxU * MatrixWidth);
                        pt.V = (int)((v / SampledModelList[i, j].Count) / maxV * MatrixHeight);

                        foreach (KeyValuePair <string, double> SpecVal in SumOfSpecificValues)
                        {
                            pt.AddSpecificValue(SpecVal.Key, SpecVal.Value / Count);
                        }

                        SampledModel[i, j] = pt;

                        if (isSpecific)
                        {
                            p_Model.AddSpecificPoint(specPoint, pt);
                        }

                        foreach (Cl3DModel.Cl3DModelPointIterator point in SampledModelList[i, j])
                        {
                            p_Model.RemovePointFromModel(point);
                        }

                        foreach (Cl3DModel.Cl3DModelPointIterator point in connections)
                        {
                            pt.AddNeighbor(point);
                        }
                    }
                }
            }
        }
        protected override void Algorithm(ref Cl3DModel p_Model)
        {
            Cl3DModel.Cl3DModelPointIterator Center = p_Model.GetSpecificPoint(Cl3DModel.eSpecificPoints.NoseTip);

            Cl3DModel.Cl3DModelPointIterator        iter             = p_Model.GetIterator();
            List <Cl3DModel.Cl3DModelPointIterator> BoundaryVertexes = new List <Cl3DModel.Cl3DModelPointIterator>();

            Cl3DModel.Cl3DModelPointIterator BeginningPoint = null;
            do
            {
                if (iter.GetListOfNeighbors().Count <= 7)
                {
                    iter.AlreadyVisited = true;
                    // iter.Color = Color.Red;

                    if (BeginningPoint == null)
                    {
                        BeginningPoint = iter.CopyIterator();
                    }

                    BoundaryVertexes.Add(iter.CopyIterator());
                }
            } while (iter.MoveToNext());

            Cl3DModel.Cl3DModelPointIterator CurrentPoint = BeginningPoint.CopyIterator();
            Vector NormalVector   = new Vector(3);
            bool   IsNextInTheQue = false;
            float  CurrentNo      = 0;

            do
            {
                CurrentPoint.AlreadyVisited = false;
                Cl3DModel.Cl3DModelPointIterator NextPoint = null;
                IsNextInTheQue = false;
                foreach (Cl3DModel.Cl3DModelPointIterator neighbor in CurrentPoint.GetListOfNeighbors())
                {
                    if (neighbor.AlreadyVisited) // means next in the que
                    {
                        NextPoint      = neighbor.CopyIterator();
                        IsNextInTheQue = true;
                        break;
                    }
                }
                if (NextPoint == null)
                {
                    break;
                }

                Vector tmpVectorCurr = new Vector(new double[] { (CurrentPoint.X - Center.X), (CurrentPoint.Y - Center.Y), (CurrentPoint.Z - Center.Z) });
                Vector tmpVectorNext = new Vector(new double[] { (NextPoint.X - Center.X), (NextPoint.Y - Center.Y), (NextPoint.Z - Center.Z) });

                NormalVector[0] += (tmpVectorNext[1] * tmpVectorCurr[2] - tmpVectorNext[2] * tmpVectorCurr[1]);
                NormalVector[1] += (tmpVectorNext[2] * tmpVectorCurr[0] - tmpVectorNext[0] * tmpVectorCurr[2]);
                NormalVector[2] += (tmpVectorNext[0] * tmpVectorCurr[1] - tmpVectorNext[1] * tmpVectorCurr[0]);

                NormalVector      /= 2;
                CurrentPoint.Color = ClTools.GetColorRGB(CurrentNo / BoundaryVertexes.Count, 1f);
                CurrentNo++;

                CurrentPoint = NextPoint.CopyIterator();
            } while (IsNextInTheQue);

            //NormalVector = NormalVector.Normalize();
            Center.AddNeighbor(p_Model.AddPointToModel((float)NormalVector[0] + Center.X, (float)NormalVector[1] + Center.Y, (float)NormalVector[2] + Center.Z));


            /*   Cl3DModel.Cl3DModelPointIterator iter = p_Model.GetIterator();
             * while(iter.IsValid())
             * {
             *     float X = iter.X;
             *     float Y = iter.Y;
             *     float Z = iter.Z;
             *     ClTools.RotateXDirection(X, Y, Z, agnleX, out X, out Y, out Z);
             *     ClTools.RotateYDirection(X, Y, Z, angleY, out X, out Y, out Z);
             *     ClTools.RotateZDirection(X, Y, Z, agnleZ, out X, out Y, out Z);
             *
             *     iter.X = X;
             *     iter.Y = Y;
             *     iter.Z = Z;
             *
             *     if (!iter.MoveToNext())
             *         break;
             * }
             */
        }
        protected override void Algorithm(ref Cl3DModel p_Model)
        {
            Cl3DModel.Cl3DModelPointIterator iter = p_Model.GetIterator();
            int maxX = (int)iter.X;
            int minX = (int)iter.X;
            int maxY = (int)iter.Y;
            int minY = (int)iter.Y;

            do
            {
                if (maxX < iter.X)
                {
                    maxX = (int)iter.X;
                }
                if (maxY < iter.Y)
                {
                    maxY = (int)iter.Y;
                }

                if (minX > iter.X)
                {
                    minX = (int)iter.X;
                }
                if (minY > iter.Y)
                {
                    minY = (int)iter.Y;
                }
            } while (iter.MoveToNext());

            int width  = (maxX - minX) + 1;
            int height = (maxY - minY) + 1;

            List <Cl3DModel.Cl3DModelPointIterator>[,] map = new List <Cl3DModel.Cl3DModelPointIterator> [width, height];

            iter = p_Model.GetIterator();
            do
            {
                int x = (int)iter.X - minX;
                int y = (int)iter.Y - minY;
                if (map[x, y] == null)
                {
                    map[x, y] = new List <Cl3DModel.Cl3DModelPointIterator>();
                }

                map[x, y].Add(iter.CopyIterator());
            } while (iter.MoveToNext());

            for (int x = 0; x < width; x++)
            {
                for (int y = 0; y < height; y++)
                {
                    if (map[x, y] != null)
                    {
                        int   MeanR = 0;
                        int   MeanG = 0;
                        int   MeanB = 0;
                        float MeanX = 0;
                        float MeanY = 0;
                        float MeanZ = 0;

                        float MeanU = 0;
                        float MeanV = 0;

                        float MeanRangeX = 0;
                        float MeanRangeY = 0;

                        Dictionary <string, List <double> > MeanSpecificValues = new Dictionary <string, List <double> >();

                        Cl3DModel.Cl3DModelPointIterator MaxPoint = null;

                        string specPoint  = Cl3DModel.eSpecificPoints.UnspecifiedPoint.ToString();
                        bool   isSpecific = false;
                        foreach (Cl3DModel.Cl3DModelPointIterator point in map[x, y])
                        {
                            point.AlreadyVisited = true;
                            if (!isSpecific)
                            {
                                isSpecific = p_Model.IsThisPointInSpecificPoints(point, ref specPoint);
                            }

                            if (m_bMean)
                            {
                                MeanR += point.ColorR;
                                MeanG += point.ColorG;
                                MeanB += point.ColorB;
                                MeanX += point.X;
                                MeanY += point.Y;
                                MeanZ += point.Z;

                                MeanU += point.U;
                                MeanV += point.V;

                                MeanRangeX += point.RangeImageX;
                                MeanRangeY += point.RangeImageY;

                                List <string> listOfValuesNames = point.GetListOfSpecificValues();
                                foreach (string name in listOfValuesNames)
                                {
                                    List <double> listOfValues = null;
                                    if (!MeanSpecificValues.TryGetValue(name, out listOfValues))
                                    {
                                        listOfValues = new List <double>();
                                        MeanSpecificValues.Add(name, listOfValues);
                                    }
                                    double val = point.GetSpecificValue(name);
                                    listOfValues.Add(val);
                                }
                            }
                            else
                            {// search for max Z
                                if (MaxPoint == null)
                                {
                                    MaxPoint = point;
                                }
                                else if (MaxPoint.Z < point.Z)
                                {
                                    MaxPoint = point;
                                }
                            }
                        }

                        if (m_bMean)
                        {
                            MeanR /= map[x, y].Count;
                            MeanG /= map[x, y].Count;
                            MeanB /= map[x, y].Count;
                            MeanX /= map[x, y].Count;
                            MeanY /= map[x, y].Count;
                            MeanZ /= map[x, y].Count;

                            MeanU /= map[x, y].Count;
                            MeanV /= map[x, y].Count;

                            MeanRangeX /= map[x, y].Count;
                            MeanRangeY /= map[x, y].Count;
                        }
                        else
                        {
                            MeanR = MaxPoint.ColorR;
                            MeanG = MaxPoint.ColorG;
                            MeanB = MaxPoint.ColorB;
                            MeanX = MaxPoint.X;
                            MeanY = MaxPoint.Y;
                            MeanZ = MaxPoint.Z;

                            MeanU = MaxPoint.U;
                            MeanV = MaxPoint.V;

                            MeanRangeX = MaxPoint.RangeImageX;
                            MeanRangeY = MaxPoint.RangeImageY;
                        }

                        List <Cl3DModel.Cl3DModelPointIterator> connections = new List <Cl3DModel.Cl3DModelPointIterator>();

                        foreach (Cl3DModel.Cl3DModelPointIterator point in map[x, y])
                        {
                            foreach (Cl3DModel.Cl3DModelPointIterator InnerPoint in point.GetListOfNeighbors())
                            {
                                if (InnerPoint.AlreadyVisited == false)
                                {
                                    connections.Add(InnerPoint);
                                }
                            }
                        }

                        Cl3DModel.Cl3DModelPointIterator pt = p_Model.AddPointToModel((int)MeanX, (int)MeanY, MeanZ, x, width - y);
                        pt.Color = Color.FromArgb(MeanR, MeanG, MeanB);
                        pt.U     = MeanU;
                        pt.V     = MeanV;

                        foreach (KeyValuePair <string, List <double> > kvValues in MeanSpecificValues)
                        {
                            string        valueName = kvValues.Key;
                            List <double> values    = kvValues.Value;
                            double        meanVal   = 0;
                            foreach (double val in values)
                            {
                                meanVal += val;
                            }
                            meanVal /= values.Count;
                            pt.AddSpecificValue("Mean_" + valueName, meanVal);
                        }


                        if (isSpecific)
                        {
                            p_Model.AddSpecificPoint(specPoint, pt);
                        }

                        List <Cl3DModel.Cl3DModelPointIterator> lista = map[x, y];
                        for (int i = 0; i < lista.Count; i++)
                        {
                            p_Model.RemovePointFromModel(lista[i]);
                        }

                        foreach (Cl3DModel.Cl3DModelPointIterator point in connections)
                        {
                            pt.AddNeighbor(point);
                        }
                    }
                }
            }
        }
        public override void Read(Cl3DModel p_mModel3D, string p_sFilePath)
        {
            try
            {
                using (StreamReader FileStream = File.OpenText(p_sFilePath))
                {
                    string line         = "";
                    int    NoOfVertexes = 0;
                    int    NoOfFaces    = 0;

                    if ((line = FileStream.ReadLine()) == null || !line.Equals("OFF"))
                    {
                        throw new Exception("Incorrect Header");
                    }

                    if ((line = FileStream.ReadLine()) == null)
                    {
                        throw new Exception("Incerrect Header");
                    }

                    string[] splitted = line.Split(' ');
                    NoOfVertexes = Int32.Parse(splitted[0]);
                    NoOfFaces    = Int32.Parse(splitted[1]);

                    for (int i = 0; i < NoOfVertexes; i++)
                    {
                        if ((line = FileStream.ReadLine()) == null)
                        {
                            throw new Exception("Incerrect Header");
                        }

                        splitted = line.Split(' ');
                        float X = float.Parse(splitted[0].Replace('.', ','));
                        float Y = float.Parse(splitted[1].Replace('.', ','));
                        float Z = float.Parse(splitted[2].Replace('.', ','));
                        p_mModel3D.AddPointToModel(X, Y, Z);
                    }
                    for (int i = 0; i < NoOfFaces; i++)
                    {
                        if ((line = FileStream.ReadLine()) == null)
                        {
                            throw new Exception("Incorrect Header");
                        }

                        splitted = line.Split(' ');
                        int noOfVect = int.Parse(splitted[0]);
                        if (noOfVect != 3)
                        {
                            throw new Exception("Wrong number of vertexes in the face");
                        }

                        int vertex1 = int.Parse(splitted[1]);
                        int vertex2 = int.Parse(splitted[2]);
                        int vertex3 = int.Parse(splitted[3]);

                        Cl3DModel.Cl3DModelPointIterator iter  = p_mModel3D.GetIterator();
                        Cl3DModel.Cl3DModelPointIterator iter2 = p_mModel3D.GetIterator();

                        if (!iter.MoveToPoint((uint)vertex1))
                        {
                            throw new Exception("Cannot find the point with ID: " + vertex1.ToString());
                        }
                        if (!iter2.MoveToPoint((uint)vertex2))
                        {
                            throw new Exception("Cannot find the point with ID: " + vertex2.ToString());
                        }

                        iter.AddNeighbor(iter2.CopyIterator());
                        if (!iter2.MoveToPoint((uint)vertex3))
                        {
                            throw new Exception("Cannot find the point with ID: " + vertex3.ToString());
                        }

                        iter.AddNeighbor(iter2.CopyIterator());
                    }
                }
            }
            catch (Exception)
            {
                p_mModel3D.ResetModel();
                throw;
            }
        }
        public override void Read(Cl3DModel p_mModel3D, string p_sFilePath)
        {
            try
            {
                using (StreamReader FileStream = File.OpenText(p_sFilePath))
                {
                    string line = "";
                    while ((line = FileStream.ReadLine()) != null)
                    {
                        if (line.Length == 0 || line.StartsWith("#"))
                        {
                            continue;
                        }

                        char[]   delimiterChars = { ' ', '{', '}', '(', ')' };
                        string[] splited        = line.Split(delimiterChars);
                        //splited.
                        if (splited[0].Equals("Vertex"))
                        {
                            int  no = 1;
                            uint ID = UInt32.Parse(splited[no++], System.Globalization.CultureInfo.InvariantCulture);
                            if (splited[no].Equals(""))
                            {
                                no++;
                            }
                            float x = Single.Parse(splited[no++], System.Globalization.CultureInfo.InvariantCulture);
                            float y = Single.Parse(splited[no++], System.Globalization.CultureInfo.InvariantCulture);
                            float z = Single.Parse(splited[no++], System.Globalization.CultureInfo.InvariantCulture);

                            Cl3DModel.Cl3DModelPointIterator iter = p_mModel3D.AddPointToModel(x, y, z, ID);

                            if (splited.Length > 6)
                            {
                                if (splited[no].Equals(""))
                                {
                                    no++;
                                }

                                if (splited.Length > 6 && splited[no++].Equals("rgb="))
                                {
                                    float r = 1;
                                    float g = 1;
                                    float b = 1;

                                    r = Single.Parse(splited[no++], System.Globalization.CultureInfo.InvariantCulture);
                                    g = Single.Parse(splited[no++], System.Globalization.CultureInfo.InvariantCulture);
                                    b = Single.Parse(splited[no++], System.Globalization.CultureInfo.InvariantCulture);

                                    iter.Color = Color.FromArgb((int)(r * 255), (int)(g * 255), (int)(b * 255));
                                    iter.AddSpecificValue("Texture", iter.Color.ToArgb());
                                    no++;
                                }
                                if (splited.Length > 11 && splited[no++].Equals("uv="))
                                {
                                    float U = Single.Parse(splited[no++], System.Globalization.CultureInfo.InvariantCulture);
                                    float V = Single.Parse(splited[no++], System.Globalization.CultureInfo.InvariantCulture);

                                    iter.U = U;
                                    iter.V = V;
                                }
                            }
                        }
                        else if (splited[0].Equals("Face"))
                        {
                            int no = 2;
                            if (splited[no].Equals(""))
                            {
                                no++;
                            }

                            uint ID1 = UInt32.Parse(splited[no++], System.Globalization.CultureInfo.InvariantCulture);
                            uint ID2 = UInt32.Parse(splited[no++], System.Globalization.CultureInfo.InvariantCulture);
                            uint ID3 = UInt32.Parse(splited[no++], System.Globalization.CultureInfo.InvariantCulture);

                            Cl3DModel.Cl3DModelPointIterator iter1 = p_mModel3D.GetIterator();
                            Cl3DModel.Cl3DModelPointIterator iter2 = p_mModel3D.GetIterator();
                            Cl3DModel.Cl3DModelPointIterator iter3 = p_mModel3D.GetIterator();

                            if (!iter1.MoveToPoint(ID1))
                            {
                                throw new Exception("Cannot find point with ID: " + ID1.ToString());
                            }

                            if (!iter2.MoveToPoint(ID2))
                            {
                                throw new Exception("Cannot find point with ID: " + ID2.ToString());
                            }

                            if (!iter3.MoveToPoint(ID3))
                            {
                                throw new Exception("Cannot find point with ID: " + ID3.ToString());
                            }

                            iter1.AddNeighbor(iter2);
                            iter2.AddNeighbor(iter3);
                            iter3.AddNeighbor(iter1);
                        }
                        else
                        {
                            throw new Exception("Unknown tocken: " + splited[0]);
                        }
                    }
                    FileStream.Close();
                }
            }
            catch (Exception e)
            {
                p_mModel3D.ResetModel();
                Exception ex = new Exception("Wrong M File Format: " + p_mModel3D.ModelFilePath, e);
                throw ex;
            }
        }
        public override void Read(Cl3DModel p_mModel3D, string p_sFilePath)
        {
            try
            {
                using (StreamReader FileStream = File.OpenText(p_sFilePath))
                {
                    string line = "";

                    while ((line = FileStream.ReadLine()) != null)
                    {
                        if (line.Length == 0)
                        {
                            continue;
                        }

                        if (line[0] == '#')
                        {
                            continue;
                        }

                        string[] splitted = line.Split(' ');
                        if (splitted[0].Equals("v"))
                        {
                            float X = float.Parse(splitted[1].Replace('.', ','));
                            float Y = float.Parse(splitted[2].Replace('.', ','));
                            float Z = float.Parse(splitted[3].Replace('.', ','));
                            p_mModel3D.AddPointToModel(X, Y, Z);
                        }
                        else if (splitted[0].Equals("f"))
                        {
                            if (splitted.Length != 4)
                            {
                                throw new Exception("Wrong number of vertexes in the face");
                            }

                            int vertex1 = int.Parse(splitted[1]);
                            int vertex2 = int.Parse(splitted[2]);
                            int vertex3 = int.Parse(splitted[3]);

                            Cl3DModel.Cl3DModelPointIterator iter  = p_mModel3D.GetIterator();
                            Cl3DModel.Cl3DModelPointIterator iter2 = p_mModel3D.GetIterator();

                            if (!iter.MoveToPoint((uint)--vertex1))
                            {
                                throw new Exception("Cannot find the point with ID: " + vertex1.ToString());
                            }
                            if (!iter2.MoveToPoint((uint)--vertex2))
                            {
                                throw new Exception("Cannot find the point with ID: " + vertex2.ToString());
                            }

                            iter.AddNeighbor(iter2.CopyIterator());

                            if (!iter2.MoveToPoint((uint)--vertex3))
                            {
                                throw new Exception("Cannot find the point with ID: " + vertex3.ToString());
                            }

                            iter.AddNeighbor(iter2.CopyIterator());
                        }
                    }
                }
            }
            catch (Exception)
            {
                p_mModel3D.ResetModel();
                throw;
            }
        }