两条线段是否相交计算交点公式.doc_第1页
两条线段是否相交计算交点公式.doc_第2页
两条线段是否相交计算交点公式.doc_第3页
两条线段是否相交计算交点公式.doc_第4页
两条线段是否相交计算交点公式.doc_第5页
免费预览已结束,剩余3页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、两条线段是否相交,计算交点公式。A 本身无限长,假设B 也无限长,直接求得AB 的交点坐标,然后再判断该坐标是否在定长线段B 的内部就可以了啊 AB 本身就是两条直线, 知道两端点就可以知道其直线方程, B 也是一样,两个方程联立,得到一个坐标, 再看该坐标是否在B 的定义域内就可以啊A 的两点为 (x1,y1),(x2,y2)则 A 的直线方程为 l1:y-y1=(y2-y1)(x-x1)/(x2-x1)B 的两点为 (x3,y3),(x4,y4)则 B 的直线方程为 l2:y-y3=(y4-y3)(x-x3)/(x4-x3)联立解出交点坐标为的横坐标为:x=(k2x3-y3-k1x1+y1

2、)/(k2-k1)其中 k1=(y2-y1)/(x2-x1)k2=(y4-y3)/(x4-x3)可以推导出来x = (x2 - x1) * (x3 - x4) * (y3 - y1) -x3 * (x2 - x1) * (y3 - y4) + x1 * (y2 - y1) * (x3 -x4) /(y2 - y1) * (x3 - x4) - (x2 - x1) * (y3 - y4); 同理也可以推导出 y 的值:y = (y2 - y1) * (y3 - y4) * (x3 - x1) -y3 * (y2 - y1) * (x3 - x4) + y1 * (x2 - x1) * (y3 -

3、y4) /(y2 - y1) * (y3 - y4) - (y2 - y1) * (x3 - x4);总结:/第一条直线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

4、- 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)

5、*(x3 - x4)- (x1 - x2) * (y3 - y4);System.out.println( 他们的交点为 : ( + x + , + y + );*下面附上 java 的实现,前提是: a 线段 1 起点坐标b 线段 1 终点坐标c 线段 2 起点坐标d 线段 2 终点坐标Java 代码import java.awt.Point;public classAlgorithmUtil public static void main(String args)AlgorithmUtil.GetIntersection(new Point(1, 2),new Point(1, 2),ne

6、w Point(1, 2), newPoint(1, 2);AlgorithmUtil.GetIntersection(newPoint(1, 2), new Point(1, 2),new Point(1,4), new Point(1, 4);AlgorithmUtil.GetIntersection(new Point(100, 1), newPoint(100, 100),new Point(100, 101), newPoint(100, 400);AlgorithmUtil.GetIntersection(new Point(5, 5), new Point(100,100),ne

7、w Point(100, 5), new Point(5,100);/* 判断两条线是否相交 a线段 1 起点坐标 b 线段 1 终点坐标 c 线段 2 起点坐标d 线段 2终点坐标intersection 相交点坐标* reutrn是否相交:0: 两线平行 -1: 不平行且未相交1 : 两线相交*/private static int GetIntersection(Point a, Point b,Point c, Point d) Point intersection = new Point(0,0);if (Math.abs(b.y - a.y) + Math.abs(b.x - a.

8、x) +Math.abs(d.y - c.y)+ Math.abs(d.x - c.x)=0)if (c.x - a.x) + (c.y - a.y) = 0)System.out.println(ABCD 是同一个点! ); elseSystem.out.println(AB 是一个点, CD是一个点,且AC 不同! );return 0;if (Math.abs(b.y - a.y) +Math.abs(b.x - a.x) = 0) if (a.x - d.x) * (c.y- d.y) - (a.y - d.y) * (c.x - d.x) = 0)System.out.println

9、(A 、B 是一个点, 且在 CD 线段上! ); elseSystem.out.println(A 、B 是一个点, 且不在 CD 线段上! );return0;if (Math.abs(d.y - c.y) +Math.abs(d.x - c.x) = 0) if (d.x - b.x) * (a.y- b.y) - (d.y - b.y) * (a.x - b.x) = 0)System.out.println(C 、D 是一个点, 且在 AB 线段上! ); elseSystem.out.println(C 、D 是一个点, 且不在 AB 线段上! );return0;if (b.y

10、- a.y) * (c.x - d.x) - (b.x -a.x) * (c.y - d.y) = 0) System.out.println(线段平行,无交点! );return 0;intersection.x = (b.x - a.x) * (c.x - d.x) * (c.y - a.y) -c.x * (b.x - a.x) * (c.y - d.y) + a.x * (b.y - a.y) * (c.x - d.x) / (b.y - a.y) * (c.x - d.x) - (b.x - a.x) * (c.y - d.y); intersection.y = (b.y - a.

11、y) * (c.y - d.y) * (c.x - a.x) - c.y* (b.y - a.y) * (c.x - d.x) + a.y * (b.x - a.x) * (c.y - d.y) / (b.x - a.x) * (c.y - d.y) - (b.y - a.y) * (c.x - d.x);if (intersection.x - a.x) * (intersection.x - b.x) <= 0 && (intersection.x - c.x) * (intersection.x - d.x) <=0&& (intersecti

12、on.y - a.y) *(intersection.y - b.y) <= 0&&(intersection.y - c.y) * (intersection.y - d.y) <= 0)System.out.println( 线段相交于点 ( + intersection.x + , + intersection.y + )! );return 1; / 相交 elseSystem.out.println(线段相交于虚交点( +intersection.x + , + intersection.y + )! );return -1; / 相交但不在线段上=下面是

13、找到的另外的一种方法=第二种方法 : 利用斜率公式 , 直线方程为ax+bx+c=0,先求出 a,b,c, 然后再求出交点 Java 代码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

14、); Param pm2 = CalParam(p3, p4);System.out.println( 他们的交点为 : ( + rp.getX() + , +rp.getY() + );/* 计算两点的直线方程的参数a,b,c* param p1* param p2* return*/publicstatic Param CalParam(Point2D p1, Point2D p2)doublea,b,c;double x1 = p1.getX(), y1 = p1.getY(), x2 =p2.getX(), y2 = p2.getY();a = y2 - y1;b = x1 - x2;

15、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*/publicstatic Point2D getIntersectPoint(Param pm1, Parampm2)return getIntersectPoint(pm1.a, pm1.b, pm1.c,pm2.a, pm2.b, pm2.c);public static Point2DgetIntersectPoint(double a1, double b1, double c1, double a2,double b2, double c2)Point2D p = null;double m= a1 * b2 - a2 * b1;if (m = 0) returnnull;double x = (c2 * b1 - c1 * b2) / m;double

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论