Skip to content

Instantly share code, notes, and snippets.

@thu0x31
Created May 21, 2022 17:04
Show Gist options
  • Save thu0x31/ade921c774981b06cd3a537e990b0f21 to your computer and use it in GitHub Desktop.
Save thu0x31/ade921c774981b06cd3a537e990b0f21 to your computer and use it in GitHub Desktop.

Revisions

  1. thu0x31 created this gist May 21, 2022.
    35 changes: 35 additions & 0 deletions innerTangents.vfl
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,35 @@
    function vector[] innerTangents(vector circle1Pos, circle2Pos;
    float circle1Radius, circle2Radius) {

    float hypotenuse = distance(circle1Pos, circle2Pos);
    float shortEdgeLen = circle1Radius + circle2Radius;
    float rad = atan2(circle2Pos.z - circle1Pos.z, circle2Pos.x - circle1Pos.x)
    + asin(shortEdgeLen/hypotenuse) - PI/2;
    vector circle1InnerTangent1 = set(
    circle1Pos.x + circle1Radius * cos(rad),
    circle1Pos.y,
    circle1Pos.z + circle1Radius * sin(rad)
    );

    vector circle2InnerTangent1 = set(
    circle2Pos.x + circle2Radius * cos(rad + PI),
    circle2Pos.y,
    circle2Pos.z + circle2Radius * sin(rad + PI)
    );

    float oppositeRad = atan2(circle2Pos.z - circle1Pos.z, circle2Pos.x - circle1Pos.x)
    - asin(shortEdgeLen/hypotenuse) + PI/2;
    vector circle1InnerTangent2 = set(
    circle1Pos.x + circle1Radius * cos(oppositeRad),
    circle1Pos.y,
    circle1Pos.z + circle1Radius * sin(oppositeRad)
    );

    vector circle2InnerTangent2 = set(
    circle2Pos.x + circle2Radius * cos(oppositeRad + PI),
    circle2Pos.y,
    circle2Pos.z + circle2Radius * sin(oppositeRad + PI)
    );

    return array(circle1InnerTangent1, circle1InnerTangent2, circle2InnerTangent1, circle2InnerTangent2);
    }