求圆和直线之间的交点

求圆和直线之间的交点

/**
 * 求圆和直线之间的交点
 * 直线方程:y = kx + b
 * 圆的方程:(x - m)² + (x - n)² = r²
 * x1, y1 = 线坐标1, x2, y2 = 线坐标2, m, n = 圆坐标, r = 半径
 */
public getInsertPointBetweenCircleAndLine(x1, y1, x2, y2, m, n, r) {
    // console.log(x1, y1, x2, y2, m, n, r)
    let kbArr = this.binaryEquationGetKB(x1, y1, x2, y2)
    let k = kbArr[0]
    let b = kbArr[1]

    let aX = 1 + k * k
    let bX = 2 * k * (b - n) - 2 * m
    let cX = m * m + (b - n) * (b - n) - r * r

    let insertPoints = []
    let xArr = this.quadEquationGetX(aX, bX, cX)
    xArr.forEach(x => {
        let y = k * x + b
        insertPoints.push({ x: x, y: y })
    })
    return insertPoints
}

 

/**
 * 求二元一次方程的系数
 * y1 = k * x1 + b => k = (y1 - b) / x1
 * y2 = k * x2 + b => y2 = ((y1 - b) / x1) * x2 + b
 */
private binaryEquationGetKB(x1, y1, x2, y2) {
    let k = (y1 - y2) / (x1 - x2)
    let b = (x1 * y2 - x2 * y1) / (x1 - x2)
    return [k, b]
}

 

/**
 * 一元二次方程求根
 * ax² + bx + c = 0
 */
public quadEquationGetX(a, b, c) {
    let xArr = []
    let result = Math.pow(b, 2) - 4 * a * c
    if (result > 0) {
        xArr.push((-b + Math.sqrt(result)) / (2 * a))
        xArr.push((-b - Math.sqrt(result)) / (2 * a))
    } else if (result == 0) {
        xArr.push(-b / (2 * a))
    }
    return xArr
}

 

posted @ 2018-12-03 15:12 HaoK 阅读( ...) 评论( ...) 编辑 收藏
在Matlab中,可以通过一些数学几何的方法来求解直线交点。 首先,需要确定直线的参数方程的参数方程。对于直线,可以使用两点间的直线方程或参数方程表示。对于,可以使用其半径来表示。 假设直线的参数方程为: x = x0 + t*(x1 - x0) y = y0 + t*(y1 - y0) 的参数方程为: (x - a)^2 + (y - b)^2 = r^2 其中,(x0, y0)(x1, y1)为直线上两点的坐标,(a, b)为心的坐标,r为的半径。 为了求解直线交点,需要将直线方程代入的方程中,得到一个关于t的方程。然后,通过求解这个方程,可以得到直线交点。 假设直线交点为(x, y),则有: (x - a)^2 + (y - b)^2 = r^2 代入直线的参数方程,得到: (x0 + t*(x1 - x0) - a)^2 + (y0 + t*(y1 - y0) - b)^2 = r^2 展开简化方程,得到一个关于t的二次方程。 通过解这个二次方程,可以得到t的两个值,然后再将这两个t值代回直线的参数方程中,求解得到对应的两个交点坐标。 在Matlab中,可以使用符号计算的工具箱来解这个二次方程,例如使用`solve`函数。示例代码如下: syms t % 定义直线的参数 x0 = 1; y0 = 1; x1 = 5; y1 = 3; a = 2; b = 2; r = 2; % 求解二次方程 eq = (x0 + t*(x1 - x0) - a)^2 + (y0 + t*(y1 - y0) - b)^2 == r^2; sol = solve(eq, t); % 求解交点坐标 x = [x0 + sol(1)*(x1 - x0), x0 + sol(2)*(x1 - x0)]; y = [y0 + sol(1)*(y1 - y0), y0 + sol(2)*(y1 - y0)]; 通过上述代码,可以得到直线的两个交点坐标(x, y)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值