/// <summary> /// Call each time PC size changes /// </summary> /// <param name="initColor"></param> void InitPointCloud(Color initColor) { var positions = new HelixToolkit.Wpf.SharpDX.Core.Vector3Collection(); var colors = new HelixToolkit.Wpf.SharpDX.Core.Color4Collection(); var indices = new HelixToolkit.Wpf.SharpDX.Core.IntCollection(); for (int y = 0; y < Size.Height; y++) { for (int x = 0; x < Size.Width; x++) { indices.Add(positions.Count); float mp = 0.01f; positions.Add(new Vector3(mp * x, mp * y, 0.0f)); colors.Add(initColor); } } context.Send((o) => { PointCloud.Positions = positions; PointCloud.Colors = colors; PointCloud.Indices = indices; }, null); }
private void CalcBtn_Click(object sender, RoutedEventArgs e) { BoneModel model1 = MainViewModel.ProjData.BoneCollection[1]; BoneModel model2 = MainViewModel.ProjData.BoneCollection[2]; HelixToolkit.Wpf.SharpDX.Core.Vector3Collection model1Position = model1.Geometry.Positions; HelixToolkit.Wpf.SharpDX.Core.Vector3Collection model2Position = model2.Geometry.Positions; double total = 0; double Xtotal = 0; double Ytotal = 0; double Ztotal = 0; double totalfordev = 0; double Xtotalfordev = 0; double Ytotalfordev = 0; double Ztotalfordev = 0; double RMStotal = 0; double max = 0; double XMax = 0; double YMax = 0; double ZMax = 0; if (model1Position.Count != model2Position.Count) { System.Windows.MessageBox.Show("模型不同 有錯"); return; } for (int i = 0; i < model1Position.Count; i++) { double distance = Math.Sqrt(Math.Pow(model1Position[i].X - model2Position[i].X, 2) + Math.Pow(model1Position[i].Y - model2Position[i].Y, 2) + Math.Pow(model1Position[i].Z - model2Position[i].Z, 2)); double Xdistance = Math.Abs(model1Position[i].X - model2Position[i].X); double Ydistance = Math.Abs(model1Position[i].Y - model2Position[i].Y); double Zdistance = Math.Abs(model1Position[i].Z - model2Position[i].Z); //目前距離大於最大的 if (distance > max) { max = distance; } if (Xdistance > XMax) { XMax = Xdistance; } if (Ydistance > YMax) { YMax = Ydistance; } if (Zdistance > ZMax) { ZMax = Zdistance; } total += distance; Xtotal += Xdistance; Ytotal += Ydistance; Ztotal += Zdistance; RMStotal += distance * distance; } double avg = Math.Round(total / model1Position.Count, 3); double xavg = Math.Round(Xtotal / model1Position.Count, 3); double yavg = Math.Round(Ytotal / model1Position.Count, 3); double zavg = Math.Round(Ztotal / model1Position.Count, 3); for (int i = 0; i < model1Position.Count; i++) { double distance = Math.Sqrt(Math.Pow(model1Position[i].X - model2Position[i].X, 2) + Math.Pow(model1Position[i].Y - model2Position[i].Y, 2) + Math.Pow(model1Position[i].Z - model2Position[i].Z, 2)); double Xdistance = Math.Abs(model1Position[i].X - model2Position[i].X); double Ydistance = Math.Abs(model1Position[i].Y - model2Position[i].Y); double Zdistance = Math.Abs(model1Position[i].Z - model2Position[i].Z); totalfordev += (distance - avg) * (distance - avg); Xtotalfordev += (Xdistance - xavg) * (Xdistance - xavg); Ytotalfordev += (Ydistance - yavg) * (Ydistance - yavg); Ztotalfordev += (Zdistance - zavg) * (Zdistance - zavg); } double Dev = Math.Sqrt(totalfordev / model1Position.Count); double XDev = Math.Sqrt(Xtotalfordev / model1Position.Count); double YDev = Math.Sqrt(Ytotalfordev / model1Position.Count); double ZDev = Math.Sqrt(Ztotalfordev / model1Position.Count); double RMS = Math.Sqrt(RMStotal / model1Position.Count); Console.WriteLine("模型一:" + model1.FilePath); Console.WriteLine("模型二:" + model2.FilePath); Console.WriteLine("整體:" + avg + "±" + Math.Round(Dev, 3) + " " + Math.Round(max, 3)); Console.WriteLine("RMS Error:" + Math.Round(RMS, 3)); Console.WriteLine("XYZ Mean:" + xavg + "±" + Math.Round(XDev, 3) + " " + yavg + "±" + Math.Round(YDev, 3) + " " + zavg + "±" + Math.Round(ZDev, 3)); Console.WriteLine("XYZ Max:" + Math.Round(XMax, 3) + " " + Math.Round(YMax, 3) + " " + Math.Round(ZMax, 3) + " "); Console.WriteLine("\n"); }
/// <summary> /// Call on each frame /// </summary> public void UpdatePC() { var lastUpdate = DateTime.Now; a = (lastUpdate - phase).TotalMilliseconds / 5000.0; HelixToolkit.Wpf.SharpDX.Core.Vector3Collection positions; if (fastUpdate) { positions = PointCloud.Positions; } else { positions = new HelixToolkit.Wpf.SharpDX.Core.Vector3Collection(PointCount); } var colors = new HelixToolkit.Wpf.SharpDX.Core.Color4Collection(PointCount); float f = 1915; // px, focal length (fx') float B = 0.25f; // m, baseline B = Tx / (-fx') int w = Size.Width, h = Size.Height; for (int y = 0, i = 0; y < h; y++) { for (int x = 0; x < w; x++, i++) { { int px = x * 3 + y * w * 3; float yy = 0.01f * y, xx = 0.01f * x; var color = Color4Extensions.FromArgb((int)(255 * Math.Sin(yy + a)), (int)(255 * Math.Cos(xx + a)), 0); int pxd = x * 3 + y * w * 3; short disp = (short)(10 * Math.Sin(yy + a) * Math.Cos(xx + a)); //short disp = (short)(100 + 10 * Math.Sin(yy + a) * Math.Cos(xx + a)); float Z = f * B / (disp); //Z = 200; float u = w / 2 - x; float v = h / 2 - y; float X = u * Z / f; float Y = v * Z / f; if (fastUpdate) { positions[i] = (new Vector3(X, Y, Z)); } else { positions.Add(new Vector3(X, Y, Z)); } colors.Add(color); } } } context.Send((o) => { PointCloud.Positions = positions; PointCloud.Colors = colors; int d = 10; this.Camera.Position = new Point3D(Math.Cos(a) * d, 3, Math.Sin(a) * d); this.Camera.LookDirection = new Vector3D(-this.Camera.Position.X, -this.Camera.Position.Y, -this.Camera.Position.Z); }, null); var currentTime = DateTime.Now; var duration = currentTime - lastUpdate; FPS = 1000.0 / duration.TotalMilliseconds; lastUpdate = currentTime; }