CanadianMachines / MachineLib / MachineStandin.cpp
MachineStandin.cpp
Raw
/**
 * @file MachineStandin.cpp
 *
 * @author Charles Owen
 *
 * This file may not be changed.
 */

#include "pch.h"
#include "MachineStandin.h"
#include <sstream>

using namespace std;


/**
 * Constructor
 */
MachineStandin::MachineStandin()
{
}


/**
* Draw the machine at the currently specified location
* @param graphics Graphics object to render to
*/
void MachineStandin::DrawMachine(std::shared_ptr<wxGraphicsContext> graphics)
{
    const int LineSize = 18;
    const int LineSpacing = 22;

    wxPen pen(wxColour(139, 69, 19), 1);
	const int StandinWidth = 300;
	const int StandinHeight = 200;

    graphics->SetPen(pen);
    graphics->SetBrush(*wxTRANSPARENT_BRUSH);
	graphics->DrawRectangle((mX - StandinWidth/2), (mY - StandinHeight),
            StandinWidth, StandinHeight);

    graphics->SetPen(*wxBLACK_PEN);
    graphics->StrokeLine(mX - 10, mY - 10, mX + 10, mY + 10);
    graphics->StrokeLine(mX + 10, mY - 10, mX - 10, mY + 10);

    wxFont coordFont(wxSize(0, 10),
            wxFONTFAMILY_SWISS,
            wxFONTSTYLE_NORMAL,
            wxFONTWEIGHT_NORMAL);
    graphics->SetFont(coordFont, *wxBLACK);
    std::wstringstream str;
    str << L"(" << mX << L"," << mY << L")";
    graphics->DrawText(str.str(), mX + 15, mY - 10);

	const int OuterRadius = 90;
	const int InnerRadius = 80;
	const int NumTeeth = 20;

	const int GearX = 0;
	const int GearY = -StandinHeight / 2;

    graphics->SetPen(*wxGREEN_PEN);

	int x = mX + GearX;
	int y = mY + GearY;

	for (int i = 0; i < NumTeeth; i++)
	{
		double angle1 = i * 2 * M_PI / NumTeeth;
		double angle2 = (i + 0.5) * 2 * M_PI / NumTeeth;
		double angle3 = (i + 1.0) * 2 * M_PI / NumTeeth;

		graphics->StrokeLine((x + OuterRadius * cos(angle1)), (y + OuterRadius * sin(angle1)),
			(x + OuterRadius * cos(angle2)), (y + OuterRadius * sin(angle2)));
		graphics->StrokeLine((x + OuterRadius * cos(angle2)), (y + OuterRadius * sin(angle2)),
			(x + InnerRadius * cos(angle2)), (y + InnerRadius * sin(angle2)));
		graphics->StrokeLine((x + InnerRadius * cos(angle2)), (y + InnerRadius * sin(angle2)),
			(x + InnerRadius * cos(angle3)), (y + InnerRadius * sin(angle3)));
		graphics->StrokeLine((x + InnerRadius * cos(angle3)), (y + InnerRadius * sin(angle3)),
			(x + OuterRadius * cos(angle3)), (y + OuterRadius * sin(angle3)));

	}


    y = mY - LineSize * 3.5;
    CenteredString(graphics, L"Machine goes here!", mX, y, LineSize);
    y -= LineSpacing;

    {
        wstringstream str1;
        str1 << L"Machine: " << mMachine << ends;
        CenteredString(graphics, str1.str(), mX, y, LineSize);
        y -= LineSpacing;
    }

    {
        wstringstream str1;
        str1 << L"Frame: " << mFrame << ends;
        CenteredString(graphics, str1.str(), mX, y, LineSize);
        y -= LineSpacing;
    }

}


/**
 * Draw a centered string
 *
 * @param graphics Graphics object
 * @param str String to draw
 * @param x X location of bottom center of string
 * @param y Y location of bottom center of string
 * @param dy String height
 */
void MachineStandin::CenteredString(std::shared_ptr<wxGraphicsContext> graphics, const std::wstring &str, int x, int y, int dy)
{
    y -= dy;

    wxFont font(wxSize(0, dy),
            wxFONTFAMILY_SWISS,
            wxFONTSTYLE_NORMAL,
            wxFONTWEIGHT_NORMAL);
    graphics->SetFont(font, *wxBLACK);

    double width, height;
    graphics->GetTextExtent(str, &width, &height);
    graphics->DrawText(str, x - width/2, y);
}