Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.12.2014, 20:29   #1
Rustam2507
 
Регистрация: 06.04.2014
Сообщений: 3
По умолчанию Реализовать программу, вычисляющую для точек в плоскости произвольно ориентированный прямоугольник

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

Пока удалось реализовать только прямоугольник под прямым углом к осям координат
Не знаю как реализовать произвольно ориентированный прямоугольник. Нужна помощь.
(Весь код в прикреплённом файле)
Код:
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;
    }
};
 
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 howmanypoint;
 
        cout << "Реализовать программу, вычисляющую для заданного набора точек в плоскости\nпроизвольно ориентированный прямоугольник, содержащий все точки. \n";
        
                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;
        }
    }
}
Вложения
Тип файла: txt Код.txt (6.0 Кб, 144 просмотров)

Последний раз редактировалось Rustam2507; 20.12.2014 в 20:33.
Rustam2507 вне форума Ответить с цитированием
Старый 20.12.2014, 21:13   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Построив минимальную выпуклую оболочку строить для каждого из отрезков оболочки минимальный огибающий прямоугольник так, что бы одна сторона его включала в себя этот отрезок. Из этих прямоугольников выбрать с минимальным периметром или площадью. Пример минимальной выпуклой оболочки на картинке. Её построить тоже не совсем тривиально
Изображения
Тип файла: jpg Безымянный.jpg (4.1 Кб, 53 просмотров)
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.12.2014, 00:03   #3
Rustam2507
 
Регистрация: 06.04.2014
Сообщений: 3
По умолчанию

а что значит ОГИБАЮЩИЙ прямоугольник?
Rustam2507 вне форума Ответить с цитированием
Старый 21.12.2014, 00:04   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

значит содержащий все точки или выпуклая прямоугольная оболочка
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.12.2014, 00:06   #5
Rustam2507
 
Регистрация: 06.04.2014
Сообщений: 3
По умолчанию

а более подробный алгоритм можешь набросать?
Rustam2507 вне форума Ответить с цитированием
Старый 21.12.2014, 10:17   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А он и так уже подробный дальше некуда
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
На плоскости задано множество точек. Определить все тройки точек, которые являются вершинами прямоугольного треугольника Олечка12 Помощь студентам 11 22.04.2014 19:56
Заданы координаты n точек на плоскости. Найти номера двух точек, расстояние между которыми наибольшее. Программа на языке С nync Помощь студентам 6 20.01.2014 14:30
Даны координаты точек n на плоскости. Найти номера двух точек, расстояние между которыми наибольшее. getredtm Помощь студентам 3 01.07.2013 01:47
Даны координаты n точек на плоскости. Найти номера двух точек, расстояние между которыми наибольшее. Viwwna Паскаль, Turbo Pascal, PascalABC.NET 2 19.11.2011 06:33
определить радиус и центр окружности, на кот. лежит наиб.число точек заданного на плоскости мн-ва точек) kcю Помощь студентам 0 17.11.2009 19:50