#define _USE_MATH_DEFINES
#include <math.h>
#include "figures.h"
#include <iostream>
#include <vector>
#include <ostream>
//Длина отрезка ab
double length(Figure::Point a, Figure::Point b){
return sqrt(double((a.x-b.x) * (a.x-b.x) + (a.y-b.y)*(a.y-b.y)));
}
Circle::Circle(Point center, int rad, int color):
Figure(color), //вызываем конструктор базового класса
center(center), rad(rad) //инициализация полей
{}
double Circle::place() const {
#ifdef _DEBUG
std::cerr << "In Circle::place()\n";
#endif
return M_PI * rad * rad;
}
double Circle::perimetr() const {
#ifdef _DEBUG
std::cerr << "In Circle::perimetr()\n";
#endif
return 2 * M_PI * rad;
}
void Circle::output() const{
std::cout << "<" << "Cricle: " << "x=" << center.x << ", " << "y=" << center.y << ", " << "r=" << rad << ", " << "color=" << color << ">" << std::endl;
}
//===================================================
Triangle::Triangle(Point p1, Point p2, Point p3, int color):
Figure(color),
p1(p1), p2(p2), p3(p3)
{}
double Triangle::place() const {
#ifdef _DEBUG
std::cerr << "In Triangle::place()\n";
#endif
double ans = 0.5 * ( (p1.x-p3.x)*(p2.y-p3.y)-(p2.x-p3.x)*(p1.y-p3.y) );
if (ans < 0) {
ans = -ans;
}
return ans;
}
double Triangle::perimetr() const {
#ifdef _DEBUG
std::cerr << "In Triangle::perimetr()\n";
#endif
return length(p1,p2) + length(p2,p3) + length(p1,p3);
}
void Triangle::output() const{
std::cout << "<" << "Triangle:" << "x1="<< p1.x << ", " <<"y1=" << p1.y << ", " << "x2="<< p2.x << ", " <<"y2=" << p2.y << ", " << "x3="<< p3.x << ", " <<"y3=" << p3.y << ">" << std::endl;
}
//===================================================
Polygon::Polygon(std::vector<Point> vPolygon, int color):
Figure(color),
vPolygon(vPolygon)
{}
double Polygon::place() const {
#ifdef _DEBUG
std::cerr << "In Polygon::place()\n";
#endif
double s = 0.0;
for (int i = 0; i<vPolygon.size()-1; i++)
{
s += (vPolygon[i+1].y + vPolygon[i].y)*(vPolygon[i+1].x-vPolygon[i].x)/2;
}
if (s<0) {
s = -s;
}
return s;
}
double Polygon::perimetr() const {
#ifdef _DEBUG
std::cerr << "In Polygon::perimetr()\n";
#endif
double p = 0.0;
for (int i = 0; i<vPolygon.size()-1; i++){
p += length(vPolygon[i+1], vPolygon[i]);
}
return p;
}
void Polygon::output() const{
std::cout<<"Polygon:";
for (int i=0; i < vPolygon.size()-1;i++){
std::cout<<"x"<<i+1<<"="<<vPolygon[i].x<<", "<<"y"<<i+1<<"="<<vPolygon[i].y<<", ";
}
std::cout<<"color="<<color<<">"<<std::endl;
}
std::ostream & operator << (std::ostream & os, const Figure &f){
f.output();
return os;
}
I2RlZmluZSBfVVNFX01BVEhfREVGSU5FUwojaW5jbHVkZSA8bWF0aC5oPgojaW5jbHVkZSAiZmlndXJlcy5oIgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxvc3RyZWFtPgoKLy/QlNC70LjQvdCwINC+0YLRgNC10LfQutCwIGFiCmRvdWJsZSBsZW5ndGgoRmlndXJlOjpQb2ludCBhLCBGaWd1cmU6OlBvaW50IGIpewoJcmV0dXJuIHNxcnQoZG91YmxlKChhLngtYi54KSAqIChhLngtYi54KSArIChhLnktYi55KSooYS55LWIueSkpKTsKfQoKQ2lyY2xlOjpDaXJjbGUoUG9pbnQgY2VudGVyLCBpbnQgcmFkLCBpbnQgY29sb3IpOiAKIEZpZ3VyZShjb2xvciksIC8v0LLRi9C30YvQstCw0LXQvCDQutC+0L3RgdGC0YDRg9C60YLQvtGAINCx0LDQt9C+0LLQvtCz0L4g0LrQu9Cw0YHRgdCwCiBjZW50ZXIoY2VudGVyKSwgcmFkKHJhZCkgLy/QuNC90LjRhtC40LDQu9C40LfQsNGG0LjRjyDQv9C+0LvQtdC5CiB7fQoKZG91YmxlIENpcmNsZTo6cGxhY2UoKSBjb25zdCB7CiAgICAjaWZkZWYgX0RFQlVHCgkgIHN0ZDo6Y2VyciA8PCAiSW4gQ2lyY2xlOjpwbGFjZSgpXG4iOwogICAgI2VuZGlmCglyZXR1cm4gTV9QSSAqIHJhZCAqIHJhZDsKfQoKZG91YmxlIENpcmNsZTo6cGVyaW1ldHIoKSBjb25zdCB7CiAgICAjaWZkZWYgX0RFQlVHCgkgIHN0ZDo6Y2VyciA8PCAiSW4gQ2lyY2xlOjpwZXJpbWV0cigpXG4iOwogICAgI2VuZGlmCglyZXR1cm4gMiAqIE1fUEkgKiByYWQ7Cn0KCnZvaWQgQ2lyY2xlOjpvdXRwdXQoKSBjb25zdHsKCXN0ZDo6Y291dCA8PCAiPCIgPDwgIkNyaWNsZTogIiA8PCAieD0iIDw8IGNlbnRlci54IDw8ICIsICIgPDwgInk9IiA8PCBjZW50ZXIueSA8PCAiLCAiIDw8ICAicj0iIDw8IHJhZCA8PCAiLCAiIDw8ICJjb2xvcj0iIDw8IGNvbG9yIDw8ICI+IiA8PCBzdGQ6OmVuZGw7Cn0KCgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKVHJpYW5nbGU6OlRyaWFuZ2xlKFBvaW50IHAxLCBQb2ludCBwMiwgUG9pbnQgcDMsIGludCBjb2xvcik6CiAgRmlndXJlKGNvbG9yKSwgCiAgcDEocDEpLCBwMihwMiksIHAzKHAzKSAKICB7fQoKZG91YmxlIFRyaWFuZ2xlOjpwbGFjZSgpIGNvbnN0IHsKCSNpZmRlZiBfREVCVUcKCSAgc3RkOjpjZXJyIDw8ICJJbiBUcmlhbmdsZTo6cGxhY2UoKVxuIjsKICAgICNlbmRpZgoJZG91YmxlIGFucyA9IDAuNSAqICggKHAxLngtcDMueCkqKHAyLnktcDMueSktKHAyLngtcDMueCkqKHAxLnktcDMueSkgKTsKCWlmIChhbnMgPCAwKSB7CgkJYW5zID0gLWFuczsKCX0KCXJldHVybiBhbnM7Cn0KCmRvdWJsZSBUcmlhbmdsZTo6cGVyaW1ldHIoKSBjb25zdCB7CgkjaWZkZWYgX0RFQlVHCgkgIHN0ZDo6Y2VyciA8PCAiSW4gVHJpYW5nbGU6OnBlcmltZXRyKClcbiI7CiAgICAjZW5kaWYKCXJldHVybiBsZW5ndGgocDEscDIpICsgbGVuZ3RoKHAyLHAzKSArIGxlbmd0aChwMSxwMyk7Cn0KCnZvaWQgVHJpYW5nbGU6Om91dHB1dCgpIGNvbnN0ewoJc3RkOjpjb3V0IDw8ICI8IiA8PCAiVHJpYW5nbGU6IiA8PCAieDE9Ijw8IHAxLnggPDwgIiwgIiA8PCJ5MT0iIDw8IHAxLnkgPDwgIiwgIiA8PCAieDI9Ijw8IHAyLnggPDwgIiwgIiA8PCJ5Mj0iIDw8IHAyLnkgPDwgIiwgIiA8PCAieDM9Ijw8IHAzLnggPDwgIiwgIiA8PCJ5Mz0iIDw8IHAzLnkgPDwgIj4iIDw8IHN0ZDo6ZW5kbDsKCSAKCQp9CgoKCgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpQb2x5Z29uOjpQb2x5Z29uKHN0ZDo6dmVjdG9yPFBvaW50PiB2UG9seWdvbiwgaW50IGNvbG9yKToKCUZpZ3VyZShjb2xvciksCgl2UG9seWdvbih2UG9seWdvbikKCXt9Cgpkb3VibGUgUG9seWdvbjo6cGxhY2UoKSBjb25zdCB7CgkjaWZkZWYgX0RFQlVHCgkgIHN0ZDo6Y2VyciA8PCAiSW4gUG9seWdvbjo6cGxhY2UoKVxuIjsKICAgICNlbmRpZgoJZG91YmxlIHMgPSAwLjA7Cglmb3IgKGludCBpID0gMDsgaTx2UG9seWdvbi5zaXplKCktMTsgaSsrKQoJewoJCXMgKz0gKHZQb2x5Z29uW2krMV0ueSArIHZQb2x5Z29uW2ldLnkpKih2UG9seWdvbltpKzFdLngtdlBvbHlnb25baV0ueCkvMjsKCX0KCWlmIChzPDApIHsKCQlzID0gLXM7Cgl9CglyZXR1cm4gczsKfQoKZG91YmxlIFBvbHlnb246OnBlcmltZXRyKCkgY29uc3QgewoJI2lmZGVmIF9ERUJVRwoJICBzdGQ6OmNlcnIgPDwgIkluIFBvbHlnb246OnBlcmltZXRyKClcbiI7CiAgICAjZW5kaWYKCWRvdWJsZSBwID0gMC4wOwoJZm9yIChpbnQgaSA9IDA7IGk8dlBvbHlnb24uc2l6ZSgpLTE7IGkrKyl7CgkJcCArPSBsZW5ndGgodlBvbHlnb25baSsxXSwgdlBvbHlnb25baV0pOwoJfQoJcmV0dXJuIHA7Cgp9Cgp2b2lkIFBvbHlnb246Om91dHB1dCgpIGNvbnN0ewoJc3RkOjpjb3V0PDwiUG9seWdvbjoiOwoJZm9yIChpbnQgaT0wOyBpIDwgdlBvbHlnb24uc2l6ZSgpLTE7aSsrKXsKCQlzdGQ6OmNvdXQ8PCJ4Ijw8aSsxPDwiPSI8PHZQb2x5Z29uW2ldLng8PCIsICI8PCJ5Ijw8aSsxPDwiPSI8PHZQb2x5Z29uW2ldLnk8PCIsICI7Cgl9CglzdGQ6OmNvdXQ8PCJjb2xvcj0iPDxjb2xvcjw8Ij4iPDxzdGQ6OmVuZGw7Cgp9CgpzdGQ6Om9zdHJlYW0gJiBvcGVyYXRvciA8PCAoc3RkOjpvc3RyZWFtICYgb3MsIGNvbnN0IEZpZ3VyZSAmZil7CglmLm91dHB1dCgpOwoJcmV0dXJuIG9zOwp9Cg==