当前位置:首页 > 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实现分页

实现分页的基本思路 分页功能通常需要处理数据分割、页码生成和用户交互。核心逻辑包括计算总页数、根据当前页截取数据、渲染页码按钮等。 前端分页实现(静态数据) 假设已有全部数据,仅需前端分页展示:…

js实现计算器

js实现计算器

实现基础计算器功能 使用JavaScript创建一个基础计算器需要处理数字输入、运算符逻辑和结果显示。以下是一个简单的实现示例: let currentInput = '0'; let previo…

js实现图片轮播

js实现图片轮播

实现基础图片轮播 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS设置样式和动画效果,JavaScript处理轮播逻辑。 <div cl…

原生js实现轮播图

原生js实现轮播图

基本结构搭建 HTML部分需要包含轮播图容器、图片列表及导航按钮。结构示例如下: <div class="slider-container"> <div class="slid…

js轮播图实现原理

js轮播图实现原理

轮播图的基本原理 轮播图通过动态切换显示的内容(图片、文本等)实现视觉上的滑动效果。核心原理是利用CSS和JavaScript控制元素的显示与隐藏,或通过变换位置实现滑动动画。 实现方法一:CSS…

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标题…