Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: RadarDemo 3DDemo RadarDemoT
GeometricPrim.cpp
- Committer:
- karpent
- Date:
- 2016-11-04
- Revision:
- 0:566855d63a2f
File content as of revision 0:566855d63a2f:
//
// GeometricPrim.cpp - Geometric primitives class
//
#include "stdlib.h" // for abs
#include "math.h" // for floor
#include "GeometricPrim.h"
GeometricPrim::GeometricPrim()
{
}
GeometricPrim::~GeometricPrim()
{
}
void GeometricPrim::DrawLine(int startX, int startY, int endX, int endY)
{
int diffX = (endX - startX);
int diffY = (endY - startY);
uint32_t _colorMask = GetDrawColor();
if (abs(diffX) > abs(diffY)) {
float dy = diffY / (float)diffX;
if (endX > startX) {
for (int x = startX; x <= endX; x++) {
this->DrawPoint(x, (int)floor(startY + dy*(x - startX)), _colorMask);
}
}
else {
for (int x = startX; x >= endX; x--) {
this->DrawPoint(x, (int)floor(startY + dy*(x - startX)), _colorMask);
}
}
}
else {
float dx = diffX / (float)diffY;
if (endY > startY) {
for (int y = startY; y <= endY; y++) {
this->DrawPoint((int)floor(startX + dx*(y - startY)), y, _colorMask);
}
}
else {
for (int y = startY; y >= endY; y--) {
this->DrawPoint((int)floor(startX + dx*(y - startY)), y, _colorMask);
}
}
}
}
void GeometricPrim::DrawCircle(int posX, int posY, uint16_t radius)
{
int decision; /* Decision Variable */
uint32_t current_x; /* Current X Value */
uint32_t current_y; /* Current Y Value */
decision = 3 - (radius << 1);
current_x = 0;
current_y = radius;
uint32_t _colorMask=GetDrawColor();
while (current_x <= current_y)
{
DrawPoint((posX + current_x), (posY - current_y), _colorMask);
DrawPoint((posX - current_x), (posY - current_y), _colorMask);
DrawPoint((posX + current_y), (posY - current_x), _colorMask);
DrawPoint((posX - current_y), (posY - current_x), _colorMask);
DrawPoint((posX + current_x), (posY + current_y), _colorMask);
DrawPoint((posX - current_x), (posY + current_y), _colorMask);
DrawPoint((posX + current_y), (posY + current_x), _colorMask);
DrawPoint((posX - current_y), (posY + current_x), _colorMask);
if (decision < 0)
{
decision += (current_x << 2) + 6;
}
else
{
decision += ((current_x - current_y) << 2) + 10;
current_y--;
}
current_x++;
}
}
void GeometricPrim::DrawRectangle(int startX, int startY, int endX, int endY)
{
DrawLine(startX, startY, startX, endY);
DrawLine(startX, endY, endX, endY);
DrawLine(endX, endY, endX, startY);
DrawLine(endX, startY, startX, startY);
}
void GeometricPrim::DrawTriangle(int x1, int y1, int x2, int y2, int x3, int y3)
{
DrawLine(x1, y1, x2, y2);
DrawLine(x2, y2, x3, y3);
DrawLine(x3, y3, x1, y1);
}