Java 如何在android中检测两条路径是否相交?

Java 如何在android中检测两条路径是否相交?,java,android,line,collision,intersection,Java,Android,Line,Collision,Intersection,我正在制作一个小应用程序,用户可以在点之间绘制路径,或者在屏幕上绘制路径。我创建路径坐标的数组列表,然后尝试一次比较四个点,看看它们是否与已经绘制的路径相交。现在,它没有检测到任何碰撞。以下是我迄今为止的一些代码: //ArrayList of the currentPath that is being drawn ArrayList<float[]> currentPath = new ArrayList<>(); //ArrayList of Paths that h

我正在制作一个小应用程序,用户可以在点之间绘制路径,或者在屏幕上绘制路径。我创建路径坐标的数组列表,然后尝试一次比较四个点,看看它们是否与已经绘制的路径相交。现在,它没有检测到任何碰撞。以下是我迄今为止的一些代码:

//ArrayList of the currentPath that is being drawn
ArrayList<float[]> currentPath = new ArrayList<>();
//ArrayList of Paths that have been drawn so far
private ArrayList <ArrayList<float[]>> paths = new ArrayList<>();

public boolean checkPath() {
        if (paths.size() == 0) {
        return true;
    } else {
        boolean noCollisions = true;
        for (int i = 0; i < paths.size(); i++) {             //Loop through path array to compare each path
            for (int j = 0; j < paths.get(i).size() - 1; j++) {  //Loop through each path to compare points
                for (int k = 0; k < currentPath.size() - 1; k++) {
                    float end1Y = currentPath.get(k + 1)[1];
                    float start1Y = currentPath.get(k)[1];
                    float start1X = currentPath.get(k)[0];
                    float end1X = currentPath.get(k + 1)[0];

                    float end2Y = paths.get(i).get(j + 1)[1];
                    float start2Y = paths.get(i).get(j)[1];
                    float start2X = paths.get(i).get(j)[0];
                    float end2X = paths.get(i).get(j + 1)[0];

                    double A1 = end1Y - start1Y;
                    double B1 = start1X - end1X;
                    double C1 = A1 * start1X + B1 + start1Y;

                    double A2 = end2Y - start2Y;
                    double B2 = start2X - end2X;
                    double C2 = A2 * start2X + B2 * start2Y;

                    double det = (A1 * B2) - (A2 * B1);
                    if (det == 0) {
                        //Lines are either parallel, are collinear or overlapping partially
                        if ((A1 * start2X) + (B1 * start2Y) == C1) {
                            //they are the on the same line, check if they are in the same space
                            if ((Math.min(start1X, end1X) < start2X) && (Math.max(start1X, end1X) > start2X)) {
                                noCollisions = false;
                            }
                            //one end point is okay, now checking the other
                            if ((Math.min(start1X, end1X) < end2X) && (Math.max(start1X, end1X) > end2X)) {
                                noCollisions = false;
                            } else{
                                noCollisions = true;
                            }
                        }
                    } else {
                        //Lines intersect somewhere, but do the segments intersect?
                        double x = (B2 * C1 - B1 * C2) / det;
                        double y = (A1 * C2 - A2 * C1) / det;

                        //check to see if the intersection is within the bounding box of the segments.
                        if((x > Math.min(start1X, end1X) && x < Math.max(start1X, end1X)) && (y > Math.min(start1Y, end1Y) && y < Math.max(start1Y, end1Y))){
                            //We are within the bounding box of the first line segment, now check the second
                            if((x > Math.min(start2X, end2X) && x < Math.max(start2X, end2X)) && (y > Math.min(start2Y, end2Y) && y < Math.max(start2Y, end2Y))){
                                //the segments intersect
                                noCollisions = false;
                            }
                        } else {
                            noCollisions = true;
                        }
                    }

                }
            }
        }
        return noCollisions;
    }
}
//正在绘制的当前路径的ArrayList
ArrayList currentPath=新的ArrayList();
//到目前为止已绘制的路径列表
私有ArrayList路径=新ArrayList();
公共布尔校验路径(){
if(path.size()==0){
返回true;
}否则{
布尔noCollisions=true;
对于(int i=0;istart2X)){
无合并=错误;
}
//一个端点没问题,现在检查另一个端点
如果((数学最小值(开始1x,结束1x)<结束2x)和&(数学最大值(开始1x,结束1x)>结束2x)){
无合并=错误;
}否则{
无合并=正确;
}
}
}否则{
//直线在某处相交,但线段是否相交?
双x=(B2*C1-B1*C2)/det;
双y=(A1*C2-A2*C1)/det;
//检查交点是否在线段的边界框内。
如果((x>Math.min(start1X,end1X)和&xMath.min(start1Y,end1Y)和&yMath.min(start2X,end2X)和&xMath.min(start2Y,end2Y)和&y

我试着用矩阵和行列式来判断是否存在交集

请尝试替换下一行

double C1 = A1 * start1X + B1 + start1Y;
按以下路线

double C1 = A1 * start1X + B1 * start1Y;

请尝试替换下一行

double C1 = A1 * start1X + B1 + start1Y;
按以下路线

double C1 = A1 * start1X + B1 * start1Y;
这不是更容易吗

Region region1, region2;
boolean intersect;

Region clip = new Region(0, 0, screenWidth, screenHeight);
region1.setPath(path1, clip);
region2.setPath(path2, clip);

if (!region1.quickReject(region2))
 intersect = true;
else intersect = false;
(我知道我迟到了)

这不容易吗

Region region1, region2;
boolean intersect;

Region clip = new Region(0, 0, screenWidth, screenHeight);
region1.setPath(path1, clip);
region2.setPath(path2, clip);

if (!region1.quickReject(region2))
 intersect = true;
else intersect = false;

(我知道我迟到了)

你应该先告诉我如何确定十字路口。然后给出代码,我通过求解当前路径和路径数组中每个过去路径的方程组来确定是否存在交点。我从当前路径中提取两个点,并将它们所形成的线与过去每条路径中的每一条线进行比较。在我看来,解方程组是一个太大的词。但是比较线片是可以的。请解释如何确定两条直线是否相交。请给出两个示例。第一个有两条不交叉的线。第二个可以。告诉我你的代码传递了什么。我在你的循环中没有看到一个break语句,以防你确定一条线的交叉。我想你可以停下来。请解释一下。你应该先告诉我如何确定十字路口。然后给出代码,我通过求解当前路径和路径数组中每个过去路径的方程组来确定是否存在交点。我从当前路径中提取两个点,并将它们所形成的线与过去每条路径中的每一条线进行比较。在我看来,解方程组是一个太大的词。但是比较线片是可以的。请解释如何确定两条直线是否相交。请给出两个示例。第一个有两条不交叉的线。第二个可以。告诉我你的代码传递了什么。我在你的循环中没有看到一个break语句,以防你确定一条线的交叉。我想你可以停下来。请解释一下。