如何计算折线大小

时间:2013-11-26 02:21:06

标签: haskell

我对haskell有疑问,因为我需要计算多边形大小的大小,基本上是给定线条的某些点的线条大小。

我来到这里:

type Points = (Float, Float) -- (x,y)
type Rectangle = (Points,Float,Float) -- (Top left corner., width,height)
type Triangulo = (Points,Points,Points)
type Poligonal = [Points]

distance :: Points -> Points -> Float
distance (a,b) (c,d) = sqrt (((c-a)^2) + ((b-d)^2))

poli :: Poligonal -> Float
poli [] = 0
poli ((a,b):(c,d):ys)= distance (a,b) (c,d) + poli ys

这样做,它会计算由点/点定义的所有线条的大小,但从不计算最终位置:

poli [(0.0,0.0),(1.1,1.0),(20.0,12.0)]
1.4866068

poli [(0.0,0.0),(1.1,1.0),(20.0,12.0),(2.0,3.0)]
21.611217

...

需要2分来给出线条大小

1 --------- 2 ---------- 3

它计算1-2,但不是2-3

我正在学习哈斯克尔,所以我希望你能指出我正确的方向。

为所有人欢呼

2 个答案:

答案 0 :(得分:1)

定义poli的另一种方法是:

poli :: Poligonal -> Float
poli [] = 0
poli (x:xs) = sum $ zipWith distance (x:xs) xs

我们使用zipWith将列表中的每个元素(除了最后一个)与其下一个元素配对,然后返回距离列表。然后我们对列表求和。

答案 1 :(得分:0)

这就是诀窍。

poli :: Poligonal -> Float
poli [] = 0
poli ((a,b):[]) = 0
poli ((a,b):(c,d):ys)= distance (a,b) (c,d) + poli ((c,d):ys)