已知两条线段的坐标:{x1, y1, x2, y2}, {x3, y3, x4, y4}, 如何计算交点?

解决方案 »

  1.   

    伪代码:
           1、判断斜率相同不,y2-y1/x2-x1,y4-y3/x4-x3,相同则无交点,不相同说明直线有交点则执行第二步;
           2、设y=ax+b,通过斜率可求出a的值,通过坐标可以求出b的值,这样两个线段所在直线的两个方程式就得到了;
           3、通过两个方程式求出交点,再判断交点是不是落在两线段交点的区域中
      

  2.   

    两条直线的函数分别是
    y=[(y1-y2)/(x1-x2)]x+(x1*y2-x2*y1)/(x1-x2)
    y=[(y3-y4)/(x3-x4)]x+(x3*y4-x4*y3)/(x3-x4)联立方程组计算x和y,就是交点的坐标。
      

  3.   

    这个问题还没有解决?
    你可以通过:{x1, y1, x2, y2},  得到一个直线方程,比如:x = y;
    再通过{x3, y3, x4, y4}, 得到第二个直线方程,比如是:x = 2y;
    通过两个直线方程,可以得到他们的交点是:0,0;
    最后看这个交点0,0是否同时属于已知的两个线段,over;
      

  4.   

    用两点式公式得到两个方程 然后将两方程连立求解。注意平行 和 重合的情况!(x-x1)(y2-y1)=(x2-x1)(y-y1)  两点式公式。
      

  5.   

    // 求两条平面直线的交点
    private Point intersectPoint(Point a, Point b, Point c, Point d) {   
    double deita = (b.x - a.x) * (c.y - d.y) - (d.x - c.x) * (a.y - b.y);
    double x = (c.y * d.x - c.x * d.y) * (b.x - a.x)
    - (a.y * b.x - a.x * b.y) * (d.x - c.x);
    x /= deita;
    double y = (a.y * b.x - a.x * b.y) * (c.y - d.y)
    - (c.y * d.x - c.x * d.y) * (a.y - b.y);
    y /= deita; return new Point(x, y, 0.0);
    }
      

  6.   

    先确定两条直线的斜率
    之后找到两条线段上的所有点
    线段一上的所有点(x,((y2-y1)/(x2-x1))*x)
    线段二上的所有点(x,((y4-y3)/(x4-x3))*x)之后是用程序计算其实应该的解法是:
    情况一:两条线的斜率一样,判断起始点是否相同,相同则会重复,不同则平行。
    情况二:两条线的斜率不一样,判断(x,((y2-y1)/(x2-x1))*x)和(x,((y4-y3)/(x4-x3))*x)是否有相似值。
    就是代入一个x判断y的值是否接近。只是一种想法 ,有待改进哈!
      

  7.   

    .............这个基本就是初中数学问题嘛..
    找下公式或者自己推导下,然后考虑下精度问题,翻译成java就ok了.
      

  8.   

    用{x1,y1, x2, y2}
    把x3,x4代入方程(x3,x4中最少有一点在x1,x2之间),看y3是否与y4异号
      

  9.   

    用{x1,y1, x2, y2} 建立方程
      

  10.   

    用{x1,y1, x2, y2} 建立方程
    把x3,x4代入方程(x3,x4中最少有一点在x1,x2之间),看y3是否与y4异号 
      

  11.   

    简单写了一个,没有太考虑精度的问题。
    package com.test.q;public class Line {
    private int[] startPoint = new int[2];
    private int[] endPoint = new int[2];
    private boolean x1LessThanx2 = true;

    public boolean isX1LessThanx2() {
    return x1LessThanx2;
    } public void setX1LessThanx2(boolean lessThanx2) {
    x1LessThanx2 = lessThanx2;
    } public int[] getStartPoint() {
    return startPoint;
    } public void setStartPoint(int[] startPoint) {
    this.startPoint = startPoint;
    } public int[] getEndPoint() {
    return endPoint;
    } public void setEndPoint(int[] endPoint) {
    this.endPoint = endPoint;
    } public Line(int x1, int y1, int x2, int y2) {
    if(y1<y2){
    startPoint[0] = x1;
    startPoint[1] = y1;
    endPoint[0] = x2;
    endPoint[1] = y2;
    }else{
    startPoint[0] = x2;
    startPoint[1] = y2;
    endPoint[0] = x1;
    endPoint[1] = y1;
    }
    if(x1>x2) x1LessThanx2=false;

    } private int getXLength() {
    if(x1LessThanx2){
    return endPoint[0] - startPoint[0];
    }else{
    return startPoint[0] - endPoint[0];
    }
    } private int getYLength() { return endPoint[1] - startPoint[1]; } private double getLength() {
    int xLen =getXLength();
    int yLen = getYLength();
    Math.sqrt(xLen * xLen + yLen * yLen);
    return Math.sqrt(xLen * xLen + yLen * yLen);
    } private double getYGradient() {
    return  getLength()/getYLength();
    }

    private double getXPointByYPoint(int yStep) {
    int ylen = yStep-startPoint[1];
    double tempLen = ylen*getYGradient();
    double xLen = Math.sqrt(tempLen*tempLen-ylen*ylen);

    if(x1LessThanx2){
    return xLen + startPoint[0];
    }else{
    return startPoint[0] -xLen;
    }


    }

    public static double[] getCrossedPoint(Line line1,Line line2){

    //看两天线是否平行
    if(line1.getYGradient()==line2.getYGradient()){
    return null;
    }
    int yStarting = line1.getStartPoint()[1];
    if(line1.getStartPoint()[1]<line2.getStartPoint()[1]){
    yStarting = line2.getStartPoint()[1];
    }

    int yEnding = line1.getEndPoint()[1];
    if(line1.getEndPoint()[1]>line2.getEndPoint()[1]){
    yEnding = line2.getEndPoint()[1];
    }
    double line1XPoint = 0;
    double line2XPoint = 0;
    boolean currentState = true;
    boolean previousState = true;
    for(int i=yStarting;i<=yEnding;i++){
    line1XPoint =line1.getXPointByYPoint(i);
    line2XPoint =line2.getXPointByYPoint(i);
    currentState = line1XPoint>line2XPoint;

    //System.out.println("Line1 Axix point X:Y " + line1.getXPointByYPoint(i) + ":"+ i );
    //System.out.println("Line2 Axix point X:Y " + line2.getXPointByYPoint(i) + ":"+ i );
    //如果前一条线的xpoing一直比第二条线小,而突然变成比第二条大,证明相交了。
    if(previousState != currentState){
    double[] ret = new double[2];
    //这儿可以再细化,看更接近前一个点,还是目前这个点,根据xpoint的差值决定那个更近,这里就不做了。
    ret[0] = line1.getXPointByYPoint(i);
    ret[1] = i;
    return ret;
    }
    previousState = currentState;
    }

    return null;
    }
    /**
     * @param args
     */
    public static void main(String[] args) {
    Line line1 = new Line(0,5,30,20); Line line2 = new Line(0,10,40,15);
    double[] crossPoint = getCrossedPoint(line1,line2);
    if(crossPoint!=null){
    System.out.println("Crossed point is: X:Y ---" + crossPoint[0] + ":"+ crossPoint[1]);
    }else{
    System.out.println("No crossed point");
    }


    }}