【发布时间】:2012-05-01 08:52:54
【问题描述】:
我有一个相当复杂的几何问题需要解决,我想知道是否有人可以指出资源来解决它。
我有一个由垂直和水平喜欢组成的不规则形状。它由一系列顺时针方向的 x,y 点描述,形成一条路径。最后一点连接到第一个点以形成形状的边界。没有一条线会相互交叉。当我在屏幕上绘制形状时,我使用沿 Y 轴的经典扫描线算法将形状变成一系列我填充的矩形。
但现在我希望用户能够通过使用水平线或垂直线再次绘制从边界上的一个点到边界上的另一点的路径,将形状分成两部分。在图中,用户从 1 开始绘制并最终在 2 处进行切片。
所以这里有一些我必须削减的东西的例子。使用用户绘制的红色切割路径将原始形状切割成部分 A 和 B。请注意,不能保证用户会以与我的区域相同的顺时针方向切割(即下面的 1 和 2 可以反转)所以我必须处理这个问题。
这条线将完全包含在边界形状内,不会与自身交叉。即,当我使用路径切割形状时,它将产生恰好 2 个新形状。
大声思考我认为这个伪代码可能是这样的:
- 将形状描述为一系列 x、y 点,编号为 0 到 N。N 连接到 0 以闭合形状。
- 允许用户绘制一条剪切路径,该路径在形状路径的某处开始和结束。用户界面可防止用户越过自己的线条或在形状之外绘图。
- 找出切割路径开始和结束的形状中的哪些线索引。线索引由点索引 0->1, 1->2, ... N-1->N, N->0 描述
- 为确保用户的剪切路径与形状的方向相同,如果出现以下情况,请反转其路径: a) 结束形状线索引
- 构造两个点列表。 a) lines >= end index and =开始和
- 从点列表创建新区域。
我认为这可能会奏效,但显然如果有实际的代码已经做到这一点会更容易!
【问题讨论】:
-
这还不够详细,无法真正成为答案,但 Java2D 有一些布尔形状操作,您可以查看 - 可以直接使用,也可以查看源代码以了解它们是如何做到的。 docs.oracle.com/javase/tutorial/2d/advanced/complexshapes.html
-
我只是将它标记为 android,因为我正在为此编写它:) 更具体地说,我正在为 OpenGL ES 编写代码,因此它也必须相当高效,即最小的对象分配以减少 GC。我可能不得不调整我曾经使用现有代码的任何代码,并重用数组列表和其他东西以减少分配。