使用haskell图绘制给定坐标的点和线

时间:2016-02-15 15:54:52

标签: haskell svg graph haskell-diagrams

我有一个带有绝对x和y坐标的点列表:

points :: [(1,1), (2,2), (3,3), (-105, -42.42)]

一个边缘列表作为点元组:

edges :: [((1,1), (2,2)), ((1,1),(-105, -42.42)), ((3,3), (-105, -42.42))]

我现在想要使用diagrams包来绘制它,使用圆圈表示节点,使用边线表示线条。我找到了应该提供此功能的类型Located。另一方面,有atPoints函数,但它们似乎没有达到相同的效果(atPoints只移动本地原点)。

实现这一目标的实际方法是什么?如何使用Located类型?

1 个答案:

答案 0 :(得分:2)

您可以使用moveTo,将某些对象移动到绝对指定的位置。要在绝对定义的顶点之间绘制边,可以使用fromVertices。请注意,两者都不接受元组作为参数,但points - 但它很容易to convert to these

> :m +Diagrams.Prelude Graphics.Dynamic.Plot.R2
> plotWindow $ (shapePlot <$> [circle 1 & moveTo (p2 p) | p<-points]
                           ++ [fromVertices [p2 p, p2 q] | (p,q)<-edges]) 
            ++ [dynamicAxes]

Auto-coloured view with dynamic axes

要将这些元素组合到单个图表中,您只需使用monoid实例,即mconcat列表。

plotWindow [shapePlot . mconcat $ [circle 1 & fcA transparent & moveTo (p2 p) | p<-points] ++ [fromVertices [p2 p, p2 q] | (p,q)<-edges]]

Flat combined view