多边形“修复”算法

时间:2013-04-18 14:53:43

标签: java

我给你带来一个复杂的问题,我很乐意帮助你。请允许我直截了当地说明:

我想要一种算法或逻辑,其中我使用我的鼠标(例如正方形)绘制一个形状,它变成一个完美的正方形,所有4个边都是直线并且非常规则。一个人性化的广场并不完美,但我希望在经过这个算法的“过滤器”后,它就变成了这样。

我想要的一个很好的例子是游戏Trine,其中向导按照类似的原则工作:你在屏幕上绘制一个形状,它变成最接近的形状,也就是说,如果你绘制类似于正方形的东西它变成了一个完美的方形盒子,但如果你绘制一个三角形,它就会变成一个完美的三角形盒它就像它检测出它是什么样的形状然后绘制出更好的版本。

我想要这个游戏,只是让你知道这一切的目标是什么。

请帮我弄清楚这背后的算法或逻辑,或者至少告诉我这种行为的名称是什么(:

P.S。我添加了一个简单的图像,因此我更清楚我想要什么=)

3 个答案:

答案 0 :(得分:2)

如果我必须执行此任务,我会存储可识别的模式,并尝试匹配它们。

从用户绘制的点获取minX,maxX,minY,maxY值,这将有助于缩放模式。选择缩放比例,使图案的纵横比为X和Y纵横比的平均值。

图案可以包含一定数量的直线。如果

,模式匹配
  • 没有超出阈值的点数
  • 模式
  • 中的每个关键点附近至少有一个用户绘制的点

如果模式匹配,您将获得模式的关键点(计算模式的中心和大小/宽高比)。然后,您可以用图像替换用户绘制的点 - 这可能与用于匹配的图案完全不同(想象一个圆圈)。

答案 1 :(得分:0)

有很多方法可以做到这一点。你可以做到的一种方法是创建一个识别这些形状的神经网络。我将生成具有随机扰动的圆形,正方形,线条和三角形的变体,以复制“手绘”版本。然后,您可能希望将其表示为二维数组(其中已绘制的位置为1,未绘制的位置将包含0)。然后,您可以将此二维数组转换为n x n元素的输入向量。神经网络的输出将是具有四个元素的向量,每个元素表示线,圆,正方形或三角形。然后,您将使用随机扰动的图像训练此神经网络,直到您最终得到一个神经网络,该神经网络识别输入时出现错误阈值以下的错误。这实际上非常类似于识别手写数字。

其他方式包括:

答案 2 :(得分:0)

你没有任意形状,你也有形状的路径。所以试试数角。确定代表角落的角度阈值。对于每个点,对下一个连续的x个点进行采样。测量前半部分和后半部分之间的角度。如果角度超过您的阈值,请将其视为一个角落。 (显然选择能够以最小误差给出最佳角度的点,而不仅仅是第一个超过阈值的角度。)标记角点的位置并绘制形状以匹配。

Ellipses& lines:如果没有检测到角度,请采样几段。测量方向。如果他们非常相似,那么排队。如果非常不同,那么椭圆。如果是椭圆形,找到边界框并在里面绘图。