Here in the last in our series on making a sundial using OpenSCAD we need to finish the dial by draw the hour numbers. We know that the hour angle as measured at the foot of the gnomon is:
tan(theta) = sin(lat)*sin(HA)
where HA is the hour angle from noon (15 deg for each hour)
lat is the latitude
theta is the hour line
theta = atan2(sin(lat)*sin(HA), cos(HA))
ao = 1
bo = -2*goffset*cos(theta)
co = goffset^2 - crad^2
The idea is to set up a loop for drawing the hour numbers. Let's say that we want to put down the numbers 5(am) to 7(pm). On a 24 hour scale, that's H = 5:19. Meanwhile that hour angle referenced to the 12-noon hour is HA = 15*(H-12) degrees.
//text of one hour number
if (H>12) {
txt3 = str(H-12);
}else{
txt3 = str(H)
}
//classic hour line
theta = atan2(sin(latitude)*sin(HA),cos(HA));
if H {
wo = gnomon_width;
}else{
wo = -gnomon_width;
}
//this is a distance goffset from the dial center. We need to use the quadratic
//equation to get the distance from the gnomon foot to a circular arc (chapter ring)
//of radius crad where our numbers will be placed...
push = 1.15; //tweak to move the number a bit further out on the dial face
ao = 1;
bo = -2*goffset*cos(theta);
co = goffset*goffset - crad*crad;
zo = push*abs((-bo - sqrt(bo*bo-4*co))/(2*ao));
//translate this to the dial x,y coordinate system
xo = zo*sin(theta) + wo/2; //remember that wo may be positive or negative
yo = zo*cos(theta) + goffset; //goffset is a negative number since moved gnomon south of center
//print the number
translate([xo,yo,dial_thickness]) //raise the number to sit at the top of the dial face thickness
linear_extrude(height = ho) //ho is the thickness (height) of our number
text(txt3, size = 4.5, halign = "center",font = str("Angsana:style=Bold"), $fn = 16);
}
The final OpenSCAD code to create this simple horizontal sundial is attached. Download it and have fun.