现在的位置: 首页 > 综合 > 正文

JAVA版判断两条线是否相交

2012年05月27日 ⁄ 综合 ⁄ 共 2526字 ⁄ 字号 评论关闭

/**
  * 判断两条线是否相交 a 线段1起点坐标 b 线段1终点坐标 c 线段2起点坐标 d 线段2终点坐标 intersection 相交点坐标
  * reutrn 是否相交: 0 : 两线平行 -1 : 不平行且未相交 1 : 两线相交
  */
 public int segIntersect(Point A, Point B, Point C, Point D) {
  Point intersection = new Point();

  if (Math.abs(B.getY() - A.getY()) + Math.abs(B.getX() - A.getX()) + Math.abs(D.getY() - C.getY())
    + Math.abs(D.getX() - C.getX()) == 0) {
   if ((C.getX() - A.getX()) + (C.getY() - A.getY()) == 0) {
    System.out.println("ABCD是同一个点!");
   } else {
    System.out.println("AB是一个点,CD是一个点,且AC不同!");
   }
   return 0;
  }

  if (Math.abs(B.getY() - A.getY()) + Math.abs(B.getX() - A.getX()) == 0) {
   if ((A.getX() - D.getX()) * (C.getY() - D.getY()) - (A.getY() - D.getY()) * (C.getX() - D.getX()) == 0) {
    System.out.println("A、B是一个点,且在CD线段上!");
   } else {
    System.out.println("A、B是一个点,且不在CD线段上!");
   }
   return 0;
  }
  if (Math.abs(D.getY() - C.getY()) + Math.abs(D.getX() - C.getX()) == 0) {
   if ((D.getX() - B.getX()) * (A.getY() - B.getY()) - (D.getY() - B.getY()) * (A.getX() - B.getX()) == 0) {
    System.out.println("C、D是一个点,且在AB线段上!");
   } else {
    System.out.println("C、D是一个点,且不在AB线段上!");
   }
   return 0;
  }

  if ((B.getY() - A.getY()) * (C.getX() - D.getX()) - (B.getX() - A.getX()) * (C.getY() - D.getY()) == 0) {
//   System.out.println("线段平行,无交点!");
   return 0;
  }

  intersection
    .setX(((B.getX() - A.getX()) * (C.getX() - D.getX())
      * (C.getY() - A.getY()) - C.getX()
      * (B.getX() - A.getX()) * (C.getY() - D.getY()) + A
      .getX() * (B.getY() - A.getY()) * (C.getX() - D.getX()))
      / ((B.getY() - A.getY()) * (C.getX() - D.getX()) - (B
        .getX() - A.getX()) * (C.getY() - D.getY())));
  intersection
    .setY(((B.getY() - A.getY()) * (C.getY() - D.getY())
      * (C.getX() - A.getX()) - C.getY()
      * (B.getY() - A.getY()) * (C.getX() - D.getX()) + A
      .getY() * (B.getX() - A.getX()) * (C.getY() - D.getY()))
      / ((B.getX() - A.getX()) * (C.getY() - D.getY()) - (B
        .getY() - A.getY()) * (C.getX() - D.getX())));

  if ((intersection.getX() - A.getX()) * (intersection.getX() - B.getX()) <= 0
    && (intersection.getX() - C.getX())
      * (intersection.getX() - D.getX()) <= 0
    && (intersection.getY() - A.getY())
      * (intersection.getY() - B.getY()) <= 0
    && (intersection.getY() - C.getY())
      * (intersection.getY() - D.getY()) <= 0) {

  if(  (A.getX() == C.getX() && A.getY() == C.getY() ) || ( A.getX() == D.getX() && A.getY() == D.getY() )
    || (B.getX() == C.getX() && B.getY() == C.getY() ) || ( B.getX() == D.getX() && B.getY() == D.getY() )){
   
    System.out.println("线段相交于端点上");
    return 2;
   
   }else {
    System.out.println("线段相交于点(" + intersection.getX() + ","
     + intersection.getY() + ")!");
    return 1; // '相交
   }
   
  } else {
//   System.out.println("线段相交于虚交点(" + intersection.getX() + ","
//     + intersection.getY() + ")!");
   return -1; // '相交但不在线段上
  }

 }

抱歉!评论已关闭.