需要haskell中的三角测量

o4tp2gmn  于 2022-11-14  发布在  其他
关注(0)|答案(2)|浏览(210)

我在Haskell(或者可以从Haskell调用)中寻找计算三角剖分(首选Delaunay三角剖分)的代码,或者寻找Voronoi图。
我已经检查了各种包,我发现与hackage,但他们似乎是旧的,并没有编译与目前的ghc(delaunay,三角测量)或没有很好的记录,我不能让他们编译(eidogg. hgeometry)。
我应该用什么?任何指点都将不胜感激!
我目前使用hgeometry

qs :: [Point 2 (RealNumber 5)]
qs = [Point2  0 0, Point2  1 1, Point2  0 2, Point2  2 2]

qsne = fromList qs   
t1 = delaunayTriangulation qsne

得到了我无法理解的错误:

Code/Lib/TryDelaunay.hs:65:28: error:
    • Couldn't match type ‘Point 2 (RealNumber 5)’
                     with ‘Point 2 r :+ p’
      Expected type: NonEmpty (Point 2 r :+ p)
        Actual type: NonEmpty (Point 2 (RealNumber 5))
    • In the first argument of ‘delaunayTriangulation’, namely ‘qsne’
      In the expression: delaunayTriangulation qsne
      In an equation for ‘t1’: t1 = delaunayTriangulation qsne
    • Relevant bindings include
        t1 :: Triangulation p r (bound at Code/Lib/TryDelaunay.hs:65:1)
gxwragnw

gxwragnw1#

:+只是一个“带注解的点”的类型。您可以将任何数据附加到每个点上,而不会影响三角测量。(您可以看到,这不会影响三角测量,因为类型变量p完全不受约束,即函数无法考虑这些值,它只能存储它们/从结果数据结构中引用它们。)
如果你不想添加任何注解......那么,你总是可以添加一个实际上不包含任何信息的注解,方法是写p :+ ()

fmap (:+()) qsne

以使其符合delauneyTriangulation

yqkkidmi

yqkkidmi2#

我在这里发布了完整的代码,希望它能帮助其他人。它列出了所有我认为必要的语言扩展和所需的导入(以及依赖项)。欢迎提出改进建议!
-- --模块:如何使用hgeometry中的三角剖分的示例

-- dependencies:
--  - hgeometry 
--   - hgeometry-combinatorial
--   - linear
-- all language extensions are explicitely in the file

-----------------------------------------------------------------------------
{-# LANGUAGE FlexibleContexts      #-}
{-# LANGUAGE FlexibleInstances     #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE ScopedTypeVariables   #-}
{-# LANGUAGE TypeFamilies          #-}
{-# LANGUAGE TypeSynonymInstances  #-}
{-# LANGUAGE OverloadedStrings     #-}
{-# LANGUAGE TypeApplications     #-}
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}

{-# OPTIONS_GHC -Wno-missing-signatures #-}

module Lib.TryDelaunay 
     where

import Data.Geometry ( Point(Point2) )  
import Algorithms.Geometry.DelaunayTriangulation.DivideAndConquer
    ( delaunayTriangulation )
import Data.Ext ( type (:+)(..) )
import Data.List.NonEmpty ( NonEmpty, fromList )
import Algorithms.Geometry.DelaunayTriangulation.Types (toPlanarSubdivision)

qs :: [Point 2 Float :+ Char]
qs = [(Point2  0 0) :+ 'a' , Point2  1.5 1.5 :+ 'b' , Point2  0 2  :+ 'c', Point2  2 0  :+ 'd']

-- qsne = fmap (:+()) $ fromList qs
qsne :: NonEmpty (Point 2 Float :+ Char)
qsne =  fromList qs

t1 = delaunayTriangulation qsne 
g1 = toPlanarSubdivision t1
-- NonEmpty.fromList [4, 5]
-- p2 :: Point 2 Int
mainDel1:: IO ()
mainDel1 = do 
    print.unwords  $ ["qs", show qs]
    print.unwords  $  ["t1", show t1]

相关问题