Esempio n. 1
0
        private void DrawThreePlanes(Canvas3D Canvas, I3DShader Shader, float x, float y, float z)
        {
            Canvas.Polygon(new Vector4[]
            {
                new Vector4(-500, 500, z, 1),
                new Vector4(500, 500, z, 1),
                new Vector4(500, -500, z, 1),
                new Vector4(-500, -500, z, 1)
            }, Shader, true);

            Canvas.Polygon(new Vector4[]
            {
                new Vector4(x, 500, 1000, 1),
                new Vector4(x, 500, 2000, 1),
                new Vector4(x, -500, 2000, 1),
                new Vector4(x, -500, 1000, 1)
            }, Shader, true);

            Canvas.Polygon(new Vector4[]
            {
                new Vector4(-500, y, 2000, 1),
                new Vector4(500, y, 2000, 1),
                new Vector4(500, y, 1000, 1),
                new Vector4(-500, y, 1000, 1)
            }, Shader, true);
        }
Esempio n. 2
0
        /// <summary>
        /// Draws the graph on a canvas.
        /// </summary>
        /// <param name="Canvas">Canvas to draw on.</param>
        /// <param name="Points">Points to draw.</param>
        /// <param name="Normals">Optional normals.</param>
        /// <param name="Parameters">Graph-specific parameters.</param>
        /// <param name="PrevPoints">Points of previous graph of same type (if available), null (if not available).</param>
        /// <param name="PrevNormals">Optional normals of previous graph of same type (if available), null (if not available).</param>
        /// <param name="PrevParameters">Parameters of previous graph of same type (if available), null (if not available).</param>
        /// <param name="DrawingVolume">Current drawing volume.</param>
        public void DrawGraph(Graphs3D.Canvas3D Canvas, Vector4[,] Points, Vector4[,] Normals,
                              object[] Parameters, Vector4[,] PrevPoints, Vector4[,] PrevNormals,
                              object[] PrevParameters, DrawingVolume DrawingVolume)
        {
            int       i, c = Points.GetLength(0);
            int       j, d = Points.GetLength(1);
            I3DShader Shader   = Graph3D.ToShader(Parameters[0]);
            bool      TwoSided = Expression.ToDouble(Parameters[1]) != 0;

            Vector4[] Nodes = new Vector4[4];

            c--;
            d--;

            for (i = 0; i < c; i++)
            {
                for (j = 0; j < d; j++)
                {
                    Nodes[0] = Points[i, j];
                    Nodes[1] = Points[i + 1, j];
                    Nodes[2] = Points[i + 1, j + 1];
                    Nodes[3] = Points[i, j + 1];

                    Canvas.Polygon(Nodes, Shader, TwoSided);
                }
            }
        }
Esempio n. 3
0
        public void Canvas3D_Test_10_PhongShading_Oversampling_3()
        {
            I3DShader Shader = this.GetPhongShader(SKColors.Red);
            Canvas3D  Canvas = new Canvas3D(1200, 800, 3, SKColors.White);

            Canvas.Perspective(200, 2000);
            this.DrawThreePlanes(Canvas, Shader);
            this.Save(Canvas, "10.png");
        }
Esempio n. 4
0
        public void Canvas3D_Test_14_Ellipsoid()
        {
            Canvas3D Canvas = new Canvas3D(1200, 800, 1, SKColors.White);

            Canvas.Perspective(200, 2000);
            //Canvas.LookAt(-200, 500, 0, 0, 0, 1500, 0, 1, 0);
            Canvas.RotateX(30, new Vector3(0, 0, 1500));
            Canvas.RotateY(45, new Vector3(0, 0, 1500));
            Canvas.RotateZ(60, new Vector3(0, 0, 1500));

            I3DShader Shader = this.GetPhongShader(SKColors.Orange);

            Canvas.Ellipsoid(0, 0, 1500, 400, 400, 400, 1000, Shader);

            Shader = this.GetPhongShader(new SKColor(0, 0, 255, 64));
            this.DrawThreePlanes(Canvas, Shader, 0, 0, 1500);

            this.Save(Canvas, "14.png");
        }
