当前位置:首页 > JavaScript

js实现圆交集

2026-02-03 02:03:44JavaScript

实现圆交集的方法

在JavaScript中,可以通过计算两个圆的圆心距离和半径关系来判断它们是否相交。以下是具体的实现步骤。

判断两圆是否相交

两圆相交的条件是圆心距离小于两圆半径之和且大于两圆半径之差。具体公式如下:

js实现圆交集

[ d = \sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2} ]

[ |r_1 - r_2| \leq d \leq r_1 + r_2 ]

js实现圆交集

function circlesIntersect(x1, y1, r1, x2, y2, r2) {
    const dx = x2 - x1;
    const dy = y2 - y1;
    const distance = Math.sqrt(dx * dx + dy * dy);
    return Math.abs(r1 - r2) <= distance && distance <= r1 + r2;
}

计算两圆的交点

如果两圆相交,可以通过几何公式计算交点坐标。以下是计算步骤:

  1. 计算圆心距离 ( d ) 和向量 ( (dx, dy) )。
  2. 检查是否满足相交条件。
  3. 计算交点坐标。
function getCircleIntersection(x1, y1, r1, x2, y2, r2) {
    const dx = x2 - x1;
    const dy = y2 - y1;
    const d = Math.sqrt(dx * dx + dy * dy);

    if (d > r1 + r2 || d < Math.abs(r1 - r2)) {
        return null; // 无交点
    }

    const a = (r1 * r1 - r2 * r2 + d * d) / (2 * d);
    const h = Math.sqrt(r1 * r1 - a * a);

    const xMid = x1 + (a * dx) / d;
    const yMid = y1 + (a * dy) / d;

    const x3 = xMid - (h * dy) / d;
    const y3 = yMid + (h * dx) / d;
    const x4 = xMid + (h * dy) / d;
    const y4 = yMid - (h * dx) / d;

    return [
        { x: x3, y: y3 },
        { x: x4, y: y4 }
    ];
}

示例用法

const circle1 = { x: 0, y: 0, r: 5 };
const circle2 = { x: 6, y: 0, r: 3 };

const intersects = circlesIntersect(
    circle1.x, circle1.y, circle1.r,
    circle2.x, circle2.y, circle2.r
);
console.log('是否相交:', intersects);

const intersectionPoints = getCircleIntersection(
    circle1.x, circle1.y, circle1.r,
    circle2.x, circle2.y, circle2.r
);
console.log('交点坐标:', intersectionPoints);

可视化圆交集

如果需要可视化圆交集,可以使用Canvas或SVG绘制圆和交点:

function drawCirclesAndIntersections(ctx, circle1, circle2) {
    // 绘制圆1
    ctx.beginPath();
    ctx.arc(circle1.x, circle1.y, circle1.r, 0, Math.PI * 2);
    ctx.strokeStyle = 'blue';
    ctx.stroke();

    // 绘制圆2
    ctx.beginPath();
    ctx.arc(circle2.x, circle2.y, circle2.r, 0, Math.PI * 2);
    ctx.strokeStyle = 'red';
    ctx.stroke();

    // 绘制交点
    const points = getCircleIntersection(
        circle1.x, circle1.y, circle1.r,
        circle2.x, circle2.y, circle2.r
    );
    if (points) {
        ctx.fillStyle = 'green';
        points.forEach(point => {
            ctx.beginPath();
            ctx.arc(point.x, point.y, 3, 0, Math.PI * 2);
            ctx.fill();
        });
    }
}

注意事项

  • 浮点数精度问题可能导致计算结果不完全准确,建议在比较时使用误差范围。
  • 如果两圆重合(圆心相同且半径相同),则交点为无穷多个,需要特殊处理。

标签: js
分享给朋友:

相关文章

js实现轮播图

js实现轮播图

轮播图实现方法 基础HTML结构 <div class="slider"> <div class="slides"> <img src="image1.jpg…

js实现验证码

js实现验证码

实现验证码的JavaScript方法 生成随机验证码 使用Math.random()生成随机字符串,结合数字和字母: function generateCaptcha() { const ch…

js实现跳转

js实现跳转

使用 window.location 跳转 通过修改 window.location.href 实现页面跳转,这是最常用的方法。 window.location.href = 'https:/…

js实现

js实现

实现 JavaScript 功能的方法 在 JavaScript 中实现特定功能通常涉及多个步骤。以下是常见的实现方法: 基础语法和变量声明 使用 let 或 const 声明变量: let co…

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 通过监听鼠标事件(mousedown、mousemove、mouseup)实现拖拽功能。以下是核心代码逻辑: const draggableElement = document.…

js实现倒计时

js实现倒计时

使用 setInterval 实现倒计时 通过 setInterval 定时器每秒更新剩余时间,适用于简单倒计时场景。 function countdown(seconds, callbac…