Download this thing or ask me how I made it at thingiverse.com
back
truncated dodecahedron dual

union()
{
for(m=[0:1])
{
     rotate([0, 180*m, 0])
     {
         for(l=[0:1])
         {
             rotate([180*l, 0, 0])
             {
                 for(k=[0:4])
                 {
                     phi = (1+sqrt(5))/2;
                     rotate(72*k, [1, 0, phi]) //around the vertex of an icosahedron
                     {
                         /////////////////////////////begin rhombus
b = [-0.894427, -2.34164, 4.68328];
c = [0, 0.894427, 5.23607];
d = [0, -0.894427, 5.23607];
e = [0.894427, -2.34164, 4.68328];
f = [-0.894427, 2.34164, 4.68328];
g = [0.894427, 2.34164, 4.68328];



triples = [
b, d, e,
d, c, f,
d, c, f,
d, c, g,
b, d, e,
d, c, g,
d, c, f,
c, f, g,
d, c, g,
c, f, g,
];



for(z=[0:4])
{
     A = triples[2*(3*z)];
     B = triples[2*(3*z)+1];
     C = triples[2*(3*z+1)];
     D = triples[2*(3*z+1)+1];
     E = triples[2*(3*z+2)];
     F = triples[2*(3*z+2)+1];
    
     hull()
     {
         x1 = A[0];
         y1 = A[1];
         z1 = A[2];
         x4 = B[0];
         y4 = B[1];
         z4 = B[2];
         x3 = C[0];
         y3 = C[1];
         z3 = C[2];
        
         // normal vector to the plane for the polar
         x2 = (y1-y4)*(z1-z3)-(y1-y3)*(z1-z4);
         y2 = -1*((x1-x4)*(z1-z3)-(x1-x3)*(z1-z4));
         z2 = (x1-x4)*(y1-y3)-(x1-x3)*(y1-y4);

         // truncation vertex
         xt = x2 / (x2*x1+y2*y1+z2*z1);
         yt = y2 / (x2*x1+y2*y1+z2*z1);
         zt = z2 / (x2*x1+y2*y1+z2*z1);
         translate([xt, yt, zt])
         {
             sphere($fn=50, .01, true);
         }
        
         x5 = D[0];
         y5 = D[1];
         z5 = D[2];
         x6 = E[0];
         y6 = E[1];
         z6 = E[2];
         x7 = F[0];
         y7 = F[1];
         z7 = F[2];
        
         // normal vector to the plane for the polar
         x8 = (y5-y6)*(z5-z7)-(y5-y7)*(z5-z6);
         y8 = -1*((x5-x6)*(z5-z7)-(x5-x7)*(z5-z6));
         z8 = (x5-x6)*(y5-y7)-(x5-x7)*(y5-y6);

         // truncation vertex
         xt2 = x8 / (x8*x5+y8*y5+z8*z5);
         yt2 = y8 / (x8*x5+y8*y5+z8*z5);
         zt2 = z8 / (x8*x5+y8*y5+z8*z5);
         translate([xt2, yt2, zt2])
         {
             sphere($fn=50, .01, true);
         }
     }
}
                         ////////////////////////// end rhombus
                     }
                 }
             }
         }
     }
}



////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////
rotate([90, 0, 90])
{
for(m=[0:1])
{
     rotate([0, 180*m, 0])
     {
         for(l=[0:1])
         {
             rotate([180*l, 0, 0])
             {
                 for(k=[0:4])
                 {
                     phi = (1+sqrt(5))/2;
                     rotate(72*k, [1, 0, phi])
                     {
                         /////////////////////////////begin rhombus
b = [-0.894427, -2.34164, 4.68328];
c = [0, 0.894427, 5.23607];
d = [0, -0.894427, 5.23607];
e = [0.894427, -2.34164, 4.68328];
f = [-0.894427, 2.34164, 4.68328];
g = [0.894427, 2.34164, 4.68328];



triples = [
b, d, e,
d, c, f,
d, c, f,
d, c, g,
b, d, e,
d, c, g,
d, c, f,
c, f, g,
d, c, g,
c, f, g,
];



for(z=[0:4])
{
     A = triples[2*(3*z)];
     B = triples[2*(3*z)+1];
     C = triples[2*(3*z+1)];
     D = triples[2*(3*z+1)+1];
     E = triples[2*(3*z+2)];
     F = triples[2*(3*z+2)+1];
    
     hull()
     {
         x1 = A[0];
         y1 = A[1];
         z1 = A[2];
         x4 = B[0];
         y4 = B[1];
         z4 = B[2];
         x3 = C[0];
         y3 = C[1];
         z3 = C[2];
        
         // normal vector to the plane for the polar
         x2 = (y1-y4)*(z1-z3)-(y1-y3)*(z1-z4);
         y2 = -1*((x1-x4)*(z1-z3)-(x1-x3)*(z1-z4));
         z2 = (x1-x4)*(y1-y3)-(x1-x3)*(y1-y4);

         // truncation vertex
         xt = x2 / (x2*x1+y2*y1+z2*z1);
         yt = y2 / (x2*x1+y2*y1+z2*z1);
         zt = z2 / (x2*x1+y2*y1+z2*z1);
         translate([xt, yt, zt])
         {
             sphere($fn=50, .01, true);
         }
        
         x5 = D[0];
         y5 = D[1];
         z5 = D[2];
         x6 = E[0];
         y6 = E[1];
         z6 = E[2];
         x7 = F[0];
         y7 = F[1];
         z7 = F[2];
        
         // normal vector to the plane for the polar
         x8 = (y5-y6)*(z5-z7)-(y5-y7)*(z5-z6);
         y8 = -1*((x5-x6)*(z5-z7)-(x5-x7)*(z5-z6));
         z8 = (x5-x6)*(y5-y7)-(x5-x7)*(y5-y6);

         // truncation vertex
         xt2 = x8 / (x8*x5+y8*y5+z8*z5);
         yt2 = y8 / (x8*x5+y8*y5+z8*z5);
         zt2 = z8 / (x8*x5+y8*y5+z8*z5);
         translate([xt2, yt2, zt2])
         {
             sphere($fn=50, .01, true);
         }
     }
}
                         ////////////////////////// end rhombus
                     }
                 }
             }
         }
     }
}
}

for(z=[0:1])
rotate([0, 0, 180*z])
{
rotate([90, 0, 0])
{
rotate([0, 0, 90])
{
b = [-0.894427, -2.34164, 4.68328];
c = [0, 0.894427, 5.23607];
d = [0, -0.894427, 5.23607];
e = [0.894427, -2.34164, 4.68328];
f = [-0.894427, 2.34164, 4.68328];
g = [0.894427, 2.34164, 4.68328];



triples = [
b, d, e,
d, c, f,
d, c, f,
d, c, g,
b, d, e,
d, c, g,
d, c, f,
c, f, g,
d, c, g,
c, f, g,
];



for(z=[0:4])
{
     A = triples[2*(3*z)];
     B = triples[2*(3*z)+1];
     C = triples[2*(3*z+1)];
     D = triples[2*(3*z+1)+1];
     E = triples[2*(3*z+2)];
     F = triples[2*(3*z+2)+1];
    
     hull()
     {
         x1 = A[0];
         y1 = A[1];
         z1 = A[2];
         x4 = B[0];
         y4 = B[1];
         z4 = B[2];
         x3 = C[0];
         y3 = C[1];
         z3 = C[2];
        
         // normal vector to the plane for the polar
         x2 = (y1-y4)*(z1-z3)-(y1-y3)*(z1-z4);
         y2 = -1*((x1-x4)*(z1-z3)-(x1-x3)*(z1-z4));
         z2 = (x1-x4)*(y1-y3)-(x1-x3)*(y1-y4);

         // truncation vertex
         xt = x2 / (x2*x1+y2*y1+z2*z1);
         yt = y2 / (x2*x1+y2*y1+z2*z1);
         zt = z2 / (x2*x1+y2*y1+z2*z1);
         translate([xt, yt, zt])
         {
             sphere($fn=50, .01, true);
         }
        
         x5 = D[0];
         y5 = D[1];
         z5 = D[2];
         x6 = E[0];
         y6 = E[1];
         z6 = E[2];
         x7 = F[0];
         y7 = F[1];
         z7 = F[2];
        
         // normal vector to the plane for the polar
         x8 = (y5-y6)*(z5-z7)-(y5-y7)*(z5-z6);
         y8 = -1*((x5-x6)*(z5-z7)-(x5-x7)*(z5-z6));
         z8 = (x5-x6)*(y5-y7)-(x5-x7)*(y5-y6);

         // truncation vertex
         xt2 = x8 / (x8*x5+y8*y5+z8*z5);
         yt2 = y8 / (x8*x5+y8*y5+z8*z5);
         zt2 = z8 / (x8*x5+y8*y5+z8*z5);
         translate([xt2, yt2, zt2])
         {
             sphere($fn=50, .01, true);
         }
     }
}
}
}
}
}