如何沿路径将不规则形状切割成两部分?

时间:2012-05-01 08:52:54

标签: java android geometry

我有一个相当复杂的几何问题我需要解决,我想知道是否有人能指出我的资源来解决它。

我有一个由垂直和水平喜欢组成的不规则形状。它由一系列x,y点顺时针方向描述以形成路径。最后一个点连接到第一个点以形成形状的边界。没有一条线相互交叉。当我在屏幕上绘制形状时,我沿着Y轴使用经典扫描线算法将形状转换为我填写的一系列矩形。

但是现在我希望用户能够通过使用水平或垂直线再次绘制从边界上的一个点到边界上的另一个点的路径将形状切成两部分。在图中,用户从1开始绘制,最后在2处进行切片。

所以这里有几个我要削减的事情的例子。使用用户绘制的红色显示的切割路径将原始形状切割成A部分和B部分。请注意,不能保证用户将按照我的区域顺时针方向切割(即下面的1和2可以反转),所以我必须处理它。

Example shapes with paths

该线条将完全包含在边界形状内,并且不会越过自身。也就是说,当我用路径切割形状时,它将产生恰好2个新形状。

大声思考我认为伪代码可能是这样的:

  1. 将形状描述为一系列x,y点,编号为0到N. N连接到0以关闭形状。
  2. 允许用户绘制切割路径,该切割路径在形状路径的某处开始和结束。用户界面可防止用户越过自己的线条或在形状之外绘图。
  3. 计算切割路径开始和结束的形状中的哪些线索引。线索引由点索引0-> 1,1-> 2,... N-1-> N,N-> 0
  4. 描述。
  5. 要确保用户的剪切路径与形状的方向相同,请在以下情况下反转其路径: a)末端形状线索引<开始形状线索引 b)OR形状终点索引==形状起始线索引但终点切割点更接近线索引起点
  6. 构建两个点列表。 a)行> =结束索引和< =开始索引+剪切路径,修剪切割点处的开始/结束行 b)切割路径+线> =开始和< =结束索引,修剪切割点处的起点/终点线
  7. 从点列表创建新区域。
  8. 我认为这可能有用,但显然如果有实际的代码已经这样做会更容易!

1 个答案:

答案 0 :(得分:1)

我不知道那里的代码已经完成了工作。

你实际上需要为两个新形状中的一个反转切割路径,而不是另一个形状反转。 (如果你所说的所有顺时针方向的形状都是正确的话。)我认为最简单的方法是看看你想要为每个形状采用哪条路径:(1)从UI交互中你会知道在哪里切割路径的形状; (2a)从切割路径的一端开始,顺时针走动形状直到你撞到另一端,然后沿着切割路径回到第一端,给你一个形状; (2b)现在从原始端开始,沿着另一个方向的切割路径,顺时针绕着形状走,直到你回到原始的切割路径端点,给你另一个形状。

除此之外,你的伪代码看起来还不错。