Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java游戏光线投射:直线和矩形之间的最近交点_Java_Raycasting - Fatal编程技术网

Java游戏光线投射:直线和矩形之间的最近交点

Java游戏光线投射:直线和矩形之间的最近交点,java,raycasting,Java,Raycasting,我的游戏有问题。我想做的是画一条线,如果这条线与周围环境相交,它会计算出周围环境与玩家之间的最短距离,并放置一个红点(见图) 当我用一行代码运行我的程序时,它工作得很好,但是当我把代码行发送到周围的所有角落时,有些代码行会穿过周围的环境。 (抱歉英语不好) 附言。 直线:马里奥和周围点之间的直线 线条sur:描述边界或周围环境的线条 我正试着做这样的事情 有人知道这里出了什么问题吗 这是我的密码 public void Lighting(){ ListIter

我的游戏有问题。我想做的是画一条线,如果这条线与周围环境相交,它会计算出周围环境与玩家之间的最短距离,并放置一个红点(见图)

当我用一行代码运行我的程序时,它工作得很好,但是当我把代码行发送到周围的所有角落时,有些代码行会穿过周围的环境。 (抱歉英语不好)

附言。 直线:马里奥和周围点之间的直线 线条sur:描述边界或周围环境的线条 我正试着做这样的事情

有人知道这里出了什么问题吗

这是我的密码

public void Lighting(){
                ListIterator<Surroundings> surrounding = m.getSurrounding();
                Line.clear();
                LineSur.clear();
                Point.clear();
            rememDistance=1500;

            while (surrounding.hasNext() ){
                Surroundings rectangle = surrounding.next(); 
                Rectangle sur = new Rectangle((int) rectangle.grootte().getX(),(int) rectangle.grootte().getY()-13,(int) rectangle.grootte().getWidth(),(int) rectangle.grootte().getHeight());

                Line.add(new Lines((int) sur.getX()                 , (int) sur.getY()                  , (int) sur.getX()                 , (int) (sur.getY()+sur.getHeight())));
                Line.add(new Lines((int) sur.getX()                 , (int) sur.getY()                  , (int) (sur.getX()+sur.getWidth()), (int) sur.getY()));
                Line.add(new Lines((int) (sur.getX()+sur.getWidth()), (int) (sur.getY()+sur.getHeight()), (int) (sur.getX()+sur.getWidth()), (int) sur.getY()));
                Line.add(new Lines((int) (sur.getX()+sur.getWidth()), (int) (sur.getY()+sur.getHeight()), (int) sur.getX()                 , (int) (sur.getY()+sur.getHeight())));

                LineSur.add(new LinesSur((int) m.player.getxPositie(), (int) m.player.getyPositie(), (int) sur.getX()                 , (int) sur.getY()));
                LineSur.add(new LinesSur((int) m.player.getxPositie(), (int) m.player.getyPositie(), (int) (sur.getX()+sur.getWidth()), (int) sur.getY()));
                LineSur.add(new LinesSur((int) m.player.getxPositie(), (int) m.player.getyPositie(), (int) sur.getX()                 , (int) (sur.getY()+sur.getHeight())));
                LineSur.add(new LinesSur((int) m.player.getxPositie(), (int) m.player.getyPositie(), (int) (sur.getX()+sur.getWidth()), (int) (sur.getY()+sur.getHeight())));
            }

//Problem is probably coming from these for loops
                int distance=0;

                for(int i=0;i < LineSur.size();i++){
                    for(int j=0;j < Line.size();j++){
                        Line2D.Double lineI = LineSur.get(i).points();

                        if(lineI.intersectsLine(Line.get(j).points())){
                            Point2D IntPoint = getIntersection(Line.get(j).points(),lineI);
                            Point.add(new Points((int) IntPoint.getX(),(int) IntPoint.getY()));


                            distance = (int) Point.get(Point.size()-1).point2D().distance(m.player.getxPositie(), m.player.getyPositie());

                            if(rememDistance > distance){
                                rememDistance = distance;
                                System.out.println(rememDistance);
                                Point.get(Point.size()-1).distance= rememDistance;
                            }
                            else{Point.remove((Point.size()-1));}

                        }
                    }
                    for(int k=0;k < Point.size();k++){
                        if(rememDistance == Point.get(k).distance){
                            Point.get(k).shortest=true;}
                    }
                    rememDistance = 1500;
                }


                for(int i=0;i < Point.size();i++){
                    if(Point.get(i).shortest==false){Point.remove(i);}
                }

    }

您正在尝试执行光线投射。如果您的代码没有检测到第一个找到的元素,那是因为冲突检测中出现了一些错误:要么周围环境太小,无法执行检测步骤,要么您有一些更严重的错误。
rectangle.grootte().getY()-13
13有什么意义?@AndyTurner是以前错误的一个快速修复程序,仍然需要修复那个好的调用,但它没有什么特别之处。所有红点都位于矩形上的事实意味着相交逻辑是正确的;它只是检测到最短的距离,而不是最短的距离。我不确定,但我认为for loop over
k
应该在当前包含它的循环之外。@and yturner它需要在那里,因为来自mario的每一行都需要一个红点。您正在尝试执行光线投射。如果您的代码没有检测到第一个找到的元素,那是因为冲突检测中出现了一些错误:要么周围环境太小,无法执行检测步骤,要么您有一些更严重的错误。
rectangle.grootte().getY()-13
13有什么意义?@AndyTurner是以前错误的一个快速修复程序,仍然需要修复那个好的调用,但它没有什么特别之处。所有红点都位于矩形上的事实意味着相交逻辑是正确的;它只是检测到最短的距离,而不是最短的距离。我不确定,但我认为for循环over
k
应该在当前包含它的循环之外。@而yturner它需要在那里,因为来自mario的每一行都需要一个红点。
public Point2D getIntersection(final Line2D.Double line1, final Line2D.Double line2){
        final double x1,y1, x2,y2, x3,y3, x4,y4;
        x1 = line1.x1; y1 = line1.y1; x2 = line1.x2; y2 = line1.y2;
        x3 = line2.x1; y3 = line2.y1; x4 = line2.x2; y4 = line2.y2;

        final double x = ((x2 - x1)*(x3*y4 - x4*y3) - (x4 - x3)*(x1*y2 - x2*y1)) /((x1 - x2)*(y3 - y4) - (y1 - y2)*(x3 - x4));
        final double y = ((y3 - y4)*(x1*y2 - x2*y1) - (y1 - y2)*(x3*y4 - x4*y3)) /((x1 - x2)*(y3 - y4) - (y1 - y2)*(x3 - x4));

        return new Point2D.Double(x, y);
    }