I need some advice to improve my Triangle
class. I know some of my code is sloppy, such as in the Triangle
constructor. can someone give me advice on how to improve it?
#pragma once
#include "Shape.h"
#include <algorithm>
class Triangle :public Shape
{
std::vector<Point> _vertices;
float _a, _b, _c, _s;
public:
Triangle(){}
Triangle(const std::vector<Point> vertices) : _vertices(vertices)
{
_a = sqrt((vertices.at(2).getX() - vertices.at(0).getX()) * (vertices.at(2).getX() - vertices.at(0).getX())) + (vertices.at(2).getY() - vertices.at(0).getY()) * (vertices.at(2).getY() - vertices.at(0).getY());
_b = sqrt((vertices.at(2).getX() - vertices.at(1).getX()) * (vertices.at(2).getX() - vertices.at(1).getX())) + (vertices.at(2).getY() - vertices.at(1).getY()) * (vertices.at(2).getY() - vertices.at(1).getY());
_c = sqrt((vertices.at(1).getX() - vertices.at(0).getX()) * (vertices.at(1).getX() - vertices.at(0).getX())) + (vertices.at(1).getY() - vertices.at(0).getY()) * (vertices.at(1).getY() - vertices.at(0).getY());
_s = (_a + _b + _c) / 2;
}
//Triangle(float a, float b, float c, float s, const std::vector<Point> vertices) :_a(a), _b(b), _c(c), _s(s), _vertices(vertices)
//{
// _a = sqrt((vertices.at(2).getX() - vertices.at(0).getX()) * (vertices.at(2).getX() - vertices.at(0).getX())) + (vertices.at(2).getY() - vertices.at(0).getY()) * (vertices.at(2).getY() - vertices.at(0).getY());
// _b = sqrt((vertices.at(2).getX() - vertices.at(1).getX()) * (vertices.at(2).getX() - vertices.at(1).getX())) + (vertices.at(2).getY() - vertices.at(1).getY()) * (vertices.at(2).getY() - vertices.at(1).getY());
// _c = sqrt((vertices.at(1).getX() - vertices.at(0).getX()) * (vertices.at(1).getX() - vertices.at(0).getX())) + (vertices.at(1).getY() - vertices.at(0).getY()) * (vertices.at(1).getY() - vertices.at(0).getY());
// _s = (_a + _b + _c) / 2;
//}
void setA(std::vector<Point> vertices)
{
_a = sqrt((vertices.at(2).getX() - vertices.at(0).getX()) * (vertices.at(2).getX() - vertices.at(0).getX())) + (vertices.at(2).getY() - vertices.at(0).getY()) * (vertices.at(2).getY() - vertices.at(0).getY());
}
void setB(std::vector<Point> vertices)
{
_b = sqrt((vertices.at(2).getX() - vertices.at(1).getX()) * (vertices.at(2).getX() - vertices.at(1).getX())) + (vertices.at(2).getY() - vertices.at(1).getY()) * (vertices.at(2).getY() - vertices.at(1).getY());
}
void setC(std::vector<Point> vertices)
{
_c = sqrt((vertices.at(1).getX() - vertices.at(0).getX()) * (vertices.at(1).getX() - vertices.at(0).getX())) + (vertices.at(1).getY() - vertices.at(0).getY()) * (vertices.at(1).getY() - vertices.at(0).getY());
}
void setS(float _a, float _b, float _c)
{
_s = (_a + _b + _c) / 2;
}
float getA() const
{
return _a;
}
float getB() const
{
return _b;
}
float getC() const
{
return _c;
}
float getS() const
{
return _s;
}
~Triangle(){}
float Area() const override;
float Circumference() const override;
std::vector<Point> BoundingBox() const override;
void Display() override;
};
#include "Triangle.h"
#include <iostream>
float Triangle::Area() const
{
return ((_vertices.at(0).getX() * (_vertices.at(1).getY() - _vertices.at(2).getY())) + (_vertices.at(1).getX() * (_vertices.at(2).getY() - _vertices.at(0).getY())) + (_vertices.at(2).getX() * (_vertices.at(0).getY() - _vertices.at(1).getY()))) / 2.0f;
}
float Triangle::Circumference() const
{
return _a + _b + _c;
}
std::vector<Point> Triangle::BoundingBox() const
{
float _largeX, _largeY, _smallX, _smallY;
_largeX = std::max(std::max(_vertices.at(0).getX(), _vertices.at(1).getX()), _vertices.at(2).getX());
//calculate largest Y
_largeY = std::max(std::max(_vertices.at(0).getY(), _vertices.at(1).getY()), _vertices.at(2).getY());
//calculate smallest x
_smallX = std::min(std::min(_vertices.at(0).getX(), _vertices.at(1).getX()), _vertices.at(2).getX());
//calculate smallest y
_smallY = std::min(std::min(_vertices.at(0).getY(), _vertices.at(1).getY()), _vertices.at(2).getY());
std::vector<Point> boundingArea;
boundingArea.push_back(Point(_smallX, _largeY));
boundingArea.push_back(Point(_largeX, _largeY));
boundingArea.push_back(Point(_smallX, _smallY));
boundingArea.push_back(Point(_largeX, _smallY));
return boundingArea;
}
void Triangle::Display()
{
std::cout << std::endl;
std::cout << "Triangle: " << std::endl;
std::cout << std::endl;
std::cout << "Vertices: ";
for (auto it : _vertices)
std::cout << "[" << it << "] ";
std::cout << std::endl;
std::cout << "Area: " << Area() << std::endl;
std::cout << "Perimeter: " << Circumference() << std::endl;
std::cout << "Bounding Coordinates: ";
for (auto it : BoundingBox())
std::cout << "[" << it << "] ";
std::cout << std::endl;
}