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
我之前使用过HOpenGL,但问题是(据我所知)它无法渲染到文件,只能渲染到屏幕; 同样(据我所知),SDL和Wx似乎也是如此.不过,我会看看开罗.
出于某种原因,我无法回复此帖,所以我必须引用它.你对GL和SDL不正确,你可以制作一个离屏表面/缓冲区或渲染到纹理.这些图书馆并不需要这样的功能(并没有太大的意义要么),因为你可以通过在缓冲访问像素,写出来自己做自己很容易,即使你可以访问像素数据的屏幕缓冲区.
就在前几天,我向人们展示了如何使用Haskell SDL绑定:
http://hpaste.org/fastcgi/hpaste.fcgi/view?id=25047
使用可以写出.PNG文件的库,他们很可能会使用指向像素缓冲区的原始指针,您可以从SDL/GL获取或将其复制到库所需的格式.
我刚刚找到了一个可以输出.PNG文件的库DevIL的Haskell绑定.查看调用的函数writeImageFromPtr