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

Тема в разделе "C/C++/C#", создана пользователем Rus2507, 20 дек 2014.

  1. Rus2507

    Rus2507 New Member

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

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


    Код (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;
    }
    }
    }
     
Загрузка...
Похожие Темы - Реализовать Программу Вычисляющую
  1. DarkTorvald
    Ответов:
    0
    Просмотров:
    864
  2. DarkTorvald
    Ответов:
    0
    Просмотров:
    777
  3. DarkTorvald
    Ответов:
    1
    Просмотров:
    1.045
  4. DarkTorvald
    Ответов:
    0
    Просмотров:
    956
  5. DarkTorvald
    Ответов:
    0
    Просмотров:
    799

Поделиться этой страницей