Библиотека рисунка изображения для Haskell?

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

Я достиг точки, где я должен нарисовать изображение мира, и это - то, где я поразил проблемы. Два из возможных конфигураций легки: если у людей есть четыре или восемь соседей каждый, то я представляю каждого как залитый квадратик (с цветом, соответствующим стратегии), и размещаю плоскость рядом с ними. Однако у меня также есть ситуация, где у людей есть шесть соседей (шестиугольники) или три соседа (треугольники).

Мой вопрос, затем: что такое хорошая библиотека Haskell для создания изображений и рисования форм на них? Я предпочел бы, чтобы это создало PNGs, но я весьма достоверно придирчив. Я первоначально использовал Графику. GD, но это только экспортирует привязку к функциям для рисования точек, строк, дуг, замещающих знаков и неповернутых прямоугольников, который не достаточен в моих целях (если я не хочу потянуть шестиугольники попиксельно*). Я изучил использование foreign import, но это доказывает что-то вроде стычки (частично, потому что тянущая полигон функция требует массива gdPoint структуры), и, учитывая, что мои требования могут вырасти, было бы хорошо использовать в - решение Haskell и не иметь для слоняний без дела с FFI (хотя, если нажатие прибывает в толчок, я готов сделать это). Какие-либо предложения?

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

Править: Всем огромное спасибо за Ваши предложения. К сожалению, я не смог заставить все необходимые библиотеки gtk2hs создавать, который исключил много решений. По ряду причин, после того, как я попробовал все Ваши ответы, отказавшие для установки многих библиотек, и нашел, что другие не могли сделать то, что я хотел, я закончил тем, что решил просто экспортировать больше FFI для libgd и использовал это вместо этого.

23
задан Don Stewart 16 April 2011 в 19:17
поделиться

5 ответов

Каир - хороший вариант, если вы хотите сгенерировать PNG. Wumpus тоже выглядит многообещающим, хотя я никогда им не пользовался. Если вам просто нужно увидеть это на экране, graphics-drawingcombinators - это простой интерфейс для OpenGL, который сделает то, что вам нужно, в несколько строк (см. example.hs в дистрибутиве ).

5
ответ дан 29 November 2019 в 02:44
поделиться

Раньше я использовал HOpenGL, но проблема в том, что (насколько я могу сказать) он не может отображать в файл, а только экран; то же самое (опять же, насколько я могу судить ) кажется верным для SDL и Wx. Я все же загляну в Каир .

По какой-то причине я не могу ответить на это сообщение, поэтому вынужден процитировать его. Вы ошибаетесь насчет GL и SDL, вы можете сделать поверхность / буфер вне экрана или визуализировать в текстуру. Эти библиотеки не нуждаются в такой функции (и не имеют особого смысла), потому что вы можете сделать это самостоятельно, обращаясь к пикселям в буфере и записывая их самостоятельно, даже с помощью экранных буферов, вы можете получить доступ к данным пикселей.

Буквально на днях я показал кому-то, как это сделать с привязками Haskell SDL:

http://hpaste.org/fastcgi/hpaste.fcgi/view?id=25047

Используйте библиотеку, которая может записывать в файлы .PNG, они, скорее всего, будут принимать необработанный указатель на буфер пикселей, который вы можете получить из SDL / GL или скопировать в формат, который нужен библиотеке.

Я только что нашел привязку Haskell для библиотеки DevIL , которая может выводить файлы .PNG. Ознакомьтесь с функцией под названием writeImageFromPtr

6
ответ дан 29 November 2019 в 02:44
поделиться

Ознакомьтесь с диаграммами:

http://hackage.haskell.org/cgi-bin/hackage-scripts/package/diagrams

примеры довольно хороши.

3
ответ дан 29 November 2019 в 02:44
поделиться

какая хорошая библиотека Haskell для создания изображений и рисования на них фигур?

У вас есть довольно много вариантов, на мой взгляд, все следующие использовались для игр :

Это наиболее распространенные, и вы можете просто выбрать их на основе особенностей / знакомства.

2
ответ дан 29 November 2019 в 02:44
поделиться

Диаграммы выглядят очень круто, но если вы хотите избежать фиксации и остаться суперлегковесным, вы можете генерировать svg напрямую. Взяв у Конрада Барски http://www.lisperati.com/haskell/

type Point     = (Float,Float)
type Color     = (Int,Int,Int)
type Polygon   = [Point]

writePoint :: Point -> String 
writePoint (x,y) = (show x)++","++(show y)++" "

writePolygon :: (Color,Polygon) -> String 
writePolygon ((r,g,b),p) = "<polygon points=\""++(concatMap writePoint p)++"\" style=\"fill:#cccccc;stroke:rgb("++(show r)++","++(show g)++","++(show b)++");stroke-width:2\"/>"

writePolygons :: [(Color,Polygon)] -> String 
writePolygons p = "<svg xmlns=\"http://www.w3.org/2000/svg\">"++(concatMap writePolygon p)++"</svg>"

colorize :: Color -> [Polygon] -> [(Color,Polygon)] 
colorize = zip.repeat

rainbow@[red,green,blue,yellow,purple,teal] = map colorize [(255,0,0),(0,255,0),(0,0,255),(255,255,0),(255,0,255),(0,255,255)]

t0 = writeFile "tut0.svg" $ writePolygons (blue [[(100,100),(200,100),(200,200),(100,200)],[(200,200),(300,200),(300,300),(200,300)]])

hexagon c r = translateTo c basicHexagon where
  basicHexagon =  top ++ (negate r, 0):bottom 
  top          =  [(r,0),(r * cos 1,(r * sin 1)),(negate (r * cos 1), r * (sin 1))]
  bottom       =  map (\(x,y)->(x,negate y)) (reverse top)

translateTo (x,y) poly = map f poly where f (a,b)= ((a+x),(b+y))

t1 = writeFile "t1.svg" $ writePolygons (blue [hexagon (100,100) 50] )

hexField r n m = let 
     mkHex n = hexagon (1.5*n*(r*2),(r*2)) r
     row n = map mkHex [1..n]
     aRow = row n
  in concat [map (offset (r*x)) aRow |x<-[1..m]]

offset r polys = map (oh r) polys where
  oh r pt@(x,y) = (x+(1.5*r),y+(r*sin 1))

t2 = writeFile "t2.svg" $ writePolygons (blue $ hexField 50 4 5 )

запустите t2 и загрузите файл в Firefox или другую программу, поддерживающую svg.

t2.svg ,exported png http://img30.imageshack.us/img30/2245/93715707.png

11
ответ дан 29 November 2019 в 02:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: