|
|
Reducing the bound volume seems to keep the
errors smaller when estimating the object volume.
#macro reduce_bounding(Obj)
#local num = 360;
#local mn = min_extent(Obj);
#local mx = max_extent(Obj);
#local O = object{ Obj // center
translate <-1*(mx.x-mn.x),-1*(mx.y-mn.y),-1*(mx.z-mn.z)>};
#local BVol = (mx.x-mn.x)*(mx.y-mn.y)*(mx.z-mn.z);
#local RotY = 0;
#local c = 1;
#while (c<num)
#local OY = object{O rotate <0,(360/num)*c,0>};
#local mn = min_extent(OY);
#local mx = max_extent(OY);
#local TV = (mx.x-mn.x)*(mx.y-mn.y)*(mx.z-mn.z);
#if (BVol > TV )
#local BVol = TV;
#local RotY = (360/num)*c;
#end
#local c = c + 1;
#end
#local O = object{O rotate <0,(360/num)*RotY,0>};
#local mn = min_extent(O);
#local mx = max_extent(O);
#local RotX = 0;
#local c = 1;
#while (c<num)
#local OX = object{O rotate <(360/num)*c,0,0>};
#local mn = min_extent(OX);
#local mx = max_extent(OX);
#local TV = (mx.x-mn.x)*(mx.y-mn.y)*(mx.z-mn.z);
#if (BVol > TV )
#local BVol = TV;
#local RotX = (360/num)*c;
#end
#local c = c + 1;
#end
#local O = object{O rotate <(360/num)*RotX,0,0>};
#local mn = min_extent(O);
#local mx = max_extent(O);
#local RotZ = 0;
#local c = 1;
#while (c<num)
#local OZ = object{O rotate <0,0,(360/num)*c>};
#local mn = min_extent(OZ);
#local mx = max_extent(OZ);
#local TV = (mx.x-mn.x)*(mx.y-mn.y)*(mx.z-mn.z);
#if (BVol > TV )
#local BVol = TV;
#local RotZ = (360/num)*c;
#end
#local c = c + 1;
#end
#local O = object{O rotate <0,0,(360/num)*RotZ>};
object{O}
#end
Post a reply to this message
|
|