Hi Wayne, are these arcs all in the world x/y plane (the Top view's plane)?
So the concept of being CW or CCW is with respect to a plane normal, so I think you'll need to incorporate that.
See if this makes sense:
So you have a point on the arc, and the tangent vector. Make a second vector from the point on the arc to the arc's center point.
If you now take the CrossProduct( tangent, towards_center_vector ), that will generate a normal, either the same as your plane normal for the CCW arc, or opposite it for the CW arc. When comparing normals it's not a good idea to test for total equality, due to tiny roundoffs in floating point mathematics you can easily end up with values like 0.00000000000001 instead of 0, so you want to allow some epsilon/tolerance slack in your test.
Something like:
var eps = 1.0e-10;
function IsEqual( x, y )
{
return Math.abs( x - y ) < eps;
}
function IsEqual( vec1, vec2 )
{
return IsEqual( vec1.x, vec2.x ) && IsEqual( vec1.y, vec2.y ) && IsEqual( vec1.z, vec2.z );
}
Or another way you can compare normalized vectors is by dotproduct between them which gives the cosine of the angle between them. So something like
function VectorsAreSameDir( vec1, vec2 )
{
return DotProduct( vec1 /*normalized*/, vec2 /*normalized*/ ) > 0.99984769515639123915 (this number is the cosine of 1 degree).
}
Let me know if that doesn't do what you need.
- Michael