如何计算等边三角形外接圆与另一圆的6个交点坐标?
等边三角形外接圆与中心绿圆的6交点计算方案(P5JS/Processing实现)
核心思路
- 利用等边三角形对称特征:已知外接圆半径
r,中心到每条边的距离(内切圆半径)固定为r/2,三条边的中垂线分别指向外接圆的三个顶点,两两夹角120°。 - 计算边的垂足点:每个边的垂足点是中心沿中垂线方向移动
r/2的位置。 - 计算交点偏移量:绿圆半径为
radius时,从垂足点沿边的垂直方向(中垂线旋转±90°)移动的距离为sqrt(radius² - (r/2)²)(半弦长)。 - 批量生成6个交点:对三条边分别计算两个交点,得到P1至P6。
P5JS实现代码
let cx = 200; // 外接圆圆心x坐标 let cy = 200; // 外接圆圆心y坐标 let r = 100; // 外接圆半径 let radius = 120;// 绿色圆半径 let intersections = []; // 存储6个交点 function setup() { createCanvas(400, 400); calculateIntersections(); } function draw() { background(220); // 绘制外接蓝色圆 stroke(0, 0, 255); noFill(); ellipse(cx, cy, 2*r, 2*r); // 绘制等边三角形 stroke(0); let p0 = createVector(cx + r*cos(radians(0)), cy + r*sin(radians(0))); let p1 = createVector(cx + r*cos(radians(120)), cy + r*sin(radians(120))); let p2 = createVector(cx + r*cos(radians(240)), cy + r*sin(radians(240))); line(p0.x, p0.y, p1.x, p1.y); line(p1.x, p1.y, p2.x, p2.y); line(p2.x, p2.y, p0.x, p0.y); // 绘制绿色圆 stroke(0, 255, 0); ellipse(cx, cy, 2*radius, 2*radius); // 绘制6个交点并标注 fill(255, 0, 0); textSize(12); for (let i = 0; i < intersections.length; i++) { let p = intersections[i]; ellipse(p.x, p.y, 6, 6); text(`P${i+1}`, p.x + 8, p.y - 8); } } function calculateIntersections() { intersections = []; let d = r / 2; // 中心到边的距离 let l = sqrt(radius*radius - d*d); // 半弦长 // 遍历三条边的中垂线角度(0°, 120°, 240°) for (let angle = 0; angle < 360; angle += 120) { let rad = radians(angle); // 计算垂足点 let footX = cx + d * cos(rad); let footY = cy + d * sin(rad); // 边的方向:中垂线角度 ±90° let dir1 = radians(angle + 90); let dir2 = radians(angle - 90); // 计算两个交点 let pA = createVector(footX + l * cos(dir1), footY + l * sin(dir1)); let pB = createVector(footX + l * cos(dir2), footY + l * sin(dir2)); intersections.push(pA); intersections.push(pB); } }
关键说明
- 对称简化计算:借助等边三角形的120°旋转对称性,仅需循环3次即可生成所有交点,无需重复计算每条边的直线方程。
- 参数灵活调整:修改
cx、cy、r、radius的值即可适配不同场景,只要radius > r/2就能保证每条边与绿圆有两个交点。 - 向量工具优化:使用P5JS的
createVector存储坐标点,代码更简洁易读。
内容的提问来源于stack exchange,提问作者Richnou
相关产品推荐
相关产品推荐

