2

我想从另一个形状中减去一个形状,然后将得到的形状与另一个形状结合起来。在我的示例中,一个正方形将被剪成两半,而剪裁后的版本将向右延伸半个圆。所以我从另一个过孔中减去一个正方形,difference并用整个圆圈制作一个union,假设重叠区域只会合并。我正在考虑设置操作,其中 ({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)

但我明白了:在此处输入图像描述 这不是我想要的,我希望半圆与矩形合并,结果被填充为红色,内部没有线条。

4

2 回答 2

4

这种特殊用法会B.difference反转shorterSquare路径的方向,因此您需要重新反转它

shorterSquare = B.difference Winding (square 2) (square 2 # translateX 1)
    # reversePath

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

shorterSquare = square 2 # scaleX 0.5 # translateX 0.5

...给出预期的结果。这意味着问题与B.difference和 的定义有关shorterSquare,而不是与B.union。可以通过以下方式获得确认pathVertices

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))]]
于 2019-05-23T01:26:46.540 回答
1

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

相反,我建议使用组合图表中的技术,例如atop,组合完整的形状。

于 2019-05-23T00:24:16.020 回答