如何检测精灵与用户生成的某种形状之间的碰撞?


9

如何检测精灵与用户生成的某种形状之间的碰撞。

例如。屏幕上有一些对象。用户握住手指并在对象周围绘制圆形(选择规则是在小精灵周围绘制圆形,但是绘制形状可以多种多样)。我需要检测选择了哪个对象,就像:

(演示图像): 最初发布为http://i52.tinypic.com/28h0t1g.png


您能否解释一下为什么在最后一个示例中选择蓝色而不选择红色?您是否也可以说明线路是否必须实际接触精灵?第三个示例未触摸红色框,但表示已选中。第五个示例非常相似,但未选择。您在寻找#3和#5之间有什么区别?
罗曼

Answers:


2

如果主要使用来自用户的线段(或带有控制点的贝塞尔曲线)绘制形状,则可以实现一种使用广泛的算法,称为Separating-Axis-Theorem。简而言之:如果存在一个轴(形状的单位矢量)不重叠(形状的投影值不会导致正差),则对象不重叠。我过去曾经使用过它,并且像魅力一样工作。



0
  • 创建一个与屏幕大小相同的缓冲区(或曲面位于您的形状)。在每个位置,它都包含布尔值是否存在子画面。然后,检查用户形状的所有“像素”是否在其位置是精灵(通过检查该布尔值)。另外,您可以在其中存储ID而不是布尔值来创建更多精灵。但这是1个精灵的情况。
  • 如果用户生成的形状可以由线条序列表示,则可以检查每条这样的线条是否与子图形交叉。由于精灵具有矩形形状,而用户形状是一条线,因此只需查找“线矩形交点” ...(分离轴算法是一种实现方式)

方法取决于您选择的数据结构是位图还是向量。

第一种方法可以处理任意复杂的形状,易于实现,但使用更多的内存。实际上,您可以通过使用压缩来减少内存开销,并通过使用分层数据结构(八叉树)来加快内存开销。

第二种方法,不是那么容易实现,而是使用更多的处理能力。

在每种情况下都应衡量是否重要。我会尝试做第一个,因为它更容易实现。祝好运。:)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.