Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

4 семестр / sr28

.cpp
Скачиваний:
0
Добавлен:
16.11.2025
Размер:
18.35 Кб
Скачать
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <locale.h>
#include <math.h>
#include <graphics.h>
// треугольники (площадь, точки)
using namespace std;
class GeomFigure { // абстрактная фигура
    protected:
        double x, y;
        int color;
    public:
        GeomFigure(double ax, double ay, int acolor): x(ax), y(ay), color(acolor) {
        }
        GeomFigure(): x(0), y(0), color(0) {
        }
        virtual ~GeomFigure() { }
        virtual void Show() = 0;
        virtual void tShow() = 0;
        virtual void Hide() = 0;
        virtual void Length() = 0;
        virtual void Area() = 0;
        virtual void IsInside(double X, double Y) = 0; // метод, определяющий, принадлежит ли точка внутренности фигуры
        void Move(double nx, double ny);
};
GeomFigure *scene[20];
int SceneNum=0;
void AddToScene(GeomFigure &p){
    scene[SceneNum]=&(p);
    SceneNum++;
}
void RemoveFromScene(GeomFigure &p){
    for(int i=0; i<SceneNum; i++){
            if(scene[i]==&(p)){
                if(i==(SceneNum-1)){
                    scene[i]=NULL;
                    SceneNum--;
                }
                else{
                    scene[i]=scene[i+1];
                    SceneNum--;
                }
            }
    }
}
void GeomFigure::Move(double nx, double ny) {
    x = nx;
    y = ny;
}
class Pixel : public GeomFigure { // пиксель
    public:
    Pixel(double x, double y, int color): GeomFigure(x, y, color) {
    }
    virtual ~Pixel() { }
    void Show();
    void Hide();
    void Length();
    void Area();
    void IsInside(double X, double Y);
};
class Circle : public GeomFigure { // окружность
    double radius;
    public:
    Circle(double x, double y, double rad, int color): GeomFigure(x, y, color), radius(rad) { }
    virtual ~Circle() { }
    void Show();
    void Hide();
    void Length();
    void Area();
    void tShow();
    void IsInside(double X, double Y);
};
class Elipse : public GeomFigure { // эллипс
    double Ox, Oy;
    public:
    Elipse(double x, double y, double a, double b, int color): GeomFigure(x, y, color), Ox(a), Oy(b) { }
    virtual ~Elipse() { }
    void Show();
    void Hide();
    void Length();
    void Area();
    void IsInside(double X, double Y);
};
class Polyline : public GeomFigure { // ломаная
    protected:
    struct Vertex {
        double dx, dy;
        Vertex *next;
    };
    Vertex *first;
    public:
    Polyline(double x, double y, int color): GeomFigure(x, y, color), first(0) { }
    virtual ~Polyline();
    void AddVertex(double adx, double ady);
    void Dots();
    void Show();
    void Hide();
    void IsInside(double X, double Y);
    void Length();
    void Area();
};
void Polyline::AddVertex(double adx, double ady) { // добавить вершину ломаной
    Vertex *temp = new Vertex;
    temp->dx = adx;
    temp->dy = ady;
    temp->next = first;
    first = temp;
}
void Polyline::Dots(){
    Vertex *temp = new Vertex;
    temp = first;
    while(temp!=0){
        cout << "(" << (temp->dx)+x << ", " << temp->dy+y << ") ";
        temp=temp->next;
    }
    delete temp;
}
Polyline::~Polyline() { // деструктор ломаной
    while (first) {
    Vertex *temp = first;
    first = first->next;
    delete temp;
    }
}
class Rectangle: public Polyline { // прямоугольник
    public:
    Rectangle(double x, double y, int color, double a, double b): Polyline (x, y, color) { // Конструктор прямоугольника.
    AddVertex(0, 0);
    AddVertex(0, b);
    AddVertex(a, b);
    AddVertex(a, 0);
    AddVertex(0, 0);
    }
    void Show();
    void Hide();
    void IsInside(double X, double Y);
};
class Square: public Rectangle { // квадрат
    public:
    Square(double x, double y, int color, double a): Rectangle(x, y, color, a, a) { // Конструктор прямоугольника.
    }
    void Show();
    void Hide();
};
class Triangle : public Polyline { // треугольник
protected:
    double X2, Y2, X3, Y3;
    public:
    Triangle(double x1, double y1, double x2, double y2, double x3, double y3, int color): Polyline (x1, y1, color) {
        AddVertex(0, 0);
        AddVertex(y2-y1, x2-x1);
        AddVertex(x3-x1, y3-y1);
        AddVertex(0, 0);
        X2=x2;
        Y2=y2;
        X3=x3;
        Y3=y3;
        }
    void Show();
    void Hide();
    void tShow();
    void Area();
    void IsInside(double X, double Y);
};
class StraightLine: public Polyline{ // отрезок прямой
public:
    StraightLine(double x1, double y1, double x2, double y2, int color): Polyline (x1, y1, color) {
        AddVertex(0, 0);
        AddVertex(x2-x1, y2-y1);
    }
    void Show();
    void Hide();
};
class Romb: public Polyline { // прямоугольник
    public:
    Romb(double x, double y, int color, double diagX, double diagY): Polyline (x, y, color) {
    AddVertex(diagX/2, 0);
    AddVertex(0, diagY/2);
    AddVertex(-diagX/2, 0);
    AddVertex(0, -diagY/2);
    AddVertex(diagX/2, 0);
    }
    void tShow();
    void Show();
    void Hide();
    void Area();
    void IsInside(double X, double Y);
};

