haskell - 如何通过集合操作组合形状?
问题描述
我想从另一个形状中减去一个形状,然后将得到的形状与另一个形状结合起来。在我的示例中,一个正方形将被剪成两半,而剪裁后的版本将向右延伸半个圆。所以我从另一个过孔中减去一个正方形,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)
解决方案
这种特殊用法会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))]]
推荐阅读
- keras - Keras multiply parallel layers' outputs with constrained weigths
- codenameone - 代号 一个用于附加/合并文件的 API
- python-3.x - 搜索相同的链接并返回第一个匹配项。- 蟒蛇BS4
- python - Python3 For循环遍历列表不会中断
- python - 有人可以帮我理解python中的字节数组,了解以下使用字节数组生成大整数的示例代码吗?
- javascript - 将js函数应用于aspx表单上面板中的所有输入
- mysql - SQL 将多行合并为一列
- unit-testing - 当我改变初始化 Mockito 的方式时,Junit 测试被破坏
- xamarin.forms - 无法在 CollectionView 上选择两次相同的项目
- node.js - 如何使用聚合从 mongodb 中的两个集合中查询?