Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cmath>
- #include <vector>
- #include <exception>
- using namespace std;
- struct Shape {
- virtual double area() = 0;
- virtual double perimeter() = 0;
- virtual string toString() = 0;
- string Type() {
- return type;
- }
- protected:
- string type;
- public:
- struct Point {
- string toString() {
- string result = "{";
- for (int i = 0; i < getDimension(); i ++) {
- result += to_string(coordinates[i]);
- if (i < getDimension() - 1) {
- result += ", ";
- }
- }
- result += "}";
- return result;
- }
- vector<double> coordinates;
- Point(vector<double> input) : coordinates (input) {}
- unsigned int getDimension() {
- return coordinates.size();
- }
- double distance() {
- double sum = 0;
- for (auto x = coordinates.begin(); x != coordinates.end(); x ++) {
- sum += pow(*x, 2);
- }
- return sqrt(sum);
- }
- Point& operator- (Point B) {
- if (B.getDimension() != getDimension()) {
- throw new exception();
- }
- vector<double> newCoordinates(getDimension());
- for (int i = 0; i < getDimension(); i ++) {
- newCoordinates[i] = coordinates[i] - B.coordinates[i];
- }
- Point* result = new Point{newCoordinates};
- return *result;
- }
- Point& operator+ (Point B) {
- if (B.getDimension() != getDimension()) {
- throw new exception();
- }
- vector<double> newCoordinates(getDimension());
- for (int i = 0; i < getDimension(); i ++) {
- newCoordinates[i] = coordinates[i] + B.coordinates[i];
- }
- Point* result = new Point(newCoordinates);
- return *result;
- }
- Point& operator/ (double x) {
- for (int i = 0; i < getDimension(); i ++) {
- coordinates[i] /= x;
- }
- return *this;
- }
- double distance (Point B) {
- return (*this - B).distance();
- }
- };
- virtual Shape::Point center() = 0;
- };
- struct Triangle : Shape {
- string toString() {
- string result = "";
- result += "\nA: ";
- result += A.toString();
- result += "\nB: ";
- result += B.toString();
- result += "\nC: ";
- result += C.toString();
- return result;
- }
- Triangle(vector< vector <double> > coordinates) : A(coordinates[0]), B(coordinates[1]), C(coordinates[2]) {
- if (A.getDimension() != B.getDimension() || A.getDimension() != C.getDimension()) {
- throw new exception();
- }
- type = "Triangle";
- }
- double perimeter() {
- return A.distance(B) + B.distance(C) + C.distance(A);
- }
- double area() {
- double P = perimeter()/2;
- return sqrt(P * (P - A.distance(B)) * (P - B.distance(C)) * (P - C.distance(A)));
- }
- Point center() {
- return (A + B + C)/3;
- }
- private:
- Point A;
- Point B;
- Point C;
- };
- int main()
- {
- vector< vector<double> > coordinates(3);
- coordinates[0] = {0, 0};
- coordinates[1] = {0, 5};
- coordinates[2] = {12, 0};
- Triangle ABC(coordinates);
- cout << ABC.Type() << ABC.toString();
- cout << "\nArea: " << ABC.area();
- cout << "\nPerimeter: " << ABC.perimeter();
- cout << "\nCenter: " << ABC.center().toString();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment