public BestImageParams GetBestImageParams(int ctr)
        {
            //Get the scalar angles between this vertex normal and the direction vectors
            var anglesAndImageIndices = _imageIndexAndDirections.Select(direction =>
                                                                        new ImageIndexAndAngle {
                Index = direction.Index, Angle = GetPositiveAngleOnXzPlane(_meshNormals[ctr], direction.Direction)
            }).ToList();

            var texCoodInAllowedRange = false;
            var selection             = new BestImageParams();

            while (!texCoodInAllowedRange)
            {
                //get the min angle
                var minAngle = (from angle in anglesAndImageIndices select angle.Angle).Min();

                //get the indices which have this angle
                var indicesOfImagesToUse = (from t in anglesAndImageIndices where t.Angle == minAngle select t.Index).ToArray();

                var p = _meshPositions[ctr];

                if (indicesOfImagesToUse.Count() == 1)
                {
                    selection.IndexOfImageToUse = indicesOfImagesToUse[0];
                    var transformedPt = _transformers[selection.IndexOfImageToUse].GetTransformedPoint(p);
                    var zDistance     = _imageIndexAndDirections.First(x => x.Index == selection.IndexOfImageToUse).Direction.Length - transformedPt.Z;
                    selection.TexCood = TexCoodCalculator.GetTexCood(_cameraRatio, transformedPt, zDistance);
                }
                else
                {
                    //angle is the same for a list of images
                    //choose the image to which this point is the closest
                    var zDistances = indicesOfImagesToUse.ToDictionary(index => index, index => GetZDistanceForImageIndex(_imageIndexAndDirections, _transformers, p, index));

                    var minIndex = GetIndexWithMinDistance(zDistances);
                    selection.IndexOfImageToUse = minIndex;
                    var transformedPt = _transformers[minIndex].GetTransformedPoint(p);
                    var zDistance     = zDistances[minIndex];
                    selection.TexCood = TexCoodCalculator.GetTexCood(_cameraRatio, transformedPt, zDistance);
                }
                texCoodInAllowedRange = true;
                var selectedIndex = selection.IndexOfImageToUse;

                if (anglesAndImageIndices.Count <= 1 || _imageParameters[selectedIndex].AllowedXLimits == null ||
                    _imageParameters[selectedIndex].AllowedXLimits.Min < 0 || _imageParameters[selectedIndex].AllowedXLimits.Max <= 0)
                {
                    break;
                }

                //if not in allowed range
                if (selection.TexCood.X < _imageParameters[selectedIndex].AllowedXLimits.Min || selection.TexCood.X > _imageParameters[selectedIndex].AllowedXLimits.Max)
                {
                    //remove this image from the list and try again
                    texCoodInAllowedRange = false;
                    anglesAndImageIndices.Remove(anglesAndImageIndices.First(x => x.Index == selection.IndexOfImageToUse));
                }
            }
            return(selection);
        }
        public BestImageParams GetBestImageParams(int ptIndex)
        {
            var meshPosition = _meshPositions[ptIndex];
            //var sphericalPos = SphericalCoordinateSystem.GetSphericalFromCartesian(meshPosition);
            //var angleInDegrees = 180*sphericalPos.Φ/Math.PI;

            var selection = new BestImageParams();

            //if((0 <= angleInDegrees && angleInDegrees <= 90 ) || (270 <= angleInDegrees && angleInDegrees <= 360))
            //{
            //    selection.IndexOfImageToUse = 0;
            //}
            //else
            //{
            //    selection.IndexOfImageToUse = 1;
            //}
            //selection.TransformedPt = _transformers[selection.IndexOfImageToUse].GetTransformedPoint(meshPosition);
            //selection.ZDistance = _directions[selection.IndexOfImageToUse].Length - selection.TransformedPt.Z;
            return(selection);
        }