【原創】已知四個坐標點求其兩條直線交點坐標


//判斷第一個點 與 第四個點所連直線 與 第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()函數見下一篇


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM