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); }