Введите набор точек для функции замыкания - PullRequest
6 голосов
/ 02 марта 2011

Я пишу алгоритм в Clojure, который принимает набор точек, представляющих многоугольник. Другим входным параметром является точка, а выходным параметром должно быть, находится ли точка внутри многоугольника или нет.

Мой вопрос: как мне ввести набор точек для функции? Какая структура данных в clojure была бы наиболее подходящей - множество, вектор, список и т. Д.?

Ответы [ 2 ]

7 голосов
/ 02 марта 2011

Предположительно порядок точек имеет значение, так что форма ABCD не совпадает с формой ABDC?

В этом случае вам нужна какая-то структура данных, которая сохраняет порядок. Это означает, что список или вектор приемлемы, а набор - нет.

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

4 голосов
/ 02 марта 2011

Обычно вам следует начинать с самого простого из возможных решений, поэтому в этом случае я бы, вероятно, сделал это со списком точек, где каждая точка выражена в виде двумерного вектора, например,

(def my-polygon (list [0 0] [1 0] [1 1] [0 1]))

Это должно подойти для вашего приложения.

Однако в зависимости от того, как вы в конечном итоге захотите использовать / манипулировать этими полигонами в будущем, есть несколько альтернативных вариантов:

  • Если вы хотите взаимодействияс кодом Java (например, рисование многоугольника во фрейме с использованием Swing / Java2D) вы можете использовать экземпляры соответствующего класса Java (например, один из подклассов java.awt.geom.Point2D ) как отдельные баллы.Это даст вам меньше идиоматического кода Clojure, но улучшит взаимодействие с Java
  • Возможно, вы захотите использовать вектор вместо списка - особенно если вы собираетесь использовать большие полигоныи применение различных алгоритмов, которым требуется индексированный доступ к отдельным точкам
...