AS3:沿两个圆的公切线画一条线

use*_*980 3 math geometry actionscript-3

在舞台上有两个圆圈,circ1 和 circ2。circ1 的半径为 60,circ2 的半径为 30。

circ2 可以在播放时在舞台上拖动。

我想要的 是通过公共外切线连接圆的两条线。该项目致力于将一张旧海报变成一个互动有趣的盒子。这是海报的链接,它可能会帮助您理解我的意思(尽管现在我只关心两个圆圈)。

问题是: 我知道如何用笔和纸找到共同切线,但一旦我尝试构思如何用 Flash 可能理解的术语表达这一点,我的大脑就会崩溃。我不知道如何使用 ActionScript 来实现这一点。

我尝试过的: 我环顾四周,这是我能找到的最接近我想要实现的目标的东西(示例应用程序可在页面底部下载)。唯一的区别是这包括我不需要的内切线。

不幸的是,这个源代码是用 Java 编写的,尽管我尽了最大努力,但我对 Java 的理解还不足以移植到 AS3。

到目前为止,我自己所实现的只是为每个圆的中心定义点,然后意识到我无法快速求解变量的方程。然后我花了几个小时谷歌搜索试图弄清楚如何从这里继续。

任何帮助将不胜感激,这是一个学校项目的工作,将于本周末到期。我可能已经咬得太紧了,但现在回头已经太晚了。

提前致谢!

Mar*_*rot 6

function DrawTangents(p1 : Point, r1 : Number, p2 : Point, r2 : Number) : void {
    var dx = p2.x - p1.x;
    var dy = p2.y - p1.y;
    var dist = Math.sqrt(dx*dx + dy*dy);

    this.graphics.drawCircle(p1.x, p1.y, r1);
    this.graphics.drawCircle(p2.x, p2.y, r2);

    if (dist <= Math.abs(r2 - r1)) {
        // The circles are coinciding. There are no valid tangents.
        return;
    }

    // Rotation from the x-axis.
    var angle1 = Math.atan2(dy, dx);

    // Relative angle of the normals. This is equal for both circles.
    var angle2 = Math.acos((r1 - r2)/dist);

    this.graphics.moveTo(p1.x + r1 * Math.cos(angle1 + angle2),
                         p1.y + r1 * Math.sin(angle1 + angle2));
    this.graphics.lineTo(p2.x + r2 * Math.cos(angle1 + angle2),
                         p2.y + r2 * Math.sin(angle1 + angle2));

    this.graphics.moveTo(p1.x + r1 * Math.cos(angle1 - angle2),
                         p1.y + r1 * Math.sin(angle1 - angle2));
    this.graphics.lineTo(p2.x + r2 * Math.cos(angle1 - angle2),
                         p2.y + r2 * Math.sin(angle1 - angle2));
}
Run Code Online (Sandbox Code Playgroud)