Haskell 如何通过集合操作组合形状?

Haskell 如何通过集合操作组合形状?,haskell,haskell-diagrams,Haskell,Haskell Diagrams,我想从另一个形状中减去一个形状,然后将得到的形状与另一个形状相结合。在我的例子中,一个正方形将被剪成两半,而被剪下的版本将向右延伸半个圆。 因此,我通过difference将一个正方形从另一个正方形中减去,并假设重叠区域正好合并,将整个圆进行并集。 我在考虑集合运算,其中({1,2,3,4}/{3,4})U{2,3}等于{1,2,3},但在我的实现中它等于{1,3}: import Diagrams.Backend.SVG.CmdLine {-# LANGUAGE NoMonomorphism

我想从另一个形状中减去一个形状,然后将得到的形状与另一个形状相结合。在我的例子中,一个正方形将被剪成两半,而被剪下的版本将向右延伸半个圆。 因此,我通过
difference
将一个正方形从另一个正方形中减去,并假设重叠区域正好合并,将整个圆进行
并集。
我在考虑集合运算,其中
({1,2,3,4}/{3,4})U{2,3}
等于
{1,2,3}
,但在我的实现中它等于
{1,3}

import Diagrams.Backend.SVG.CmdLine

{-# LANGUAGE NoMonomorphismRestriction #-}
{-# LANGUAGE FlexibleContexts          #-}
{-# LANGUAGE TypeFamilies              #-}

import Diagrams.Prelude
import qualified Diagrams.TwoD.Path.Boolean as B

main = mainWith (combination # fc red # bgFrame 0.1 white)
  where
    combination :: QDiagram B V2 Double Any
    combination = strokePath plusCircle
    shorterSquare = B.difference Winding (square 2) (square 2 # translateX 1)

    plusCircle = B.union Winding (circle 1 <> shorterSquare)
import Diagrams.Backend.SVG.CmdLine
{-#语言诺模同构限制#-}
{-#语言灵活语境#-}
{-#语言类型族{-}
导入图表。序曲
将限定图.TwoD.Path.Boolean作为B导入
main=main与(组合#fc红色#bgFrame 0.1白色)
哪里
组合::QDiagram B V2双任意
组合=冲程路径加循环
shorterSquare=B.差分绕组(平方2)(平方2#平移1)
plusCircle=B.活接头绕组(圆1短正方形)
但我明白了:
这不是我想要的,我想要半圆与矩形合并,结果只填充红色,内部没有线条。

我不是图表专家,但看起来你是在组合笔划路径,而不是它们所代表的形状。对于重叠笔划路径的缠绕填充规则的行为,有一些有趣的事情要说,这似乎与解释为什么会得到这样的结果有关


相反,我建议使用中的技术,例如
top
,来组合完成的形状。

这种
B.difference
的特殊用法会反转
短正方形路径的方向,因此您需要:

由于这是相当微妙的,值得花一点时间来描述我是如何诊断它的。首先,这种填充规则的古怪感觉很像是由路径(或面等)方向引起的问题。第二,将
shorterSquare
重新定义为

shorterSquare = square 2 # scaleX 0.5 # translateX 0.5
。。。给出了预期的结果。这意味着问题与
B.difference
shorterSquare
的定义有关,而不是与
B.union
有关。可通过以下方式获得确认:


我相信OP的代码是好的,除了我在回答中讨论的微妙细节(事实上,如此微妙,以至于我想知道
B.difference
是否真的要这样工作)。是的,我将这称为
B.difference
中的错误。这不是我们第一次在布尔路径操作中遇到这样的问题。是相关的。@BrentYorgey很高兴知道这是一个已知的问题。谢谢你的来电。
shorterSquare = square 2 # scaleX 0.5 # translateX 0.5
GHCi> -- Counterclockwise.
GHCi> pathVertices $ square 2 # scaleX 0.5 # translateX 0.5
[[P (V2 1.0 (-1.0)),P (V2 0.9999999999999999 1.0),P (V2 (-1.1102230246251565e-16) 1.0),P (V2 (-2.220446049250313e-16) (-1.0))]]
GHCi> -- Clockwise.
GHCi> pathVertices $ B.difference Winding (square 2) (square 2 # translateX 1)
[[P (V2 (-1.0) 1.0),P (V2 0.0 1.0),P (V2 0.0 (-1.0)),P (V2 (-1.0) (-1.0))]]