Добавил:
okley
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:4 семестр / sr28
.cpp#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();
*/
}
