-
Notifications
You must be signed in to change notification settings - Fork 0
/
Stage.cs
118 lines (97 loc) · 4.55 KB
/
Stage.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
using ConsoleStage.MathModel;
using ConsoleStage.Tools;
using System;
using System.Threading.Tasks;
using System.Numerics;
namespace ConsoleStage
{
internal class Stage
{
static void Main(string[] args)
{
//DrawDoughnut();
DrawCube();
}
static void DrawCube()
{
Cube cubeMathModel = new Cube(15);
Canvas canvas = new Canvas(50, 28, 50, 5);
Light light = new Light(1, 0, 1);//平行光的朝向
Shader shader = new Shader();
float xAxisRotationRadians = 0;
float yAxisRotationRadians = 0;
float zAxisRotationRadians = 0;
Console.CursorVisible = false;
int stepLength = 50;
while (true)
{
canvas.CleanCanvas();
Parallel.For(0, stepLength, xUnit =>
{
Parallel.For(0, stepLength, yUnit =>
{
Parallel.For(0, 6, side =>
{
EDirection eside = (EDirection)side;
Quaternion quaternion = Quaternion.CreateFromYawPitchRoll(yAxisRotationRadians, xAxisRotationRadians, zAxisRotationRadians); /*Matrix3D.RotationAroundXAxis(Angle.FromRadians(xAxisRotationRadians))*/;
Vector3 surfacePoint = cubeMathModel.GetSquarePoint(((float)xUnit) / stepLength, ((float)yUnit) / stepLength, eside, out Vector3 normal);
Vector3 rotatedSurfacePoint = Vector3.Transform(surfacePoint, quaternion);
Vector3 rotatedNormal = Vector3.Transform(normal, quaternion);
Vector3 screenPoint = canvas.CalculateScreenPoint(rotatedSurfacePoint);
if (canvas.CheckPointInFonrt(screenPoint))
{
if (shader.CalculateLight(rotatedNormal, light, out char pixelChar))
{
canvas.UpdatePixel(screenPoint, pixelChar);
}
}
});
});
});
canvas.Draw();
xAxisRotationRadians += 0.003f;
yAxisRotationRadians += 0.001f;
zAxisRotationRadians += 0.002f;
}
}
static void DrawDoughnut()
{
Doughnut doughnutMathModel = new Doughnut(10, 5);
Canvas canvas = new Canvas(50, 28, 50, 5);
//面向屏幕,xyz的正半轴分别是:左、下、垂直屏幕向内
Light light = new Light(1, 1, 0);//平行光的朝向
Shader shader = new Shader();
float zAxisRotationRadians = 0;
float xAxisRotationRadians = 0;
Console.CursorVisible = false;
while (true)
{
canvas.CleanCanvas();
int stepLength = 4;
Parallel.For(0, 360 / stepLength, circleEachAngle =>
{
Parallel.For(0, 360, yAxisEachAngle =>
{
Quaternion yAxisRotationQ = Quaternion.CreateFromAxisAngle(Vector3.UnitY, yAxisEachAngle);
Quaternion xAxisRotationQ = Quaternion.CreateFromAxisAngle(Vector3.UnitX, xAxisRotationRadians);
Quaternion zAxisRotationQ = Quaternion.CreateFromAxisAngle(Vector3.UnitZ, zAxisRotationRadians);
Vector3 samplePoint = doughnutMathModel.GetPointRotatingAroundAxis(yAxisRotationQ, MathExtendsion.ToRadians(circleEachAngle * stepLength), out var normal);
Vector3 rotatedSamPoint = Vector3.Transform(samplePoint, xAxisRotationQ * zAxisRotationQ);
Vector3 rotatedNormal = Vector3.Transform(normal, xAxisRotationQ * zAxisRotationQ);
Vector3 screenPoint = canvas.CalculateScreenPoint(rotatedSamPoint);
if (canvas.CheckPointInFonrt(screenPoint))
{
if (shader.CalculateLight(rotatedNormal, light, out char pixelChar))
{
canvas.UpdatePixel(screenPoint, pixelChar);
}
}
});
});
canvas.Draw();
xAxisRotationRadians += 0.002f;
zAxisRotationRadians += 0.005f;
}
}
}
}