2015-12-19 50 views
0

我正在制作自己的游戏中使用raycaster,并且遇到了一个非常棘手的问题。我有一个球员(黑点),我需要找到最靠近的路口。在下图中,箭头指向我需要的交点。Java最近的交叉点

Nearest Intersection Example

我想我想说的是,我需要一个功能是这样的:

// Each line would take in 2 map values for it's 2 points 
// In turn, the map would have to have an even number of points 

public Point getNearestIntersection(int playerX, int playerY, int lineDir, Point[] map) { 
    // whatever goes here 
} 

我将不得不这样做的每一帧约50倍,约100行。如果可能的话,我希望至少得到40 fps ...即使我将它分成线程,我仍然认为这会导致很多滞后。

+0

计算交叉点的问题或哪一个最近? – Fildor

+0

@Fildor哪一个最近 – mooncat39

+0

我建议使用库。 Jbox2d非常好,它支持所谓的子弹物理学,这是我认为你正在寻找。 – bigcodeszzer

回答

2

Point有一个方法称为distance计算两点的距离。然后,您可以循环所有点以获得最近距离。可能是这样的:

Point currentNearestIntersection; 
double smallestDistance; 

for (Point inter : intersections) { 
    double distance = player.distance(inter); 
    if (distance < smallestDistance) { 
     currentNearestIntersection= inter; 
     smallestDistance = distance; 
    } 
} 
+0

我需要对它渲染的每一帧进行50次左右的操作,并且我认为这会导致大量的延迟。虽然我担心这可能是我唯一的选择... – mooncat39

+0

没关系,我只是将该信息添加到原始问题。 – mooncat39

0

线/交叉线是在现实中解决:

p(t)=p0+dp*t 
q(u)=q0+(q1-q0)*u 
p(t)=q(u) 
t=? u=? 

其中:

  • p0是您的射线起点(矢量)
  • dp是射线方向(矢量)
  • q0,q1是线端点(载体)
  • p(t),q(u)是在轴线上的点,线
  • t,u是线参数(标量)

这是第2个线性方程的简单的系统(但在矢量),所以它导致到N的解决方案,其中N是问题的维度因此选择由零一个不是分裂......有效的结果是,如果:

  • t>=0u=<0.0,1.0>

如果使用单元dp矢量为您的射线的方向,然后由计算轴的交叉和一线t参数是直接从射线起点的距离。所以,你可以直接使用...

如果您需要加快交叉计算见

代替remebering所有路口店始终是一个具有最小的,但不与负面t ...

[注意事项]

,如果你有一些线路的电网,那么你可以计算,即使利用更快DDA 算法并使用实线/交叉线只为iregular休息...很好的例子这是Wolfenstein伪3D raycaster问题,如this