Skip to content

Instantly share code, notes, and snippets.

@hyperair
Created April 30, 2015 10:17
Show Gist options
  • Select an option

  • Save hyperair/55599c8a5ed750e78dea to your computer and use it in GitHub Desktop.

Select an option

Save hyperair/55599c8a5ed750e78dea to your computer and use it in GitHub Desktop.
use <MCAD/general/sweep.scad>
use <MCAD/general/facets.scad>
use <scad-utils/shapes.scad>
use <scad-utils/transformations.scad>
$fs = 0.4;
$fa = 1;
function cot (angle) = 1 / tan (angle);
module elliptical_torus (r_x, r_y, cross_section_r)
{
cross_section = circle (r = cross_section_r,
$fn = get_fragments_from_r (cross_section_r));
// from http://math.stackexchange.com/questions/432902/
function radius_at_angle (angle) = (
(r_x * r_y) /
sqrt (pow (r_x * sin (angle), 2) + pow (r_y * cos (angle), 2))
);
// g, flattening factor as per wiki
flattening_factor = 1 - r_y / r_x;
function tangential_angle (polar_angle) = (
((polar_angle % 360 > 180) ? 180 : 0) +
atan (-1 / (tan (polar_angle) / pow (1 - flattening_factor, 2)))
);
sweep (
cross_section,
[
for (t = gen_facet_series (min (r_x, r_y)))
let (angle = t * 360)
translation ([r_x * cos (angle), r_y * sin (angle), 0]) *
rotation ([0, 0, 90 + tangential_angle (angle)]) *
rotation ([90, 0, 0])
],
true
);
}
elliptical_torus (r_x = 40, r_y = 20, cross_section_r = 2);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment