Matrix2DClient::Matrix2DClient(HINSTANCE instance, std::wstring caption, float clientWidth, float clientHeight)
:D2DApp(instance, caption, clientWidth, clientHeight), mOriginX{ 0 }, mOriginY{ 0 }
{
std::array<std::array<float, 3>, 9> tempCubePoint = {
-70.82, -112.90, -40.75,//0
-0.34 , -170.82, 0.2,//1
0.11, -112.90, 81.71,//2
-70.59, -54.97, 40.75,//3
0.34, 2.38, -0.2,//4
0.11, -55.54, -81.71,//5
70.59, -113.46, -40.75,//6
70.82, -55.54, 40.75, //7
1,1,1
};
cubePoint = tempCubePoint;
//cubes is an array of 250 cubes
for (auto& c : cubes) { c = tempCubePoint; }
}
void Matrix2DClient::Draw()
{
static D2D1_COLOR_F clearColor = D2D1::ColorF(0.34f, 0.39f, 0.4f, 1.0f);
mRenderTarget->Clear(clearColor);
makeGrid(100, 45.f);
static float constRotation;
constRotation += constRotation + 1.7 < 360 ? 1.7 : -constRotation;
float RX[3][3] = { 1 , 0 , 0 ,
0 ,cos(rad(constRotation)) ,sin(rad(constRotation)),
0 ,-sin(rad(constRotation)),cos(rad(constRotation))
};
float RY[3][3] = { cos(rad(constRotation)), 0 ,-sin(rad(constRotation)),
0 , 1 , 0 ,
sin(rad(constRotation)), 0, cos(rad(constRotation))
};
float RZ[3][3] = { cos(rad(0)), sin(rad(0)), 0,
-sin(rad(0)), cos(rad(0)), 0,
0 , 0 , 1
};
for (size_t c = 0; c < cubes.size(); c++)
{
std::array<std::array<float, 3>, 3> finalMatrix = mBasisVectors;
std::array<std::array<float, 3>, 3> intermediateMatrix1 = mBasisVectors;
std::array<std::array<float, 3>, 3> intermediateMatrix2 = mBasisVectors;
//rotate on axis X (basisVectors x RotationX) = intermediateMatrix1
for (size_t i = 0; i < 3; i++)
{
for (size_t j = 0; j < 3; j++)
{
float sum = 0;
for (size_t k = 0; k < 3; k++)
{
sum += mBasisVectors[i][k] * RX[k][j];
}
intermediateMatrix1[i][j] = sum;
}
}
//add scale
static float size = 0.02f;
static int sign = 1;
if (c == 0)
{
float increase = 0.0012f;
if (size + increase*sign > 0.02f || size + increase*sign < 0.01f) { sign *= -1; }
size += increase*sign;
}
intermediateMatrix1[0][0] = intermediateMatrix1[0][0] * size*(((c + 1))/2);
intermediateMatrix1[1][1] = intermediateMatrix1[1][1] * size*(((c + 1))/2);
intermediateMatrix1[2][2] = intermediateMatrix1[2][2] * size*(((c + 1))/2);
//rotate on axis Y (intermediateMatrix1 x RotationY) = intermediateMatrix2
for (size_t i = 0; i < 3; i++)
{
for (size_t j = 0; j < 3; j++)
{
float sum = 0;
for (size_t k = 0; k < 3; k++)
{
sum += intermediateMatrix1[i][k] * RY[k][j];
}
intermediateMatrix2[i][j] = sum;
}
}
//rotate on axis Z (intermediateMatrix2 x RotationZ) = finalMatrix
for (size_t i = 0; i < 3; i++)
{
for (size_t j = 0; j < 3; j++)
{
float sum = 0;
for (size_t k = 0; k < 3; k++)
{
sum += intermediateMatrix2[i][k] * RZ[k][j];
}
finalMatrix[i][j] = sum;
}
}
//for every point, apply the rotation finalMatrix
for (size_t i = 0; i < cubePoint.size(); i++)
{
cubes[c][i][0] = cubePoint[i][0] * finalMatrix[0][0] + cubePoint[i][1] * finalMatrix[0][1] + cubePoint[i][2] * finalMatrix[0][2];//X
cubes[c][i][1] = cubePoint[i][0] * finalMatrix[1][0] + cubePoint[i][1] * finalMatrix[1][1] + cubePoint[i][2] * finalMatrix[1][2];//Y
cubes[c][i][2] = cubePoint[i][0] * finalMatrix[2][0] + cubePoint[i][1] * finalMatrix[2][1] + cubePoint[i][2] * finalMatrix[2][2];//Z
cubes[c][8][0] = abs(size*(c / 2)); //color
cubes[c][8][1] = abs(size*(c / 2)); //color
cubes[c][8][2] = abs(size*(c / 2)); //color
}
}
//draw cube
for (size_t c = 0; c < cubes.size(); c++)
{
mBrush->SetColor(D2D1::ColorF(sin(rad(cubes[c][1][1]*2)), cos(rad(cubes[c][0][0])) , cos(rad(cubes[c][0][0])), 1.f));
float strokeSize = 2.f;
mRenderTarget->DrawLine(D2D1::Point2F(mOriginX + cubes[c][0][0], mOriginY + cubes[c][0][1]), D2D1::Point2F(mOriginX + cubes[c][1][0], mOriginY + cubes[c][1][1]), mBrush, strokeSize);
mRenderTarget->DrawLine(D2D1::Point2F(mOriginX + cubes[c][1][0], mOriginY + cubes[c][1][1]), D2D1::Point2F(mOriginX + cubes[c][6][0], mOriginY + cubes[c][6][1]), mBrush, strokeSize);
mRenderTarget->DrawLine(D2D1::Point2F(mOriginX + cubes[c][6][0], mOriginY + cubes[c][6][1]), D2D1::Point2F(mOriginX + cubes[c][5][0], mOriginY + cubes[c][5][1]), mBrush, strokeSize);
mRenderTarget->DrawLine(D2D1::Point2F(mOriginX + cubes[c][5][0], mOriginY + cubes[c][5][1]), D2D1::Point2F(mOriginX + cubes[c][0][0], mOriginY + cubes[c][0][1]), mBrush, strokeSize);
mRenderTarget->DrawLine(D2D1::Point2F(mOriginX + cubes[c][1][0], mOriginY + cubes[c][1][1]), D2D1::Point2F(mOriginX + cubes[c][2][0], mOriginY + cubes[c][2][1]), mBrush, strokeSize);
mRenderTarget->DrawLine(D2D1::Point2F(mOriginX + cubes[c][6][0], mOriginY + cubes[c][6][1]), D2D1::Point2F(mOriginX + cubes[c][7][0], mOriginY + cubes[c][7][1]), mBrush, strokeSize);
mRenderTarget->DrawLine(D2D1::Point2F(mOriginX + cubes[c][5][0], mOriginY + cubes[c][5][1]), D2D1::Point2F(mOriginX + cubes[c][4][0], mOriginY + cubes[c][4][1]), mBrush, strokeSize);
mRenderTarget->DrawLine(D2D1::Point2F(mOriginX + cubes[c][0][0], mOriginY + cubes[c][0][1]), D2D1::Point2F(mOriginX + cubes[c][3][0], mOriginY + cubes[c][3][1]), mBrush, strokeSize);
mRenderTarget->DrawLine(D2D1::Point2F(mOriginX + cubes[c][3][0], mOriginY + cubes[c][3][1]), D2D1::Point2F(mOriginX + cubes[c][2][0], mOriginY + cubes[c][2][1]), mBrush, strokeSize);
mRenderTarget->DrawLine(D2D1::Point2F(mOriginX + cubes[c][2][0], mOriginY + cubes[c][2][1]), D2D1::Point2F(mOriginX + cubes[c][7][0], mOriginY + cubes[c][7][1]), mBrush, strokeSize);
mRenderTarget->DrawLine(D2D1::Point2F(mOriginX + cubes[c][7][0], mOriginY + cubes[c][7][1]), D2D1::Point2F(mOriginX + cubes[c][4][0], mOriginY + cubes[c][4][1]), mBrush, strokeSize);
mRenderTarget->DrawLine(D2D1::Point2F(mOriginX + cubes[c][4][0], mOriginY + cubes[c][4][1]), D2D1::Point2F(mOriginX + cubes[c][3][0], mOriginY + cubes[c][3][1]), mBrush, strokeSize);
}
}