Esempio n. 5
0
        public void Canvas3D_Test_13_Rotate_Z()
        {
            I3DShader Shader = this.GetPhongShader(SKColors.Red);
            Canvas3D  Canvas = new Canvas3D(1200, 800, 1, SKColors.White);

            Canvas.Perspective(200, 2000);

            this.DrawThreePlanes(Canvas, Shader);

            Shader = this.GetPhongShader(SKColors.Blue);
            Matrix4x4 Bak = Canvas.Translate(-250, 250, 0);

            Canvas.Scale(0.25f, new Vector3(0, 0, 1500));
            Canvas.RotateZ(30, new Vector3(0, 0, 1500));
            Canvas.Box(-500, -500, 1000, 500, 500, 2000, Shader);

            Canvas.ModelTransformation = Bak;
            Canvas.Translate(250, 250, 0);
            Canvas.Scale(0.25f, new Vector3(0, 0, 1500));
            Canvas.RotateZ(120, new Vector3(0, 0, 1500));
            Canvas.Box(-500, -500, 1000, 500, 500, 2000, Shader);

            Canvas.ModelTransformation = Bak;
            Canvas.Translate(-250, -250, 0);
            Canvas.Scale(0.25f, new Vector3(0, 0, 1500));
            Canvas.RotateZ(210, new Vector3(0, 0, 1500));
            Canvas.Box(-500, -500, 1000, 500, 500, 2000, Shader);

            Canvas.ModelTransformation = Bak;
            Canvas.Translate(250, -250, 0);
            Canvas.Scale(0.25f, new Vector3(0, 0, 1500));
            Canvas.RotateZ(500, new Vector3(0, 0, 1500));
            Canvas.Box(-500, -500, 1000, 500, 500, 2000, Shader);

            this.Save(Canvas, "13.png");
        }
Esempio n. 6
0
        /// <summary>
        /// Draws the graph on a canvas.
        /// </summary>
        /// <param name="Canvas">Canvas to draw on.</param>
        /// <param name="Points">Points to draw.</param>
        /// <param name="Normals">Optional normals.</param>
        /// <param name="Parameters">Graph-specific parameters.</param>
        /// <param name="PrevPoints">Points of previous graph of same type (if available), null (if not available).</param>
        /// <param name="PrevNormals">Optional normals of previous graph of same type (if available), null (if not available).</param>
        /// <param name="PrevParameters">Parameters of previous graph of same type (if available), null (if not available).</param>
        /// <param name="DrawingVolume">Current drawing volume.</param>
        public void DrawGraph(Graphs3D.Canvas3D Canvas, Vector4[,] Points, Vector4[,] Normals,
                              object[] Parameters, Vector4[,] PrevPoints, Vector4[,] PrevNormals,
                              object[] PrevParameters, DrawingVolume DrawingVolume)
        {
            int       i, c = Points.GetLength(0);
            int       j, d = Points.GetLength(1);
            I3DShader Shader = Graph3D.ToShader(Parameters[0]);
            Vector3   P1, P2;
            float     dx, dz;
            int       i0, j0;

            double[] v      = DrawingVolume.ScaleY(new DoubleVector(0));
            float    OrigoY = (float)v[0];

            for (i = 0; i < c; i++)
            {
                i0 = i == 0 ? i : i - 1;

                for (j = 0; j < d; j++)
                {
                    j0 = j == 0 ? j : j - 1;

                    P1 = Graphs3D.Canvas3D.ToVector3(Points[i0, j0]);
                    P2 = Graphs3D.Canvas3D.ToVector3(Points[i0 + 1, j0 + 1]);

                    dx = P2.X - P1.X;
                    dz = P2.Z - P1.Z;

                    P1  = Graphs3D.Canvas3D.ToVector3(Points[i, j]);
                    dx /= 2;
                    dz /= 2;

                    Canvas.Box(P1.X - dx, OrigoY, P1.Z - dz, P1.X + dx, P1.Y, P1.Z + dz, Shader);
                }
            }
        }
