Координаты точек прямоугольника построчно

Программа работает, но не так как требуется. В цикле должны перебираться все точки ВНУТРИ прямоугольника построчно, а у меня сделано по углам.

Должно быть не 4 точки, как сделано у меня, а 2. Надо найти размер стороны (x2 - x1) и поделить индекс на него, чтобы получить x, а остаток будет y, всего точек (x2 -x1)*(y2 - y1)

Ещё подсказка...

Для начала — get_work_rect() пусть будет из одной строчки

return {2,2,6,5};

И вопрос — сколько точек напечатает цикл по такому итератору? 4? а сколько — двойной цикл по строкам/столбцам

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

auto it = std::begin( get_work_rect() );

Совершенно законная конструкция, но it хранит указатель на объект, который больше не существует. что именно расположено в этой памяти — неизвестно.

#include <iostream>
#include <exception>

using namespace std;

struct point {
    int x;
    int y;
};
struct rect {
    int x2;
    int y2;
    int x1;
    int y1;
public:
    //Доступ по индексу
    point operator[](const int& index) {
        //проверка на границы
        if (index < 0 || index > 3) throw IndexException();

        point res;

        //Получение точек по индексу
        switch (index)
        {
        case 0: res = { x1, y1 }; break;
        case 1: res = { x2, y1 }; break;
        case 2: res = { x2, y2 }; break;
        case 3: res = { x1, y2 }; break;
        }
        return res;
    }
private:
    //Описание ошибки
    class IndexException : public exception {
    public:
        const char* what() {
            return "index error : no data for the index";
        }
    };
    struct iterator
    {
        //Итератор для перебора точек
        iterator(rect* const ptr, const int& index = 0) : object_pointer(ptr), property_index(index) {}

        //получение текущей точки
        point operator*() const {
            if ((property_index < 0) || (property_index > 3))throw IndexException();
            return (*object_pointer)[property_index];
        }

        //получение следующей точки
        iterator& operator++ ()
        {
            property_index++;
            return *this;
        }

        //Проверка на неравенство для цикла for
        friend bool operator!= (const iterator& left_, const iterator& right_)
        {
            return left_.property_index != right_.property_index;
        };

    private:
        rect* object_pointer;
        int property_index;
    };

public:
    iterator begin() {
        return iterator(this, 0);
    }
    iterator end() {
        return iterator(this, 4);
    }
};

rect get_work_rect() {
    rect lol;
    cout << "input rect left upper corner point : \n";
    cin >> lol.x1 >> lol.y1;
    cout << "input rect right lower corner point : \n";
    cin >> lol.x2 >> lol.y2;
    return lol;
}

void process_point(point pt) {
    cout << "(" << pt.x << ", " << pt.y << ")";
}
void process_rect(rect r) {
    for (int y = r.y1; y < r.y2; ++y)
        for (int x = r.x1; x < r.x2; ++x) {
            process_point(point{ x,y });
            }
    }

int main() {
    rect r = get_work_rect();
    for (auto p : r) {
        process_point(p);
    }
    return 0;
}

Ответы (0 шт):