zoukankan      html  css  js  c++  java
  • 【原创】已知四个坐标点求其两条直线交点坐标

    //判断第一个点 与 第四个点所连直线 与 第2个点和第3个点 所连直线的交点 是否在 第2个和第3个点的线段上
    function getCrossPoint(point1, point2, point3, point4)
    {
        var pD_x = point1.split(',')[0];
        var pD_y = point1.split(',')[1];
        var pA_x = point2.split(',')[0];
        var pA_y = point2.split(',')[1];
    
        var pC_x = point3.split(',')[0];
        var pC_y = point3.split(',')[1];
        var pB_x = point4.split(',')[0];
        var pB_y = point4.split(',')[1]; 
    
        var k_y = (pB_x * pC_y * pD_y - pD_x * pB_y * pC_y - pA_y * pB_x * pD_y + pD_x * pB_y * pA_y + pC_x * pA_y * pD_y - pA_x * pC_y * pD_y - pC_x * pB_y * pA_y + pA_x * pB_y * pC_y) /
            (pD_y * pC_x - pA_x * pD_y - pB_y * pC_x + pA_x * pB_y + pB_x * pC_y - pD_x * pC_y - pA_y * pB_x + pA_y * pD_x);
    
        var k_x = (pD_y * (pC_x - pA_x) * (pB_x - pD_x) - pA_y * (pC_x - pA_x) * (pB_x - pD_x) + pA_x * (pC_y - pA_y) * (pB_x - pD_x) + pD_x * (pD_y - pB_y) * (pC_x - pA_x)) /
            ((pC_y - pA_y) * (pB_x - pD_x) + (pD_y - pB_y) * (pC_x - pA_x));
    
        return k_x + ',' + k_y;
    }
    //判断 随机产生的点 和点X 的连线  与地图上已知的两点(给出的坐标中连续的两点)之间的连线  的 交点 是否在 已知的两点的线段之上  如果在之上:那么点X的顺序应该调整到已知的两点中间
    function CrosspointIsOnTheLine(point1, point2, point3, point4)
    {
    
        var crossPoint = getCrossPoint(point1, point2, point3, point4);//交点坐标
    
        var result = {
            online: false,//是否在线段上
            nearP2: undefined//如果不在线段上,是否近p2,否则近p3
        };
    
        //交点分别到 第2点 和 第3点 之间的距离 等于 第2点到第3点的距离  那么 交点在线段上
    
        var cp_xy = crossPoint.split(',');
    
        var p2_xy = point2.split(',');
        var p3_xy = point3.split(',');
    
        var cp_p2_length = getLength(cp_xy[0], cp_xy[1], p2_xy[0], p2_xy[1]);//交点到p2的距离
        var cp_p3_length = getLength(cp_xy[0], cp_xy[1], p3_xy[0], p3_xy[1]);//交点到p3的距离
        var p2_p3_length = getLength(p2_xy[0], p2_xy[1], p3_xy[0], p3_xy[1]);//p2到p3的距离
    
        //由于线段的长度本身存在精度的问题  ,所以这么比较 交点到 p2和p3的距离 同时小于 p2到p3的距离 说明 交点在 p2到p3的线段上
        if (cp_p2_length <= p2_p3_length && cp_p3_length <= p2_p3_length) {
            result.online = true; 
        }
        else {
            //if (cp_p2_length > p2_p3_length) {
            //    result.nearP2 = false;
            //}
            //else if (cp_p3_length > p2_p3_length) {
            //    result.nearP2 = true;
            //}
        }
    
        return result;
    
    }

     getLength()函数见下一篇

  • 相关阅读:
    比赛-ZR DAY1 (04 Aug, 2018)
    Java NIO系列教程(十一) Pipe
    Java NIO系列教程(九) ServerSocketChannel
    Java NIO系列教程(十) Java NIO DatagramChannel
    Java NIO系列教程(七) FileChannel
    Java NIO系列教程(八) SocketChannel
    Java NIO系列教程(六) Selector
    Java NIO系列教程(四) Scatter/Gather
    Java NIO系列教程(五) 通道之间的数据传输
    Java NIO系列教程(二) Channel
  • 原文地址:https://www.cnblogs.com/langu/p/3458835.html
Copyright © 2011-2022 走看看