论坛首页 Java企业应用论坛

求两直线的交点坐标

浏览 18777 次
精华帖 (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)


在下只搞出第一种...第二种是同事帮忙, 我连斜率是啥都忘掉了
请各位指点, 看看能否有更好的方法求交点
   发表时间:2009-08-02  
你这里面没有考虑的问题好多呀,两条线段平行,还有一条垂直x轴,或y轴你这里的a=(y1-y2)/(x1-x2)就会出问题了,得分多种情况分别来求结果
0 请登录后投票
   发表时间: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|
0 请登录后投票
   发表时间:2009-08-02  
分母出现0,则平行。
0 请登录后投票
   发表时间:2009-08-02  
画一条直线. 然后在直线的两边分别画出来一点.. 形状类似箭头.

    这个怎么画.. 箭头要随着 线 一起动..
0 请登录后投票
   发表时间: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|

高等代数立功了... 
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics