Esempio n. 1
0
        public void AddModelByDepthMap(Bitmap image, Point3D origin, Vector3D xVec, Vector3D yVec, Vector3D zVec, double xSize, double ySize, double zSize,
                                       bool whiteIsBackground = true)
        {
            xVec.Normalize();
            yVec.Normalize();
            zVec.Normalize();

            Func <int, int, Point3D> getPoint = ((x, y) =>
            {
                Color color = image.GetPixel(x, y);
                int depth = (whiteIsBackground ? color.R + color.G + color.B : 765 - (color.R + color.G + color.B));

                if (depth != 765)
                {
                    return(origin + xVec * xSize * x / (image.Width - 1) + yVec * ySize * y / (image.Height - 1) + zVec * zSize * depth / 765);
                }
                else
                {
                    return(null);
                }
            });

            for (int x = 0; x < image.Width - 1; x++)
            {
                for (int y = 0; y < image.Height - 1; y++)
                {
                    Point3D p1 = getPoint(x, y), p2 = getPoint(x + 1, y), p3 = getPoint(x, y + 1), p4 = getPoint(x + 1, y + 1);

                    if (p1 != null && p2 != null && p3 != null)
                    {
                        AddPolygon(new Point3D[] { p1, p2, p3 });
                    }
                    if (p2 != null && p3 != null && p4 != null)
                    {
                        AddPolygon(new Point3D[] { p2, p3, p4 });
                    }
                    if (p2 == null && p1 != null && p3 != null && p4 != null)
                    {
                        AddPolygon(new Point3D[] { p1, p3, p4 });
                    }
                    if (p3 == null && p1 != null && p2 != null && p4 != null)
                    {
                        AddPolygon(new Point3D[] { p1, p2, p4 });
                    }
                }
            }
        }