[OpenSCAD] Minkowski sum slowness
Giles Bathgate
giles.bathgate at gmail.com
Tue Mar 22 22:42:46 CET 2011
I have been doing some further investigation regarding minkowski sum slowness.
My hypothesis was that openscad spheres have much more facets than neccecery
to prove my hypothesis I created a sphere in terms of simpler
primitives e.g. circle, and
rotate_extrude
module halfcircle(r) {
difference() {
circle(r);
translate([-r,0])square([r*2,r]);
}
}
module sphere_alternate(r) {
rotate_extrude()
rotate([0,0,90])halfcircle(r);
}
$fn=20;
minkowski() {
cube([20,20,30]);
sphere_alternate(5);
}
I then compiled this script:
Parsing design (AST generation)...
Compiling design (CSG Tree generation)...
Compilation finished.
Compiling design (CSG Products generation)...
Processing uncached minkowski statement...
..rendering time: 0 hours, 0 minutes, 59 seconds
Compiling design (CSG Products normalization)...
CSG generation finished.
Total rendering time: 0 hours, 1 minutes, 0 seconds
With comparison to the standard sphere script:
$fn=20;
minkowski() {
cube([20,20,30]);
sphere(5);
}
You can see this is about twice as slow:
Parsing design (AST generation)...
Compiling design (CSG Tree generation)...
Compilation finished.
Compiling design (CSG Products generation)...
Processing uncached minkowski statement...
..rendering time: 0 hours, 2 minutes, 26 seconds
Compiling design (CSG Products normalization)...
CSG generation finished.
Total rendering time: 0 hours, 2 minutes, 27 seconds
Looking at the primitives.cc code for the built-in sphere you can see
that the reason for this is that the number of fragments is calculated
on a per ring basis. What it means is that when viewed from above
(with $fn set to 10 for example) you can see that the sphere's
projection (or outermost ring) is a 10 sided circle, however when
viewed from the front the sphere projection has many more sides.
I experimented with setting the number of fragments identical for
every ring in the sphere, and setting the number of rings to half the
number of fragments this gives a "symmetrical sphere", in that it
looks the same when viewed from any direction
I have pushed a patch for this to
http://gitorious.org/openscad/openscad/commits/sphere-cylinder-optimisation
After this patch is applied with the default settings (i.e. $fn not
set) the sphere has a much better appearance imho.
More interestingly the same script as in the original post is about
twice the speed.
$fn=50;
minkowski()
{
cube([10,10,1]);
sphere(r=2,h=1);
}
Parsing design (AST generation)...
Compiling design (CSG Tree generation)...
Compilation finished.
Compiling design (CSG Products generation)...
Processing uncached minkowski statement...
..rendering time: 0 hours, 8 minutes, 54 seconds
Compiling design (CSG Products normalization)...
CSG generation finished.
Total rendering time: 0 hours, 8 minutes, 54 seconds
More information about the OpenSCAD
mailing list