Как я могу сохранить вход без использования массива? - PullRequest
0 голосов
/ 20 февраля 2019

Вопрос, необходимый для вычисления AABB минимального размера для набора входных геометрий.

Типы геометрий перечислены ниже:

  1. Прямоугольник, center_x, center_y, ширина, высота: R xywh
  2. Круг, центр_x, центр_y, радиус: C xyr
  3. Набор точек, количество точек, x_1, y_1, ..., x_n, y_n: P n x_1y_1 ... x_n y_n
  4. # : указывает конец ввода

Пример выборки показан ниже:

input:

R 0 0 3 2
#

выход:

0 0 3 2

вход:

P 23 -2 -1 4

C -0,5 3,2 1,6

P 3 -1,5 3 3 3 5 3

R 0 0 3 2

#

вывод:

1.45 1.4 7.1 6.8


Мне интересно, как работает пример два, так как есть многоканальный ввод, как я могу построить свойААББ?Однако как избежать ситуации, когда переменная заменяется?

Например,

R 0 0 3 2

R 1 2 4 5

Я просто не знаю, как избежать заменыcenter_x, center_y, w и h.


ниже мой код,

#include <iostream>
#include <cstdlib>

using namespace std;
int main()
{
    int times, i;
    char geo;
    double center_x, center_y, w, h, r;
    double box_LX = 0, box_RX = 0, box_DY = 0, box_UY = 0;
    bool end;
    end = false;
    double LX, RX, UY, DY;


    while (!end) {
        cin >> geo;
        if (geo == 'R') {
            cin >> center_x >> center_y >> w >> h;
            LX = (center_x - w / 2);
            RX = (center_x + w / 2);
            DY = (center_y - h / 2);
            UY = (center_y + h / 2);
            if (RX > box_RX)
                box_RX = RX;
            if (LX < box_LX)
                box_LX = LX;
            if (UY > box_UY)
                box_UY = UY;
            if (DY < box_DY)
                box_DY = DY;
        }
        if (geo == 'C') {
            cin >> center_x >> center_y >> r;
            if (box_RX < (center_x + r))
                box_RX = center_x + r;
            if (box_LX > (center_x - r))
                box_LX = center_x - r;
            if (box_UY < (center_y + r))
                box_UY = center_y + r;
            if (box_DY < (center_y - r))
                box_DY = center_y - r;
        }
        if (geo == 'P') {
            cin >> times;
            i = 0;
            while (i != times) {
                cin >> center_x >> center_y;
                if (box_RX < center_x)
                    box_RX = center_x;
                if (box_LX > center_x)
                    box_LX = center_x;
                if (box_UY < center_y)
                    box_UY = center_y;
                if (box_DY > center_y)
                    box_DY = center_y;
                i++;
            }
        }
        if (geo == '#') {
            cout << (box_LX+box_RX)/2 << " " << (box_DY+box_UY)/2 << " " << abs(box_LX - box_RX) << " " << abs(box_UY - box_DY) << endl;
            end = true;
        }
    }
    return 0;
}

Спасибо большое !!

1 Ответ

0 голосов
/ 20 февраля 2019

Вам не нужен массив для этого.Как аналогия, представьте, что вместо этого вы пытаетесь найти минимальное значение int из списка целых чисел (что аналогично тому, что вы делаете, но в одном измерении вместо двух).Все, что вам нужно для отслеживания минимального значения, это

  1. Текущий минимум всех предыдущих значений (current) и
  2. Следующее значение (value).

Из этих двух значений вы можете вычислить следующий минимум - min(current, value), затем взять следующее значение, снова вычислить минимум и так далее.В конце ввода выведите current.Ни в коем случае вам не нужно хранить все значения одновременно.

Для вашего вопроса замените current на текущий AABB минимального размера, value на следующую фигуру иmin с функцией, которая возвращает AABB минимального размера, который содержит обе фигуры.

enter image description here

На этом изображении у вас есть 2 предыдущих фигуры (2 черных ящика), текущий минимум (серый прямоугольник), следующая фигура (синий круг) и следующий минимум (красный прямоугольник), который необходимо рассчитать, который содержит как серый прямоугольник, так и синий кружок.

...