Я работаю над программой Haskell для того, чтобы играть в пространственные игры: у Меня есть график набора "людей", играющих Дилемму Заключенного, но только с их ближайшими соседями, и копирующих стратегии людей, которые прилагают все усилия.
Я достиг точки, где я должен нарисовать изображение мира, и это - то, где я поразил проблемы. Два из возможных конфигураций легки: если у людей есть четыре или восемь соседей каждый, то я представляю каждого как залитый квадратик (с цветом, соответствующим стратегии), и размещаю плоскость рядом с ними. Однако у меня также есть ситуация, где у людей есть шесть соседей (шестиугольники) или три соседа (треугольники).
Мой вопрос, затем: что такое хорошая библиотека Haskell для создания изображений и рисования форм на них? Я предпочел бы, чтобы это создало PNGs, но я весьма достоверно придирчив. Я первоначально использовал Графику. GD, но это только экспортирует привязку к функциям для рисования точек, строк, дуг, замещающих знаков и неповернутых прямоугольников, который не достаточен в моих целях (если я не хочу потянуть шестиугольники попиксельно*). Я изучил использование foreign import
, но это доказывает что-то вроде стычки (частично, потому что тянущая полигон функция требует массива gdPoint
структуры), и, учитывая, что мои требования могут вырасти, было бы хорошо использовать в - решение Haskell и не иметь для слоняний без дела с FFI (хотя, если нажатие прибывает в толчок, я готов сделать это). Какие-либо предложения?
*, Который является также опцией на самом деле; любые подсказки относительно того, как сделать, который также ценился бы, хотя я думаю библиотека, были бы легче.
Править: Всем огромное спасибо за Ваши предложения. К сожалению, я не смог заставить все необходимые библиотеки gtk2hs создавать, который исключил много решений. По ряду причин, после того, как я попробовал все Ваши ответы, отказавшие для установки многих библиотек, и нашел, что другие не могли сделать то, что я хотел, я закончил тем, что решил просто экспортировать больше FFI для libgd и использовал это вместо этого.
Каир - хороший вариант, если вы хотите сгенерировать PNG. Wumpus тоже выглядит многообещающим, хотя я никогда им не пользовался. Если вам просто нужно увидеть это на экране, graphics-drawingcombinators - это простой интерфейс для OpenGL, который сделает то, что вам нужно, в несколько строк (см. example.hs
в дистрибутиве ).
Раньше я использовал HOpenGL, но проблема в том, что (насколько я могу сказать) он не может отображать в файл, а только экран; то же самое (опять же, насколько я могу судить ) кажется верным для SDL и Wx. Я все же загляну в Каир .
По какой-то причине я не могу ответить на это сообщение, поэтому вынужден процитировать его. Вы ошибаетесь насчет GL и SDL, вы можете сделать поверхность / буфер вне экрана или визуализировать в текстуру. Эти библиотеки не нуждаются в такой функции (и не имеют особого смысла), потому что вы можете сделать это самостоятельно, обращаясь к пикселям в буфере и записывая их самостоятельно, даже с помощью экранных буферов, вы можете получить доступ к данным пикселей.
Буквально на днях я показал кому-то, как это сделать с привязками Haskell SDL:
http://hpaste.org/fastcgi/hpaste.fcgi/view?id=25047
Используйте библиотеку, которая может записывать в файлы .PNG, они, скорее всего, будут принимать необработанный указатель на буфер пикселей, который вы можете получить из SDL / GL или скопировать в формат, который нужен библиотеке.
Я только что нашел привязку Haskell для библиотеки DevIL , которая может выводить файлы .PNG. Ознакомьтесь с функцией под названием writeImageFromPtr
Ознакомьтесь с диаграммами:
http://hackage.haskell.org/cgi-bin/hackage-scripts/package/diagrams
примеры довольно хороши.
какая хорошая библиотека Haskell для создания изображений и рисования на них фигур?
У вас есть довольно много вариантов, на мой взгляд, все следующие использовались для игр :
Это наиболее распространенные, и вы можете просто выбрать их на основе особенностей / знакомства.
Диаграммы выглядят очень круто, но если вы хотите избежать фиксации и остаться суперлегковесным, вы можете генерировать 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