Реализовать Программу, Вычисляющую Для Заданного Набора Точек В Плоско

Rus2507

New member
20.12.2014
1
0
#1
Задание: Реализовать программу, вычисляющую для заданного набора точек в плоскости произвольно ориентированный прямоугольник, содержащий все точки.
Предоставить следующие режимы поиска:
• минимальная площадь прямоугольника;
• минимальный периметр прямоугольника.
Программа должна предоставлять отдельный режим, в котором искомый прямоугольник должен быть квадратом.

Пока удалось реализовать только прямоугольник под прямым углом к осям координат
Не знаю как реализовать произвольно ориентированный прямоугольник. Нужна помощь.


C++:
#include <iostream>
#include <conio.h>
#include <string>
#include <vector>
#include <io.h>
#include <fstream>
#include <math.h>

using namespace std;

class Point
{
double x;
double y;

public:
Point(double _x, double _y)
{
x = _x;
y = _y;
}

double GetX()
{
return x;
}

double GetY()
{
return y;
}

void SetX(double _x)
{
x = _x;
}

void SetY(double _y)
{
y = _y;
}
};

class Test
{
vector<Point*> test1;

public: 
Test()
{
test1.push_back(new Point(6, 1));
test1.push_back(new Point(4, 3));
test1.push_back(new Point(-5, 5));
test1.push_back(new Point(2, -5));
test1.push_back(new Point(0, 1));
test1.push_back(new Point(-2, -3));
test1.push_back(new Point(1, 1));
test1.push_back(new Point(2, -3));
}

void RunTest(void (*callbackcalc)(vector<Point*> _points))
{
callbackcalc(test1);
}

void Clear()
{
for(size_t i = 0; i < test1.size(); i++)
{
delete test1[i];
}
}
};

bool FileExists(const char *fname)
{
return _access(fname, 0) != -1;
}

void SaveToFile(vector<Point*> &_points)
{
string path;
cout <<"Введите путь и название файла:\n>";
cin >> path;

if(FileExists(path.c_str()))
{
char x;
cout << "Такой файл уже существует. Переписать?(y/n)\n";
x = _getch();
if(x != 'y')
{
SaveToFile(_points);
}
}

ofstream out;
if (!out) 
{
cout << "Cannot open file.\n";
}
out.open(path);

for (size_t i = 0; i < _points.size(); i++)
{		  
out << _points[i]->GetX() << " " << _points[i]->GetY() <<" ";	  
}

if(out.good())
cout << "Файл сохранен.\n";
out.close();
}

vector<Point*> GetFromFile()
{  
string path;
cout << "Введите путь к файлу:\n>";
cin >> path;
vector<Point*> points;
ifstream file; 

file.open(path);
if (!file) {
cout << "Cannot open file.\n";
GetFromFile();
}

double a;
int arr_size = 0; 

//считаем кол-во элементов
while (file)
{
file>>a;
arr_size++;	 
}

file.close();

file.open(path);

double* m = new double [arr_size];

for (int i = 0; i < arr_size; i++)
{
file >> m[i];
}

for (int j = 0, i = 0, k = 1; j < arr_size / 2; i = i + 2, k = k + 2, j++)
{
cout << "Координата X точки "; cout << j+1 << " >" << m[i] << endl;
cout << "Координата Y точки "; cout << j+1 << " >" << m[k] << endl;
points.push_back(new Point(m[i], m[k]));

}
file.close();
delete m;
return points;
}

void Calc(vector<Point*> _points)
{
Point *minx = new Point(_points[0]->GetX(), _points[0]->GetY());
Point *miny = new Point(_points[0]->GetX(), _points[0]->GetY());
Point *maxx = new Point(_points[0]->GetX(), _points[0]->GetY());
Point *maxy = new Point(_points[0]->GetX(), _points[0]->GetY());

for (int i = 0; i < _points.size(); i++)
{
if (_points[i]->GetX() > maxx->GetX())
{
maxx->SetX(_points[i]->GetX());
maxx->SetY(_points[i]->GetY());
}


if (_points[i]->GetY() > maxy->GetY())
{
maxy->SetX(_points[i]->GetX());
maxy->SetY(_points[i]->GetY());
}

if (_points[i]->GetX() < minx->GetX())
{
minx->SetX(_points[i]->GetX());
minx->SetY(_points[i]->GetY());
}

if (_points[i]->GetY() < miny->GetY())
{
miny->SetX(_points[i]->GetX());
miny->SetY(_points[i]->GetY());
}
}

Point *p1 = new Point(minx->GetX(), miny->GetY());
Point *p2 = new Point(maxx->GetX(), miny->GetY());
Point *p3 = new Point(maxx->GetX(), maxy->GetY());
Point *p4 = new Point(minx->GetX(), maxy->GetY());

double square = abs(p4->GetY() - p1->GetY()) * abs(p2->GetX() - p1->GetX());
double perimetr = 2 * (abs(p4->GetY() - p1->GetY()) + abs(p2->GetX() - p1->GetX()));

cout << "Ответ:\n точка 1 - (" << p1->GetX() << " " << p1->GetY() 
<< "), точка 2 - (" << p2->GetX() << " " << p2->GetY()
<< "), точка 3 - (" << p3->GetX() << " " << p3->GetY()
<< "), точка 4 - (" << p4->GetX() << " " << p4->GetY() << ")";

cout << "\nПериметр: " << perimetr;
cout << "\nПлощадь: " << square <<"\n";

delete minx;
delete miny;
delete maxx;
delete maxy;
delete p1, p2, p3, p4;
}

void main()
{
setlocale(LC_ALL, "Russian");
bool stop = true;
while(stop)
{
vector<Point*> points;

int anglek, koefB;
int howmanypoint;

cout << "Реализовать программу, вычисляющую для заданного набора точек в плоскости\nпроизвольно ориентированный прямоугольник, содержащий все точки. \n";
cout << "Тестирование - y, или сами - n?(y/n)\n";
char gg = _getch();
if(gg == 'y')
{
Test test;
test.RunTest(Calc);
}
else
{
cout << "Загрузить координаты точек из файла - y, или ввести самому - n?(y/n)\n";
char t = _getch();
if(t == 'y')
{
Calc(GetFromFile());
}
else
{
cout << "Тогда задайте количество точек:\n>"; 

while(!(cin >> howmanypoint) || howmanypoint == 1)
{
cin.clear();
cin.ignore((numeric_limits<std::streamsize>::max)(),'\n');
cout << "Wrong input. Please, try again: ";
}

double x = 0;
double y = 0;

for (int i = 0; i < howmanypoint; i++)
{
cout << "Координата X точки "; cout << i + 1; cout << " >";
while(!(cin >> x))
{
cin.clear();
cin.ignore((numeric_limits<std::streamsize>::max)(),'\n');
cout << "Wrong input. Please, try again: ";
}

cout << "Координата Y точки "; cout << i + 1; cout << " >"; 

while(!(cin >> y))
{
cin.clear();
cin.ignore((numeric_limits<std::streamsize>::max)(),'\n');
cout << "Wrong input. Please, try again: ";
}
points.push_back(new Point(x, y));
}

char s = ' ';
cout << "Сохранить координаты в файл?(y/n)\n";
s = _getch();
(s == 'y') ? SaveToFile(points) : false;

Calc(points);
}

char a = ' ';
cout << "\nПовторить?(y/n)\n";
a = _getch();
stop = (a == 'y') ? true : false;
}
}
}