void Pixel::Show() {
    putpixel(x, y, color);
    cout << "Пикель с координатами (" << x << ", " << y << ") и цветом " << color << " показан." << endl;
}
void Pixel::Hide() {
    RemoveFromScene(*this);
    cout << "Пикель с координатами (" << x << ", " << y << ") и цветом " << color << " убран." << endl;
}
void Pixel::Length(){
}
void Pixel::Area(){
}
void Pixel::IsInside(double X, double Y){
}

void Circle::Show() {
    setcolor(color);
    circle(x, y, radius);
    setcolor(0);
    cout << "Окружность с центром (" << x << ", " << y << ") и цветом " << color << " и радиусом " << radius << " показана." << endl;
}
void Circle::tShow() {
    cout << "Окружность с центром (" << x << ", " << y << ") и цветом " << color << " и радиусом " << radius << endl;
}
void Circle::Hide() {
    RemoveFromScene(*this);
    cout << "Окружность с центром (" << x << ", " << y << ") и цветом " << color << " и радиусом " << radius << " убрана." << endl;
}
void Circle::Length() {
    cout << "Длина окружности - " << 2*3.14159*radius << endl;
}
void Circle::Area() {
    cout << "Площадь круга - " << 3.14159*radius*radius << endl;
}

void Elipse::Show() {
    setcolor(color);
    ellipse(x, y, 0, 360, Ox, Oy);
    setcolor(0);
    cout << "Эллипс с центром (" << x << ", " << y << ") и цветом " << color << " и полуосями " << Ox << " " << Oy << " показан." << endl;
}
void Elipse::Hide() {
    RemoveFromScene(*this);
    cout << "Эллипс с центром (" << x << ", " << y << ") и цветом " << color << " и полуосями " << Ox << " " << Oy << " убран." << endl;
}
void Elipse::Length() {
    cout << "Длина эллипса - " << 3.14159*(Ox+Oy) << endl;
}
void Elipse::Area() {
    cout << "Площадь эллипса - " << 3.14159*Ox*Oy << endl;
}