Esempio n. 7
0
        /// <summary>
        /// Draws the graph on a canvas.
        /// </summary>
        /// <param name="Canvas">Canvas to draw on.</param>
        /// <param name="Points">Points to draw.</param>
        /// <param name="Normals">Optional normals.</param>
        /// <param name="Parameters">Graph-specific parameters.</param>
        /// <param name="PrevPoints">Points of previous graph of same type (if available), null (if not available).</param>
        /// <param name="PrevNormals">Optional normals of previous graph of same type (if available), null (if not available).</param>
        /// <param name="PrevParameters">Parameters of previous graph of same type (if available), null (if not available).</param>
        /// <param name="DrawingVolume">Current drawing volume.</param>
        public void DrawGraph(Graphs3D.Canvas3D Canvas, Vector4[,] Points, Vector4[,] Normals,
                              object[] Parameters, Vector4[,] PrevPoints, Vector4[,] PrevNormals,
                              object[] PrevParameters, DrawingVolume DrawingVolume)
        {
            int       i, c = Points.GetLength(0);
            int       j, d = Points.GetLength(1);
            I3DShader Shader   = Graph3D.ToShader(Parameters[0]);
            bool      TwoSided = Expression.ToDouble(Parameters[1]) != 0;

            Vector4[] Nodes       = new Vector4[4];
            Vector4[] NodeNormals = new Vector4[4];

            c--;
            d--;

            if (Normals is null)
            {
                Vector4[,] N = new Vector4[c + 1, d + 1];
                Vector4 P1, P2, P3;
                int     n;

                for (i = 0; i < c; i++)
                {
                    for (j = 0; j < d; j++)
                    {
                        P1 = Points[i, j];
                        P2 = Points[i + 1, j];
                        if (P1 == P2)
                        {
                            P2 = Points[i + 1, j + 1];
                        }
                        P3 = Points[i, j + 1];
                        if (P1 == P3)
                        {
                            P3 = Points[i + 1, j + 1];
                        }

                        N[i, j] = Graphs3D.Canvas3D.CalcNormal(P1, P2, P3);
                    }

                    if (Vector4.Distance(Points[i, d], Points[i, 0]) < 1e-10f)
                    {
                        N[i, d] = N[i, 0];
                    }
                    else
                    {
                        N[i, d] = N[i, d - 1];
                    }
                }

                for (j = 0; j <= d; j++)
                {
                    if (Vector4.Distance(Points[c, j], Points[0, j]) < 1e-10f)
                    {
                        N[c, j] = N[0, j];
                    }
                    else
                    {
                        N[c, j] = N[c - 1, j];
                    }
                }

                Normals = new Vector4[c + 1, d + 1];

                for (i = 0; i <= c; i++)
                {
                    for (j = 0; j <= d; j++)
                    {
                        P1 = N[i, j];
                        n  = 1;

                        if (i > 0)
                        {
                            P1 += N[i - 1, j];
                            n++;

                            if (j > 0)
                            {
                                P1 += N[i - 1, j - 1];
                                n++;
                            }
                        }

                        if (j > 0)
                        {
                            P1 += N[i, j - 1];
                            n++;
                        }

                        Normals[i, j] = P1 / n;
                    }
                }
            }

            for (i = 0; i < c; i++)
            {
                for (j = 0; j < d; j++)
                {
                    Nodes[0] = Points[i, j];
                    Nodes[1] = Points[i + 1, j];
                    Nodes[2] = Points[i + 1, j + 1];
                    Nodes[3] = Points[i, j + 1];

                    NodeNormals[0] = Normals[i, j];
                    NodeNormals[1] = Normals[i + 1, j];
                    NodeNormals[2] = Normals[i + 1, j + 1];
                    NodeNormals[3] = Normals[i, j + 1];

                    Canvas.Polygon(Nodes, NodeNormals, Shader, TwoSided);
                }
            }
        }
Esempio n. 8
0
 private void DrawThreePlanes(Canvas3D Canvas, I3DShader Shader)
 {
     this.DrawThreePlanes(Canvas, Shader, -500, -500, 2000);
 }