Haskell的图像绘制库?

Ant*_*sky 23 graphics haskell image

我正在制作一个用于播放空间游戏的Haskell程序:我有一组"个人"玩囚徒困境的图表,但只有他们的近邻,并且复制了做得最好的人的策略.

我已达到了一个我需要画出世界形象的地步,这就是我遇到问题的地方.两种可能的几何形状很容易:如果人们每个都有四个或八个邻居,那么我将每个几何表示为一个填充的正方形(颜色对应于策略)并用这些对齐平面.但是,我也有一种情况,人们有六个邻居(六边形)或三个邻居(三角形).

那么我的问题是:什么是用于创建图像和在其上绘制形状的好Haskell库? 我更喜欢它创造PNG,但我并不难以置信.我最初使用的是Graphics.GD,但它只导出绑定到绘制点,线,弧,椭圆和非旋转矩形的函数,这对我的目的来说是不够的(除非我想逐个像素地绘制六边形*) .我考虑使用foreign import,但它证明有点麻烦(部分原因是多边形绘制函数需要一个gdPoint结构数组),并且鉴于我的要求可能会增长,使用in-Haskell解决方案并不具备与FFI相关(虽然如果推动推动,我愿意这样做).有什么建议?

*这也是一种选择,其实; 关于如何做到这一点的任何提示也会受到赞赏,尽管我认为图书馆会更容易.

编辑:非常感谢您的建议.不幸的是,我无法获得所有gtk2hs所需的库来构建,这排除了很多解决方案.出于各种原因,在我尝试了所有答案之后,未能安装多个库并发现其他人无法做我想要的事情,我最终决定只为libgd导出更多的FFI并使用它.

ja.*_*ja. 11

图表看起来很酷,但如果你想避免提交并保持超轻量级,你可以直接生成svg.从Conrad Barski偷窃 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 )
Run Code Online (Sandbox Code Playgroud)

运行t2并将文件加载到Firefox或其他支持svg的程序中.

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


snk*_*kid 6

我之前使用过HOpenGL,但问题是(据我所知)它无法渲染到文件,只能渲染到屏幕; 同样(据我所知),SDL和Wx似乎也是如此.不过,我会看看开罗.

出于某种原因,我无法回复此帖,所以我必须引用它.你对GL和SDL不正确,你可以制作一个离屏表面/缓冲区或渲染到纹理.这些图书馆并不需要这样的功能(并没有太大的意义要么),因为你可以通过在缓冲访问像素,写出来自己做自己很容易,即使你可以访问像素数据的屏幕缓冲区.

就在前几天,我向人们展示了如何使用Haskell SDL绑定:

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

使用可以写出.PNG文件的库,他们很可能会使用指向像素缓冲区的原始指针,您可以从SDL/GL获取或将其复制到库所需的格式.

我刚刚找到了一个可以输出.PNG文件的库DevILHaskell绑定.查看调用的函数writeImageFromPtr


luq*_*qui 5

如果你想生成PNG,开罗是一个不错的选择. 虽然我从未使用它,但是Wumpus看起来也很有希望.如果您只需要在屏幕上看到它,那么图形绘图组合器就是一个简单的OpenGL界面,可以在几行中完成您所需的操作(参见example.hs分发版).


Don*_*art 2

有什么好的 Haskell 库可以用来创建图像并在其上绘制形状?

你有很多选择,在我看来,以下都已用于游戏

这些是最常见的,您可以根据功能/熟悉程度进行选择。