浏览 18846 次
锁定老帖子 主题:求两直线的交点坐标
精华帖 (0) :: 良好帖 (0) :: 新手帖 (8) :: 隐藏帖 (9)
|
|
---|---|
作者 | 正文 |
发表时间:2009-08-01
问题很简单: 已知两条直线, 求它们的焦点坐标 我在Java2D的api里找了半天, 也没找到解决方案, 只能自己写 解决方式如下: 第一种: 自己照着直线方程y=kx+b硬推导... 我也就只记得直线方程了 //第一条直线 double x1 = 10, y1 = 20, x2 = 100, y2 = 200; double a = (y1 - y2) / (x1 - x2); double b = (x1 * y2 - x2 * y1) / (x1 - x2); System.out.println("求出该直线方程为: y=" + a + "x + " + b); //第二条 double x3 = 50, y3 = 20, x4 = 20, y4 = 100; double c = (y3 - y4) / (x3 - x4); double d = (x3 * y4 - x4 * y3) / (x3 - x4); System.out.println("求出该直线方程为: y=" + c + "x + " + d); double x = ((x1 - x2) * (x3 * y4 - x4 * y3) - (x3 - x4) * (x1 * y2 - x2 * y1)) / ((x3 - x4) * (y1 - y2) - (x1 - x2) * (y3 - y4)); double y = ((y1 - y2) * (x3 * y4 - x4 * y3) - (x1 * y2 - x2 * y1) * (y3 - y4)) / ((y1 - y2) * (x3 - x4) - (x1 - x2) * (y3 - y4)); System.out.println("他们的交点为: (" + x + "," + y + ")"); 第二种方法: 利用斜率公式, 直线方程为ax+bx+c=0, 先求出a,b,c, 然后再求出交点 public static void main(String[] args) { Point2D p1 = new Point2D.Double(10, 20); Point2D p2 = new Point2D.Double(100, 200); Point2D p3 = new Point2D.Double(50, 20); Point2D p4 = new Point2D.Double(20, 100); Param pm1 = CalParam(p1, p2); Param pm2 = CalParam(p3, p4); Point2D rp = getIntersectPoint(pm1, pm2); System.out.println("他们的交点为: (" + rp.getX() + "," + rp.getY() + ")"); } /** * 计算两点的直线方程的参数a,b,c * @param p1 * @param p2 * @return */ public static Param CalParam(Point2D p1, Point2D p2){ double a,b,c; double x1 = p1.getX(), y1 = p1.getY(), x2 = p2.getX(), y2 = p2.getY(); a = y2 - y1; b = x1 - x2; c = (x2 - x1) * y1 - (y2 - y1) * x1; if (b < 0) { a *= -1; b *= -1; c *= -1; }else if (b == 0 && a < 0) { a *= -1; c *= -1; } return new Param(a, b, c); } /** * 计算两条直线的交点 * @param pm1 * @param pm2 * @return */ public static Point2D getIntersectPoint(Param pm1, Param pm2){ return getIntersectPoint(pm1.a, pm1.b, pm1.c, pm2.a, pm2.b, pm2.c); } public static Point2D getIntersectPoint(double a1, double b1, double c1, double a2, double b2, double c2){ Point2D p = null; double m = a1 * b2 - a2 * b1; if (m == 0) { return null; } double x = (c2 * b1 - c1 * b2) / m; double y = (c1 * a2 - c2 * a1) / m; p = new Point2D.Double(x, y); return p; } 输出的结果为: 求出该直线方程为: y=2.0x + -0.0 求出该直线方程为: y=-2.6666666666666665x + 153.33333333333334 他们的交点为: (32.857142857142854,65.71428571428571) 他们的交点为: (32.857142857142854,65.71428571428571) 在下只搞出第一种...第二种是同事帮忙, 我连斜率是啥都忘掉了 请各位指点, 看看能否有更好的方法求交点 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-08-02
你这里面没有考虑的问题好多呀,两条线段平行,还有一条垂直x轴,或y轴你这里的a=(y1-y2)/(x1-x2)就会出问题了,得分多种情况分别来求结果
|
|
返回顶楼 | |
发表时间:2009-08-02
最后修改:2009-08-02
一般方程
a1 x + b1 y + c1 = 0 a2 x + b2 y + c2 = 0 交点 x = - |c1 b1| |c2 b2| / |a1 b1| |a2 b2| y = - |c1 a1| |c2 a2| / |b1 a1| |b2 a2| |
|
返回顶楼 | |
发表时间:2009-08-02
分母出现0,则平行。
|
|
返回顶楼 | |
发表时间:2009-08-02
画一条直线. 然后在直线的两边分别画出来一点.. 形状类似箭头.
这个怎么画.. 箭头要随着 线 一起动.. |
|
返回顶楼 | |
发表时间:2009-08-02
kimmking 写道 一般方程
a1 x + b1 y + c1 = 0 a2 x + b2 y + c2 = 0 交点 x = - |c1 b1| |c2 b2| / |a1 b1| |a2 b2| y = - |c1 a1| |c2 a2| / |b1 a1| |b2 a2| 高等代数立功了... |
|
返回顶楼 | |