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); }
/// <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); } } }
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"); }
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"); }
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"); }
/// <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); } } }
/// <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); } } }
private void DrawThreePlanes(Canvas3D Canvas, I3DShader Shader) { this.DrawThreePlanes(Canvas, Shader, -500, -500, 2000); }