/// <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);
        }
Exemplo n.º 2
0
        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;
        }