已关闭,此问题需要更focused。目前不接受答复。
**想改善这个问题吗?**更新问题,使其仅通过editing this post关注一个问题。
3天前关闭。
Improve this question
这是我的要求。它基本上是一个橡皮擦概念。我有n
边的多边形。所有行的(x,y)
存储在模型中。要擦除多边形中的任何部分,用户可以在多边形上绘制线,如果线完全在徒手绘制的覆盖范围内,则必须突出显示特定的线,然后可以擦除。
上下文绘制用于绘制多边形和橡皮擦。根据模型中的线数据,绘制多边形。当用户在橡皮擦模式下绘制时,它以浅蓝色的较大线宽描边。当图形完全覆盖多边形中的任何线时,该线可以用深蓝色高亮显示,表示选择。
问题是,我不能确定这条线是否完全覆盖了橡皮擦。因为我只有一条线的起点和终点,所以很难确定它。当用户在橡皮擦模式下绘制时,什么是可靠的方法来识别线条?
编辑尝试为评论
中的问题提供答案
对于第一个问题,底部直线必须被识别并删除,因为它被完全覆盖。为了回答第二种情况,不会选择/识别任何红线。要回答第三个问题,必须选择完全在蓝色笔划覆盖范围内的所有线-以绿色突出显示。
1条答案
按热度按时间5f0d552i1#
我猜你想要这样的东西:
我将完全“擦除”的线变成虚线,而不是完全删除它们。
**如果您的部署目标至少是iOS 16,**那么您可以使用
lineSubtracting
method ofCGPath
来完成“繁重的工作”。Apple还没有在网站上提供这种方法的真实的文档,但头文件描述如下:
返回一个新路径,其中包含一条来自此路径的线,该线不与给定路径的填充区域重叠。
other
内部的规则。如果未指定,则默认为CGPathFillRule.winding
规则。所得路径的线是此路径的不与
other
的填充区域重叠的线。裁剪的相交子路径创建开放子路径。与
other
不相交的闭合子路径保持闭合状态。所以,我们的策略是:
CGPath
。CGPath
。lineSubtracting
,经过描边擦除路径,以获得仅包含直线段中未被擦除器覆盖的部分的路径。lineSubtracting
返回的路径为空,则直线已被完全擦除。我们来试试首先,我将编写一个模型类型来存储原始路径和擦除后保留的路径部分:
让我们添加两个额外的初始化器,以及一个通过减去一个(描边的)橡皮擦路径来更新
remaining
路径的方法:我将使用以下函数将一个点数组转换为一个
ErasablePath
s数组:以下是玩具应用程序的完整数据模型:
为了在用户与应用交互时更新模型,我需要一些方法来响应用户开始、移动和结束触摸,以及一种重置数据模型的方法:
我们需要一个视图来绘制可擦除路径和擦除路径。我会用绿色绘制每个原始可擦除路径,如果它已被完全擦除,则绘制虚线。我将用红色绘制每条可擦除路径的剩余(未擦除)部分。我会用半透明的紫色画出描边的橡皮擦路径。
在我的
ContentView
中,我将在绘图视图中添加一个DragGesture
,并显示一个重置按钮:这是我用来生成答案顶部动画的代码。但我承认那是个被操纵的演示。
lineSubtracting
方法有一点bug,我小心地避免触发bug。下面是bug:如果
ErasablePath
是一条水平线段,而擦除器路径从该段下方开始,则lineSubtracting
将删除整个可擦除路径,即使擦除器路径和线段没有重叠!为了解决这个bug,我将以下
init
方法插入到Model
中:橡皮擦路径总是从可擦除路径的上方开始,因此它不再触发错误: