Skip to content

Instantly share code, notes, and snippets.

@thu0x31
Created May 21, 2022 17:03
Show Gist options
  • Save thu0x31/eb7927ed6a463800777b829c82d5002f to your computer and use it in GitHub Desktop.
Save thu0x31/eb7927ed6a463800777b829c82d5002f to your computer and use it in GitHub Desktop.
OuterTangents vex
function vector[] outerTangents(vector circle1Pos, circle2Pos;
float circle1Radius, circle2Radius) {
float hypotenuse = distance(circle1Pos, circle2Pos);
float shortEdgeLen = circle1Radius - circle2Radius;
// xz
float rad = atan2(circle2Pos.z - circle1Pos.z, circle2Pos.x - circle1Pos.x)
+ acos(shortEdgeLen/hypotenuse);
vector circle1OuterTangent1 = set(
circle1Pos.x + circle1Radius * cos(rad),
circle1Pos.y,
circle1Pos.z + circle1Radius * sin(rad)
);
vector circle2OuterTangent1 = set(
circle2Pos.x + circle2Radius * cos(rad),
circle2Pos.y,
circle2Pos.z + circle2Radius * sin(rad)
);
float oppositeRad = atan2(circle2Pos.z - circle1Pos.z, circle2Pos.x - circle1Pos.x)
- acos(shortEdgeLen/hypotenuse);
vector circle1OuterTangent2 = set(
circle1Pos.x + circle1Radius * cos(oppositeRad),
circle1Pos.y,
circle1Pos.z + circle1Radius * sin(oppositeRad)
);
vector circle2OuterTangent2 = set(
circle2Pos.x + circle2Radius * cos(oppositeRad),
circle2Pos.y,
circle2Pos.z + circle2Radius * sin(oppositeRad)
);
return array(circle1OuterTangent1, circle1OuterTangent2, circle2OuterTangent1, circle2OuterTangent2);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment