I agree with your algorithm, DJ. Several such algorithms can be found on the web, often for computing compound miters for crown molding, which is essentially the same problem. But many of them give slightly different answers. Why is yours right, and what's wrong with the other ones?
If you don't want to see a bunch of crazy math, stop reading now.
One of the other common algoriths for computing the miter (x in your notation) is x=1/2*arccos(cos^2(b)*cos(a)+sin^2(b)). This is a pretty simple equation to derive using simple vector algebra. Going back to first semester Calculus, recall that the dot product of two vectors is defined as a scalar value equal to the product of the vector magnitudes times the cosine of the angle between them.
A.dot.B = |A| * |B| * cos(alpha),
where alpha is the angle formed between them, and the | | notation means magnitude (i.e. length, independent of direction).
A second way to calculate the dot product is to write the vectors as functions of the unit vectors i, j, and k which are simply vectors of length 1 along the x, y, and z axes. If the vectors are written as A = ax*i + ay*j + az*k and B = bx*i + by*j + bz*k then their dot product is simply
A.dot.B = ax*bx + ay*by + az*bz
Now if we simply find two vectors which form one wedge of the ten-sided roof, we can easily compute the angle between them by using the two definitions of dot product. It's an easy construction:
If we take the peak of the roof to be the point (0,0,0), and we imagine ten rafters radiating outward, angled down with a pitch (slope) of
5/12, then it's easy to find their endpoints (which will define our vectors). If we assume for simplicity's sake that they have a length of 1 foot, then one of the rafters would stretch from (0,0,0) to (cos(atan(5/12)),0,-sin(atan(5/12))). Since the choice of 5/12 for a pitch gives us a 5-12-13 right triangle, we can simpify the second coordinate of the vector to (12/13,0,-5/13). A second rafter would start at (0,0,0) and go to (12/13*cos(36), 12/13*sin(36), -5/13). The
36 degree angle is the angle of one wedge of roof when viewed from directly above (i.e. there are ten sides so the the angle is a tenth of
360).
Now that we have two vectors, we can compute their dot product both of the ways desribed above.
A.dot.B = |A| * |B| * cos (angle) = 1 * 1 * cos (alpha) = cos(alpha) A.dot.B = 12/13*12/13*cos(36) + 0*12/13*sin(36) + 5/13*5/13
Equating the two different definitions we get ((12/13)^2*cos(36) + (5/13)^2)= cos (alpha)
Thus alpha = arccos(0.83727) = 33.147 degrees.
This is the angle between the two vectors (i.e. the two roof rafters). The miter angle is simply going to be half of this angle, or
x = 16.57 degrees.
This is pretty close to what DJ's formula gives us, yet it's slightly different. Why?
I'll post the reason next. I don't want this one post to get too long.
Josh