2013-12-17 2 views
2

Я застреваю, пытаясь выполнить задание. Это последний вопрос о задании, и я собираюсь на него какое-то время с небольшим успехом. Мне нужно, чтобы превратить изображение в ASCII-графике, гдеHaskell - превратить список координат в граф ASCII?

type Point = (Int, Int) 
type Image = [Point] 

я должен написать функцию, которая принимает изображение и возвращает строку. Вывод должен быть что-то вроде "| ... \ n.xxx \ п + х - \ п |.. ... \ п.", Который, когда выводимый с использованием putStr выглядит

.|... 
.xxx. 
-+x-- 
.|... 

С начало координат, обозначаемое символом +, - оси | и -, и точки «х».

Граф всегда должен иметь 1-точечную границу вокруг координат, поэтому, когда я печатаю график, мне нужно знать границы координат. У меня есть функция, чтобы получить их.

Я также написал функцию, split, которая берет строку и целое число и вставляет \ n на каждый n-й интервал. То, как я думал о решении вопроса, заключалось в создании пустого графика с правильными позициями для осей, а затем передачи пустого графика в новую функцию для вставки точек.

Может ли кто-нибудь помочь мне в этом? Извиняюсь, если это неопределенно, я могу предоставить более подробную информацию, которую вы можете потребовать.

+0

Учитывая, что это домашнее задание, вы, вероятно, не заинтересованы в полных решениях. Но чтобы дать вам полезные советы, нам нужно знать, где вы застряли. Учитывая границы координат (предположим, что у вас их уже есть), удалось ли вы нарисовать оси? Начните с этого в первую очередь. –

+0

Я бы разбил точки на несколько массивов, каждая из которых содержала все точки с одинаковыми y. Таким образом, каждая строка может отображаться индивидуально. Затем вы вызываете функцию для рендеринга одной строки. Эта функция должна «зациклиться» над списком всех возможных x, сравнить с головкой массива и 0 и вернуть соответствующий символ и вернуть функцию, примененную к оставшемуся массиву. – Alexander

+0

@JoachimBreitner Вот где я застрял. Я знаю, что мне нужно начать рисовать из координаты (minx -1, maxy + 1), но я понятия не имею, как проверить, попал ли я в осях и т. Д. –

ответ

1

Вот некоторые вещи, чтобы думать:

  • Что такое изображение, функционально говоря? Игнорируя теперь границы, изображение является функцией от координат до того, что показано на этой координате. Попробуйте придумать сигнатуру типа для изображений. Бонусные баллы, если вы используете type, чтобы называть это FImage. Подумайте о таких функциях, как ваши основные объекты (помните, что функции являются гражданами первого класса).
  • Реализовать оси, как FImage. Обратите внимание, что для этого вам не нужны ограничения. Разве это не здорово?
  • Внесите функцию, которая принимает FImage и Point, и производит FImage, у которого есть x в правильном положении.
  • Определить границы из списка пунктов. Как всегда, всегда думайте сначала: что такое подпись этого типа?
  • Подтверждено FImage и границы, произвести окончательный String. Вы можете использовать здесь List.
  • Все вместе. Здесь есть сгиб! Одним из его аргументов будет список пунктов. Каковы другие аргументы (базовый случай и комбинационная функция). На этом уровне опыта Haskell не беспокойтесь слишком много, будь то foldl или foldr, оба будут работать (если совпадают типы).
  • Готово :-)

С Днем обучения!

0

Хорошо видеть, как люди честно отмечают свой вопрос как задание.

  • Если вы знаете размеры изображения, знаете ли вы, как проходить через координаты?
  • Вы знаете, как отсортировать список Точек в порядке появления на картинке?
  • Учитывая все это, вы знаете, как организовать обработку каждой координаты и список точек в порядке появления?
Смежные вопросы