#include "Rasteriser.h" #include using namespace std; Rasteriser app; bool Rasteriser::Initialise() { //_initialVertexArray.push_back(Vertex(175, 175, 0, 1)); //_initialVertexArray.push_back(Vertex(225, 175, 0, 1)); //_initialVertexArray.push_back(Vertex(225, 225, 0, 1)); //_initialVertexArray.push_back(Vertex(175, 225, 0, 1)); _initialVertexArray.push_back(Vertex(150, 200, 1)); _initialVertexArray.push_back(Vertex(187.5f, 187.5f, 1)); _initialVertexArray.push_back(Vertex(200, 150, 1)); _initialVertexArray.push_back(Vertex(212.5f, 187.5f, 1)); _initialVertexArray.push_back(Vertex(250, 200, 1)); _initialVertexArray.push_back(Vertex(212.5f, 212.5f, 1)); _initialVertexArray.push_back(Vertex(200, 250, 1)); _initialVertexArray.push_back(Vertex(187.5, 212.5f, 1)); _currentVertexArray = _initialVertexArray; return true; } void Rasteriser::Update(const Bitmap& bitmap) { int currentRot = (_rotation % 360); for (int i = 0; i < _initialVertexArray.size(); i++) { Matrix currentTransfomation = GetRotationMatrixFromPoint(Axis::Z, (float) currentRot, _initialVertexArray[0].GetX(), _initialVertexArray[0].GetY(), 0); _currentVertexArray[i] = currentTransfomation * _initialVertexArray[i]; } _rotation += 1; } void Rasteriser::Render(const Bitmap& bitmap) { ClearViewport(bitmap); SelectObject(bitmap.GetDC(), GetStockObject(DC_BRUSH)); //DrawSquare(bitmap.GetDC(), _initialVertexArray); DrawShape(bitmap.GetDC(), _currentVertexArray); } void Rasteriser::ClearViewport(const Bitmap& bitmap) { bitmap.Clear(RGB(255, 255, 255)); } Matrix Rasteriser::GetTranslateMatrix(const float x, const float y, const float z) { return Matrix({ 1, 0, 0, x, 0, 1, 0, y, 0, 0, 1, z, 0, 0, 0, 1 }); } Matrix Rasteriser::GetScaleMatrix(const float x, const float y, const float z) { return Matrix({ x, 0, 0, 0, 0, y, 0, 0, 0, 0, z, 0, 0, 0, 0, 1 }); } Matrix Rasteriser::GetRotationMatrix(const Axis rotAxis, const float rotDegrees) { float rotationRadian = DegreesToRadians(rotDegrees); switch (rotAxis) { case (Axis::X): return Matrix({ 1, 0, 0, 0, 0, cos(rotationRadian), -sin(rotationRadian), 0, 0, sin(rotationRadian), cos(rotationRadian), 0, 0, 0, 0, 1 }); case (Axis::Y): return Matrix({ cos(rotationRadian), 0, sin(rotationRadian), 0, 0, 1, 0, 0, -sin(rotationRadian), 0, cos(rotationRadian), 0, 0, 0, 0, 1 }); default: case (Axis::Z): return Matrix({ cos(rotationRadian), -sin(rotationRadian), 0, 0, sin(rotationRadian), cos(rotationRadian), 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 }); } } Matrix Rasteriser::GetRotationMatrixFromPoint(const Axis rotAxis, const float rotDegrees, const float x, const float y, const float z) { return GetTranslateMatrix(x, y, z) * GetRotationMatrix(rotAxis, rotDegrees) * GetTranslateMatrix(-x, -y, -z); } float Rasteriser::DegreesToRadians(const float degrees) { return (degrees * _PI) / 180; } void Rasteriser::DrawSquare(HDC hDc, const vector verticies) { POINT pointArray[4]; for (int i = 0; i < 4; i++) { pointArray[i].x = (long) verticies[i].GetX(); pointArray[i].y = (long) verticies[i].GetY(); } SetDCBrushColor(hDc, RGB(255, 0, 255)); SetDCPenColor(hDc, RGB(0, 0, 255)); Polygon(hDc, pointArray, 4); } void Rasteriser::DrawShape(HDC hDc, const vector verticies) { vector pointArray; for (int i = 0; i < verticies.size(); i++) { POINT newPoint; newPoint.x = (long)verticies[i].GetX(); newPoint.y = (long)verticies[i].GetY(); pointArray.push_back(newPoint); } SetDCBrushColor(hDc, RGB(rand() % 256, rand() % 256, rand() % 256)); SetDCPenColor(hDc, RGB(rand() % 256, rand() % 256, rand() % 256)); Polygon(hDc, pointArray.data(), (int) verticies.size()); }