如何计算圆和等边三角形之间的6个交点的坐标?

3

我知道一个等边三角形的中心点(cx,cy)和一个外接它的蓝色圆的半径(r)。

如果我画出任意半径(radius)的绿色圆(假设此圆足够大以有这个交集),我能得到6个交点的坐标吗?(P1,P2,P3...)

Text

我正在寻找P5JS/processing,但任何其他线索都可以帮助我...
提前感谢您。

我希望你的意思是“外接圆”. 因为现在三角形有专业的有薪军队了,所以强制征兵已经不再适用于它们。 - Sembei Norimaki
Google翻译错误... - Richnou
2个回答

5

中心到上顶点的距离为r
中心到最低三角形边缘的距离为r/2(中点交汇于中心,它们按1:2的比例分割)。
cxp4(和p5)的水平距离是(勾股定理)

dx = sqrt(radius^2 - r^2/4)

因此,p4p5的坐标(相对于中心)为:

p4x = dx
p4y = r/2
p5x = -dx
p5y = r/2

其他点可以通过绕120度旋转计算得出

p2x = p4x*(-1/2) - p4y*(sqrt(3)/2)
p2y = p4x*(sqrt(3)/2) + p4y*(-1/2)

等等。

最后加上cx,cy以获取绝对坐标。


1
很好的答案。请注意,当R == 1/2r时,只有三个点,dx为0,这是有意义的。当R < 1/2r时,没有交点,dx是复数。我无法弄清楚当R非常大时它如何退化。 - danh
1
@danh 当R太大时,交点位于三角形边的延续处。 - MBo
但是我不知道如何使用120度旋转计算其他点... - Richnou
1
@Richnou 我写了一个公式用于 p4->p2。同样的,p5->p3,p2->p6,p3->p1。 - MBo

1

如果你想测试... ;-)

function setup() {
    createCanvas(500, 500);

    const cx = width / 2;
    const cy = height / 2;
    const r = 250; // taille du triangle

    const radius = 180; // externe

    noFill();
    strokeWeight(3);
    stroke(0, 0, 0);
    drawTriangle(cx, cy, r);

    strokeWeight(1);
    stroke(0, 0, 255);
    circle(cx, cy, r * 2);

    strokeWeight(2);
    stroke(8, 115, 0);
    circle(cx, cy, radius * 2);

    noStroke();
    fill(215, 0, 0);

    // dx = sqrt(Math.pow(r / 2, 2) - Math.pow(r / 2, 2 / 4));
    
    dx = sqrt(radius * radius - (r * r) / 4);

    p4x = dx;
    p4y = r / 2;
    circle(cx + p4x, cy + p4y, 20);
    text("p4", cx + p4x, cy + p4y + 30);

    p5x = -dx;
    p5y = r / 2;
    circle(cx + p5x, cy + p5y, 20);
    text("p5", cx + p5x - 10, cy + p5y + 30);

    p6x = p4x * (-1 / 2) - p4y * (sqrt(3) / 2);
    p6y = p4x * (sqrt(3) / 2) + p4y * (-1 / 2);
    circle(cx + p6x, cy + p6y, 20);
    text("p6", cx + p6x - 30, cy + p6y);

    p2x = p6x * (-1 / 2) - p6y * (sqrt(3) / 2);
    p2y = p6x * (sqrt(3) / 2) + p6y * (-1 / 2);
    circle(cx + p2x, cy + p2y, 20);
    text("p2", cx + p2x + 10, cy + p2y - 10);

    p1x = p5x * (-1 / 2) - p5y * (sqrt(3) / 2);
    p1y = p5x * (sqrt(3) / 2) + p5y * (-1 / 2);
    circle(cx + p1x, cy + p1y, 20);
    text("p1", cx + p1x - 20, cy + p1y - 10);

    p3x = p1x * (-1 / 2) - p1y * (sqrt(3) / 2);
    p3y = p1x * (sqrt(3) / 2) + p1y * (-1 / 2);
    circle(cx + p3x, cy + p3y, 20);
    text("p3", cx + p3x + 20, cy + p3y - 10);

    noFill();
    stroke(0, 255, 255);
    triangle(cx + p2x, cx + p2y, cx + p4x, cx + p4y, cx + p6x, cx + p6y);

    stroke(255, 0, 255);
    // prettier-ignore
    triangle(
        cx + p1x, cx + p1y,
        cx + p3x, cx + p3y,
        cx + p5x, cx + p5y,
    )
}

function drawTriangle(cx, cy, radius) {
    noFill();
    trianglePoints = [];
    for (var i = 0; i < 3; i++) {
        var x = cx + radius * cos((i * TWO_PI) / 3.0 - HALF_PI);
        var y = cy + radius * sin((i * TWO_PI) / 3.0 - HALF_PI);
        trianglePoints[i] = {
            x,
            y,
        };
    }
    triangle(
        trianglePoints[0].x,
        trianglePoints[0].y,
        trianglePoints[1].x,
        trianglePoints[1].y,
        trianglePoints[2].x,
        trianglePoints[2].y
    );
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.5.0/p5.min.js"></script>


1
你确定 dx = sqrt(Math.pow(r / 2, 2) - Math.pow(r / 2, 2 / 4)); 是正确的吗?看起来不对(注意根本没有使用 radius)。我认为它应该是 dx = sqrt(radius*radius - r*r/4); - MBo
你是绝对正确的!起初我的观点看起来不错,但有一个非常小的错位... - Richnou

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接