[笔记]已知圆心和半径,已知一条直线上的两点坐标,求圆和直线的交点

628 阅读1分钟

因业务需求需要获取人脸关键点,但是第三方api没有颧骨位置的坐标点,所以要根据已知点位计算出颧骨位置。

大概位置如下


image.png

产品说以眼角为圆心,以眼角到眉角为半径,眉角到下颌左4点连线与圆的交点即为颧骨位置。


百度半天加自己整理 总算捣鼓出来了,说白了就是已知两点的直线,与已知圆的交点。

下面为整理出来的公式,遇到类似需求可直接套用,在这里记录下,用做以后参考。

// 获取以P0为圆心,r为半径的圆与p1 ,p2组成直线的交点
getPoint(p0, p1, p2, r) {
    let x1, y1, x2, y2
    let m = p0.x, n = p0.y // 圆心坐标m, n
    let { k, b } = this.getLineKB(p1, p2)
    let A, B, C // 转换一元二次方程Ax^2 + Bx + C = 0
    A = 1 + k * k
    B = 2 * k * (b - n) - 2 * m
    C = m * m + (b - n) * (b - n) - r * r
    x1 = (-B + Math.sqrt(Math.pow(B, 2) - 4 * A * C)) / (2 * A)
    y1 = k * x1 + b
    x2 = (-B - Math.sqrt(Math.pow(B, 2) - 4 * A * C)) / (2 * A)
    y2 = k * x2 + b
    let point1 = { x: x1, y: y1 }, point2 = { x: x2, y: y2 }
    console.log('{ point1, point2 }', { point1, point2 });
    return { point1, point2 }
}

// 根据已知两点 求直线斜率和截距
getLineKB(p1, p2) {
    let k, b
    k = (p2.y - p1.y) / (p2.x - p1.x)
    b = p1.y - (p1.x * (p2.y - p1.y) / (p2.x - p1.x))
    console.log('getLineKB', { k, b });

    return { k, b }
}