使用 Cramer 规则查找线相交 - 获取不正确的 y 坐标
Finding line intersect using Cramer's rule - Getting incorrect y coordinate
我正在寻找使用 Cramer 规则找到 2 条线的交点。这是来自 Java 编程简介一书中的练习(第 3 章的练习 3.25 和第 8 章的练习 8.31。它们基本上是相同的想法,只是第 8 章中的那个使用数组)。
练习告诉我们使用 Cramer 规则并提供一般公式。
(y1 - y2)x - (x1 - x2)y = (y1 - y2)x1 - (x1 - x2)y1
(y3 - y4)x - (x3 - x4)y = (y3 - y4)x3 - (x3 - x4)y3
我的问题是我得到的 y 坐标是负数,而我期望它是正数。
这是我得到的输出。
The intersecting point is at (2.888888888888889, -1.1111111111111112)
这是我期望得到的。
The intersecting point is at (2.888888888888889, 1.1111111111111112)
这是我想出的代码。
public class Test{
public static void main(String[] args){
double[][] points = {{2, 2}, {5, -1.0}, {4.0, 2.0}, {-1.0, -2.0}};
double[] result = getIntersectingPoint(points);
if(result == null)
System.out.println("The 2 lines are parallel");
else
System.out.println("The intersecting point is at (" + result[0] + ", " + result[1] + ")");
}
/*
*For two lines to see if they intersect
*(y1 - y2)x - (x1 - x2)y = (y1 - y2)x1 - (x1 - x2)y1
*(y3 - y4)x - (x3 - x4)y = (y3 - y4)x3 - (x3 - x4)y3
*/
public static double[] getIntersectingPoint(double[][] points){
double[] result = new double[2];
double a = points[0][1] - points[1][1]; //y1 - y2;
double b = points[0][0] - points[1][0]; //x1 - x2;
double c = points[2][1] - points[3][1]; //y3 - y4;
double d = points[2][0] - points[3][0]; //x3 - x4;
double e = a * points[0][0] - b * points[0][1]; //(y1 - y2)x1 - (x1 - x2)y1
double f = c * points[2][0] - d * points[2][1]; //(y3 - y4)x3 - (x3 - x4)y3
double determinant = a * d - b * c;
//There is no solution to the equation,
//this shows the lines are parallel
if(determinant == 0)
return null;
//There is a solution to the equation
//this shows the lines intersect.
else{
result[0] = (e * d - b * f) / determinant;
result[1] = (a * f - e * c) / determinant;
}
return result;
}
}
我四处搜索并找到了一些通用的练习解决方案。但是我还没有找到关于我的负 y 坐标问题的任何信息。
这是相交线的图片
回答我自己的问题...
终于找到问题了。在函数 getIntersectingPoint
的末尾,我们有以下行。
result[0] = (e * d - b * f) / determinant;
这需要更改为以下内容。
result[0] = (b * f - e * d) / determinant;
我有一点辩护。我真的不明白 Cramer 的规则,我只是按照书上告诉我的去做。这本书显示了以下规则。 (这在第 1 章练习 1.13 中给出)。
ax + by = e
cx + dy = f
x = ed - bf / ad - bc
y = af - ec / ad - bc
鉴于此,我只是调整它以找到相交的线。
我正在寻找使用 Cramer 规则找到 2 条线的交点。这是来自 Java 编程简介一书中的练习(第 3 章的练习 3.25 和第 8 章的练习 8.31。它们基本上是相同的想法,只是第 8 章中的那个使用数组)。
练习告诉我们使用 Cramer 规则并提供一般公式。
(y1 - y2)x - (x1 - x2)y = (y1 - y2)x1 - (x1 - x2)y1
(y3 - y4)x - (x3 - x4)y = (y3 - y4)x3 - (x3 - x4)y3
我的问题是我得到的 y 坐标是负数,而我期望它是正数。
这是我得到的输出。
The intersecting point is at (2.888888888888889, -1.1111111111111112)
这是我期望得到的。
The intersecting point is at (2.888888888888889, 1.1111111111111112)
这是我想出的代码。
public class Test{
public static void main(String[] args){
double[][] points = {{2, 2}, {5, -1.0}, {4.0, 2.0}, {-1.0, -2.0}};
double[] result = getIntersectingPoint(points);
if(result == null)
System.out.println("The 2 lines are parallel");
else
System.out.println("The intersecting point is at (" + result[0] + ", " + result[1] + ")");
}
/*
*For two lines to see if they intersect
*(y1 - y2)x - (x1 - x2)y = (y1 - y2)x1 - (x1 - x2)y1
*(y3 - y4)x - (x3 - x4)y = (y3 - y4)x3 - (x3 - x4)y3
*/
public static double[] getIntersectingPoint(double[][] points){
double[] result = new double[2];
double a = points[0][1] - points[1][1]; //y1 - y2;
double b = points[0][0] - points[1][0]; //x1 - x2;
double c = points[2][1] - points[3][1]; //y3 - y4;
double d = points[2][0] - points[3][0]; //x3 - x4;
double e = a * points[0][0] - b * points[0][1]; //(y1 - y2)x1 - (x1 - x2)y1
double f = c * points[2][0] - d * points[2][1]; //(y3 - y4)x3 - (x3 - x4)y3
double determinant = a * d - b * c;
//There is no solution to the equation,
//this shows the lines are parallel
if(determinant == 0)
return null;
//There is a solution to the equation
//this shows the lines intersect.
else{
result[0] = (e * d - b * f) / determinant;
result[1] = (a * f - e * c) / determinant;
}
return result;
}
}
我四处搜索并找到了一些通用的练习解决方案。但是我还没有找到关于我的负 y 坐标问题的任何信息。
这是相交线的图片
回答我自己的问题...
终于找到问题了。在函数 getIntersectingPoint
的末尾,我们有以下行。
result[0] = (e * d - b * f) / determinant;
这需要更改为以下内容。
result[0] = (b * f - e * d) / determinant;
我有一点辩护。我真的不明白 Cramer 的规则,我只是按照书上告诉我的去做。这本书显示了以下规则。 (这在第 1 章练习 1.13 中给出)。
ax + by = e
cx + dy = f
x = ed - bf / ad - bc
y = af - ec / ad - bc
鉴于此,我只是调整它以找到相交的线。