2011-05-12 60 views
3

非常简单的问题。 如何用Java中绘制的线实现碰撞检测?只是线条。没有矩形,圆圈或图像,位图..只是线条。java中2行碰撞检测(Android)

顺便说一句,这些线不直。它们是由代表玩家运动的数百条非常小的线条(他们在移动时的gps坐标)构成的,所以随着玩家的移动,它们在整个地方流连。所有线都连接在一起。一行的结束点是下一行的开始点等等。在这方面这是一条不间断的路线。没有差距。

我试着在数组中存储行的开始点的x,y值,然后遍历这个数组来确定点是否曾经被访问过。如果玩家再次访问确切的坐标,这很好,但是如果他在这些记录点之间的中间位置呢?

这是问题的背景,如果有帮助。但主要问题是我的焦点在这里。 如何实现Java中线条的碰撞检测?

+0

[本维基百科文章](http://en.wikipedia.org/wiki/Line_segment_intersection)可能会有用。 – 2011-05-12 12:17:24

回答

0

从我所知道的你正在以正确的方式做到这一点。我会建议可能通过坐标位置散列线,所以有更少的线检查。如果估计较大的直线(由平均较小的线组成)并用于检查,您也可以减少检查次数。

0

如果我理解正确,你的问题不是严格的线交集(它可以很容易地在网上找到),但如何处理它们的数百个?

也许你应该考虑数据的空间结构来限制计算。例如,请看“quadtree”。

您只会在所有坐标的子集上测试交点。

0

你称之为一条线,你可以称之为List<Line2D>--直线段的列表。如果你有List<Line2D> aList<Line2D> b,那么你想比较a中的每一行和b中的每一行。我假设你可以看到如何找到两条直线段的交叉点 - 或者Line2D甚至可以是do this for you。例如:

for(Line2D line1 : a) { 
    for(Line2D line2 : b) { 
     if(a.intersectsLine(b)) { 
     return true; 
     } 
    } 
} 
return false; 

现在这段代码不会很快,但速度可能会很快。如果速度太慢,那么你将不得不寻找优化 - 这可以通过多种方式完成,四叉树或一维排序是两个明显的简单步骤。

+0

不需要很快。想想我会看看四树的方法,就像Rockeye一样,尽管如此,你自己也有建议。 – Finn 2011-05-12 14:27:04

+0

我只是看着Line2D类..似乎不是Android兼容。抱歉。我有点小菜。我只有java.awt.font。*; java.awt中没有其他内容。我通过在eclipse中编写import语句发现了这一点,并让自动完成功能向我显示可以导入哪些类。我在eclipse中运行android,以防万一。 – Finn 2011-05-12 17:09:31

+0

对不起,我不应该发布它作为一个Java问题。这是android。 – Finn 2011-05-12 17:22:46