美好的一天程序员,
我在JavaFX中编写一个图形应用程序,要求我使用简单的2D光线跟踪来查看在我用于光线追踪的行的起点和终点之间是否有某个对象。
我已经实现了一种有效的方法,但是我不确定它是否是一个好的编程,因为它在到达终点的过程中(或多或少)遍历每个像素并检查是否有物体。
public boolean hasLineOfSight()
{
boolean sight = true;
List<Block> blocks = level.getBlocks();
for (Block b : blocks)
{
if (b instanceof SolidBlock)
{
double length = Utility.getLengthOfLine(lineOfSight);
double dir = Math.atan2(lineOfSight.getEndY() - lineOfSight.getStartY(), lineOfSight.getEndX() - lineOfSight.getStartX());
System.out.println(length);
// DURCHLÄUFT DIE GESAMTE LINIE UND PRÜFT JEDEN ZWEITEN PUNKT
// AUF EINEN SOLIDEN BLOCK
for (int i = 0; i <= length / 2; i++)
{
if (level.getSolidBlock((int) (lineOfSight.getStartX() + 2 * i * Math.cos(dir)), (int) (lineOfSight.getStartY() + 2 * i * Math.sin(dir))) != level.nullBlock)
{
sight = false;
}
}
}
}
return sight;
}
上述方法仅测试SolidBlocks。 line lineOfSight是Enemy对象和Player对象之间的线,并且始终正确更新。 double dir是该行的角度,因此我可以根据角度进行迭代来检查很多坐标。 基本上,for-loop的作用是检查每个〜第二个像素(我也可以遍历每个像素,这会更精确,但会花费更多的性能)。
到目前为止,这段代码有效,但由于我的申请要求我使用光线追踪,因为我从未使用过光线追踪(我也没有找到关于这个主题的大量具体信息),我想要询问我对这个问题的理解是否正确以及是否有更好的方法来做到这一点。
提前致谢。