当前位置:首页 > JavaScript

js实现圆交集

2026-02-03 02:03:44JavaScript

实现圆交集的方法

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

判断两圆是否相交

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

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

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

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绘制圆和交点:

js实现圆交集

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实现延迟

实现延迟的方法 在JavaScript中,实现延迟操作有多种方式,以下是几种常见的方法: 使用setTimeout函数 setTimeout是JavaScript中最常用的延迟执行方法。它接受一个回…

js实现授权

js实现授权

授权流程设计 授权流程通常涉及前端与后端的交互,常见方案包括OAuth2.0、JWT等。以JWT为例的典型流程: 用户提交凭证(如用户名密码)到认证服务 服务端验证通过后生成包含用户信息的JWT令牌…

js实现投球

js实现投球

实现投球动画的基本思路 使用JavaScript和CSS动画结合的方式模拟投球效果。核心是通过改变元素的位置、旋转和缩放属性,配合定时器或CSS过渡实现平滑动画。 创建基础HTML结构 <…

js实现路由

js实现路由

js实现路由的方法 在JavaScript中实现路由功能可以通过多种方式完成,以下是几种常见的方法: 使用原生JavaScript实现路由 通过监听window.onhashchange事件来实现基…

js图片上传实现

js图片上传实现

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API实现基础图片上传功能。HTML部分需要设置accept="image/…

实现图片旋转js

实现图片旋转js

使用CSS transform属性旋转图片 通过CSS的transform属性可以轻松实现图片旋转。以下是一个简单的示例代码: const image = document.getElement…