void Polyline::Show() {
    setcolor(color);
    Vertex *temp = new Vertex;
    temp = first;
    double s=0.0;
    while(((temp->next)!=0)&&(temp!=0)){
        line(temp->dx+x,temp->dy+y,x+(temp->next)->dx,y+(temp->next)->dy);
        temp=temp->next;
    }
    setcolor(0);
}
void Polyline::Hide() {
    cout << "Ломаная с началом (" << x << ", " << y << ") и цветом " << color << " и точками ";
    Dots();
    cout << "убрана." << endl;
    RemoveFromScene(*this);
}
void Polyline::Length() { // длина ломаной (и квадрата, и прямоугольника...)
    Vertex *temp = new Vertex;
    temp = first;
    double s=0.0;
    while(((temp->next)!=0)&&(temp!=0)){
        s+=sqrt(pow(temp->dx-((temp->next)->dx), 2)+pow(temp->dy-((temp->next)->dy), 2));
        temp=temp->next;
    }
    cout << "Длина - " << s << endl;
}
void Polyline::Area() {
}
void Romb::Show() {
    Polyline::Show();
    cout << "Ромб с центром (" << x << ", " << y << ") и цветом " << color << " и точками ";
    Dots();
    cout << "показан." << endl;
}
void Romb::tShow() {
    cout << "Ромб с центром (" << x << ", " << y << ") и цветом " << color << " и точками ";
    Dots();
    cout << endl;
}
void Romb::Hide() {
    cout << "Ромб с центром (" << x << ", " << y << ") и цветом " << color << " и точками ";
    Dots();
    cout << "убран." << endl;
}
void Romb::Area() {
    double diagX, diagY;
    diagX=2*(first->dx-(first->next)->dx);
    diagY=2*(first->dy-(first->next)->dy);
    cout << "Площадь ромба - " << diagX*diagY/2 << endl;
}
void Triangle::Show() {
    Polyline::Show();
    cout << "Треугольник с началом (" << x << ", " << y << ") и цветом " << color << " и точками ";
    Dots();
    cout << "показан." << endl;
}
void Triangle::tShow() {
    cout << "Треугольник с началом (" << x << ", " << y << ") и цветом " << color << " и точками ";
    Dots();
    cout << endl;
}
void Triangle::Hide() {
    cout << "Треугольник с началом (" << x << ", " << y << ") и цветом " << color << " и точками ";
    Dots();
    cout << "убран." << endl;
}
void Triangle::Area() {
    double l;
    l=abs((x * (Y2 - Y3) + X2 * (Y3 - y) + X3 * (y - Y2)) / 2.0);
    cout << "Площадь треугольника - " << l << endl;
}
void Rectangle::Show() {
    Polyline::Show();
    cout << "Прямоугольник с началом (" << x << ", " << y << ") и цветом " << color << " и точками ";
    Dots();
    cout << "показан." << endl;
}
void Rectangle::Hide() {
    cout << "Прямоугольник с началом (" << x << ", " << y << ") и цветом " << color << " и точками ";
    Dots();
    cout << "убран." << endl;
}
void Square::Show() {
    Polyline::Show();
    cout << "Квадрат с началом (" << x << ", " << y << ") и цветом " << color << " и точками ";
    Dots();
    cout << "показан." << endl;
}
void Square::Hide() {
    cout << "Квадрат с началом (" << x << ", " << y << ") и цветом " << color << " и точками ";
    Dots();
    cout << "показан." << endl;
}
void StraightLine::Show() {
    Polyline::Show();
    cout << "Отрезок с началом (" << x << ", " << y << ") и цветом " << color << " и точками ";
    Dots();
    cout << "показан." << endl;
}
void StraightLine::Hide() {
    cout << "Отрезок с началом (" << x << ", " << y << ") и цветом " << color << " и точками ";
    Dots();
    cout << "убран." << endl;
}
void SceneShow(){
    initwindow(1250,750);
    cout << "Graphic window ON." << endl;
    for(int i=0; i<SceneNum; i++){
            (scene[i])->Show();
    }
    getch(); // Wait for key press.
    closegraph(); // Close graphics.
    cout << "Graphic window OFF." << endl;
}
void SceneClear(){
    for(int i=0; i<SceneNum; i++){
            scene[i]=0;
    }
    SceneNum=0;
}
void Polyline::IsInside(double X, double Y){
};
void Circle::IsInside(double X, double Y){
    if(sqrt((X-x)*(X-x)+(Y-y)*(Y-y))<=radius*radius) cout << "Точка (" << X << ", " << Y << ") принадлежит окружности c центром (" << x << ", " << y << ")." << endl;
    else cout << "Точка (" << X << ", " << Y << ") не принадлежит окружности c центром (" << x << ", " << y << ")." << endl;
};
void Elipse::IsInside(double X, double Y){
    if(((X-x)*(X-x)/(Ox*Ox)+(Y-y)*(Y-y)/(Oy*Oy))<=1) cout << "Точка (" << X << ", " << Y << ") принадлежит эллипсу c центром (" << x << ", " << y << ")." << endl;
    else cout << "Точка (" << X << ", " << Y << ") не принадлежит эллипсу c центром (" << x << ", " << y << ")." << endl;
};
void Rectangle::IsInside(double X, double Y) {
    double yMin, yMax, xMin, xMax;
    xMin=x;
    xMax=first->next->dx+x;
    yMin=y;
    yMax=y+(first->next->next)->dy;
    if((X>=xMin)&&(X<=xMax)&&(Y<=yMax)&&(Y>=yMin)) cout << "Точка (" << X << ", " << Y << ") принадлежит прямоугольнику с началом в (" << x << ", " << y << ")." << endl;
    else cout << "Точка (" << X << ", " << Y << ") не принадлежит прямоугольнику с началом в (" << x << ", " << y << ")." << endl;
}
void Romb::IsInside(double X, double Y) {
    double k, diagX, diagY, xK=abs(X-x), yK=abs(Y-y);
    diagX=abs(first->dx);
    diagY=abs((first->next)->dy);
    if((abs(xK)/diagX+abs(yK)/diagY)<=1) cout << "Точка (" << X << ", " << Y << ") принадлежит ромбу с центром в (" << x << ", " << y << ")." << endl;
    else cout << "Точка (" << X << ", " << Y << ") не принадлежит ромбу с центром в (" << x << ", " << y << ")." << endl;
}
void Triangle::IsInside(double X, double Y) {
    double area1, area2, area3, area4;
    area1=abs((x * (Y2 - Y3) + X2 * (Y3 - y) + X3 * (y - Y2)) / 2.0);
    area2=abs((X * (Y2 - Y3) + X2 * (Y3 - Y) + X3 * (Y - Y2)) / 2.0);
    area3=abs((x * (Y - Y3) + X * (Y3 - y) + X3 * (y - Y)) / 2.0);
    area4=abs((x * (Y2 - Y) + X2 * (Y - y) + X * (y - Y2)) / 2.0);
    if(abs((area2+area3+area4)-area1)<0.00001) cout << "Точка (" << X << ", " << Y << ") принадлежит треугольнику с началом в (" << x << ", " << y << ")." << endl;
    else cout << "Точка (" << X << ", " << Y << ") не принадлежит треугольнику с началом в (" << x << ", " << y << ")." << endl;
}
int main(void){
    int tempColor, tempX, tempY, choice, choice_type, temp1, temp2, temp3, temp4;
    setlocale(LC_ALL, "Rus");
    system("cls");
	cout << "\nВыберите действие, которое хотите совершить:"
		<< "\n1 - Добавить фигуру"
		<< "\n2 - Действия с фигурами"
		<< "\n3 - Показать сцену"
		<< "\n4 - Очистить сцену"
		<< "\n(Ctrl + z Enter – Выход из программы\n";
	cin >> choice;

	while (!feof(stdin))// Начало цикла. Цикл выполняется до тех пор,
						// пока не будет введен символ Ctrl + z.
	{
		{
			switch (choice)
			{
			case 1:
			    cout << "Добавление своей фигуры. Выберите тип: " << endl;
                cout << "1 - окружность    2 - ромб    3 - треугольник" << endl;
                cin >> choice_type;
                cout << "Введите цвет фигуры (1 - синий, 2 - зелёный, 4 - красный и пр.):" << endl;
                cin >> tempColor;
                cout << "Введите координаты центра/начала фигуры:" << endl;
                cin >> tempX >> tempY;
                switch(choice_type){
                    case 1:
                    {
                        cout << "Введите радиус окружности:" << endl;
                        cin >> temp1;
                        Circle *p = new Circle(tempX, tempY, temp1, tempColor);
                        AddToScene(*p);
                    break;
                    }
                    case 2:
                    {
                        cout << "Введите длину одной диагонали:" << endl;
                        cin >> temp1;
                        cout << "Введите длину другой диагонали:" << endl;
                        cin >> temp2;
                        Romb *p = new Romb(tempX, tempY, tempColor, temp1, temp2);
                        AddToScene(*p);
                    break;
                    }
                    case 3:
                    {
                        cout << "Введите координаты второй точки:" << endl;
                        cin >> temp1 >> temp2;
                        cout << "Введите координаты третьей точки:" << endl;
                        cin >> temp3 >> temp4;
                        Triangle *p = new Triangle(tempX, tempY, temp1, temp2, temp3, temp4, tempColor);
                        AddToScene(*p);
                    break;
                    }
                }
				break;
			case 2:
			    for(int i=0; i<SceneNum; i++){
                    cout << "[" << i << "]:";
                    (scene[i])->tShow();
                }
                cout << "Введите номер фигуры из списка:" << endl;
                cin >> temp1;
                cout << "\nВыберите действия из списка: "
                    << "\n1 - Удалить фигуру"
                    << "\n2 - Переместить фигуру"
                    << "\n3 - Длина фигуры"
                    << "\n4 - Площадь фигуры"
                    << "\n5 - Принадлежит ли точка фигуре?" << endl;
                cin >> choice_type;
                switch(choice_type){
                    case 1:
                    {
                        RemoveFromScene(*(scene[temp1]));
                        break;
                    }
                    case 2:
                    {
                        cout << "Введите новые координаты центра/начала:" << endl;
                        cin >> tempX >> tempY;
                        (scene[temp1])->Move(tempX, tempY);
                        break;
                    }
                    case 3:
                    {
                        scene[temp1]->Length();
                    break;
                    }
                    case 4:
                    {
                        scene[temp1]->Area();
                    break;
                    }
                    case 5:
                    {
                        cout << "Введите координаты точки:" << endl;
                        cin >> tempX >> tempY;
                        scene[temp1]->IsInside(tempX, tempY);
                    break;
                    }
                }
                break;
            case 3:
                {
                SceneShow();
                break;
			}
			case 4:
			    SceneClear();
			    break;
			default:
				cout << "\nКоманда меню с номером" << choice
					<< "отсутствует\n";
				break;
			}
		}

		cout << "\nВыберите действие, которое хотите совершить:"
            << "\n1 - Добавить фигуру"
            << "\n2 - Действия с фигурами"
            << "\n3 - Показать сцену"
            << "\n4 - Очистить сцену"
            << "\n(Ctrl + z Enter – Выход из программы\n";
        cin >> choice;
	}
	system("pause");
    return 0;
    /*
    a6.IsInside(100, 201);
    Pixel p2(100, 201, 15);
    c.IsInside(251, 222);
    Pixel p3(251, 222, 15);
    a4.IsInside(502, 151);
    Pixel p4(502, 151, 15);
    a5.IsInside(860, 400);
    Pixel p5(860, 400, 15);
    a9.IsInside(600, 500);
    Pixel p6(600, 500, 15);
    AddToScene(p2);
    a4.Length();
    a4.Area();
    a5.Area();
    c.Length();
    a6.Length();
    a7.Length();
    RemoveFromScene(a6);
    a7.Move(840, 400);
    c.Move(300, 450);
    SceneShow();
    SceneClear();
    SceneShow();
    */
}

Соседние файлы в папке 4 семестр