public void FitTextureToPointCloud(Cloud cloud, int tileX, int tileY) { if (Texture.Texture == null) return; if (tileX <= 0) tileX = 1; if (tileY <= 0) tileY = 1; // Scale will change, no need to use it in the calculations var xvals = cloud.GetExtents().Select(x => x.Dot(Texture.UAxis)).ToList(); var yvals = cloud.GetExtents().Select(x => x.Dot(Texture.VAxis)).ToList(); var minU = xvals.Min(); var minV = yvals.Min(); var maxU = xvals.Max(); var maxV = yvals.Max(); Texture.XScale = (maxU - minU) / (Texture.Texture.Width * tileX); Texture.YScale = (maxV - minV) / (Texture.Texture.Height * tileY); Texture.XShift = -minU / Texture.XScale; Texture.YShift = -minV / Texture.YScale; CalculateTextureCoordinates(true); }
public void AlignTextureWithPointCloud(Cloud cloud, BoxAlignMode mode) { if (Texture.Texture == null) return; var xvals = cloud.GetExtents().Select(x => x.Dot(Texture.UAxis) / Texture.XScale).ToList(); var yvals = cloud.GetExtents().Select(x => x.Dot(Texture.VAxis) / Texture.YScale).ToList(); var minU = xvals.Min(); var minV = yvals.Min(); var maxU = xvals.Max(); var maxV = yvals.Max(); switch (mode) { case BoxAlignMode.Left: Texture.XShift = -minU; break; case BoxAlignMode.Right: Texture.XShift = -maxU + Texture.Texture.Width; break; case BoxAlignMode.Center: var avgU = (minU + maxU) / 2; var avgV = (minV + maxV) / 2; Texture.XShift = -avgU + Texture.Texture.Width / 2m; Texture.YShift = -avgV + Texture.Texture.Height / 2m; break; case BoxAlignMode.Top: Texture.YShift = -minV; break; case BoxAlignMode.Bottom: Texture.YShift = -maxV + Texture.Texture.Height; break; } CalculateTextureCoordinates(true); }