Я пытаюсь создать растровую графику. На данный момент я создал код для прямоугольника, однако код работает только для прямоугольника 3x3. Я не уверен, как улучшить код, чтобы он работал для 4x4, 5x5 и т. д. Вот что у меня есть:
rectangleRaster :: Coord -> Coord -> Raster
rectangleRaster (x1, y1) (x2, y2) = [((x1, y1), 1.0), ((x1, y1 + y2), 1.0)] ++ [((x1, y2), 1.0), ((x1 + x2, y1), 1.0)] ++ [((x2 + x1, y2), 1.0), ((x2, y1), 1.0)] ++ [((x2, y2 + y1), 1.0), ((x2, y2), 1.0)]
Я вижу, что проблема в том, что каждый раз, когда мне нужен прямоугольник побольше, мне нужно добавить больше очков к rectangleRaster
. Итак, как я могу использовать рекурсию или что-то еще, чтобы, когда я вводил несколько точек, он создавал полный прямоугольник без пробелов. Вот что такое отпечатки для очков:
Возвращаемое значение вашей функции состоит из 4-х сегментов, соединенных вместе (++)
- это имеет смысл. Но каждый из них составляет всего 2 балла. Создайте функцию, которая принимает 2 точки и возвращает переменное количество точек, образующих линию между двумя точками. Изучите список понятий и понятий, связанных с этими: размеры шагов, защитные ограждения, генераторы и т. д.
Растрированный прямоугольник можно представить просто как:
Каждая точка (x', y')
, существующая между (x1, y1)
и (x2,y2)
, удовлетворяющая любому количеству следующих условий:
- x == x1
- x == x2
- y == y1
- y == y2
Понимание списка - хорошее начало для того, что вы хотите. В качестве подсказки, вот понимание списка, которое даст вам заполненный квадрат между (x1, y1)
и (x2, y2)
:
pointList = [(x', y') | x' <- [x1..x2], y' <- [y1..y2]]
Оттуда двигайтесь дальше, выясняя, как указать, какие из этих пунктов должны попасть в список. Вы можете прочитать о понимании списка, например, по адресу:
https://wiki.haskell.org/List_comprehension.
Удачи!
Можете ли вы объяснить, например, в псевдокоде, как построить такой список?