# 3D Vector Angle

The angle of a 3D vector is the angle from the vector directly to each of the 3 positive axes. The angles are named alpha (x-axis), beta(y-axis) and gamma(z-axis). They are always positive and between 0 and 180 inclusive. They are called direction angles.

The arrowhead is inserted at rotation angle 0 at the endpoint of the vector then rotated. 2D rotation rotates around a point that is actually an axis normal (perpendicular) to the current UCS. The easiest way to rotate the arrowhead into position is to make a UCS that includes the plane of the alpha (or beta or gamma) angle between the vector and the axis. if the vector does not have a startpoint at the origin, a line parallel to the axis at the startpoint of the vector is used. after the ucs is made, the arrowhead is inserted and rotated by the alpha angle. the same procedure works for the other axes and direction angles.

how can the arrowhead be moved into position with only one rotation? If the vector is located by two angles, the third angle can be calculated. Imagine standing up a vector and dimensioning two angles, the other angle is fixed. the first rotation is the rotation of the ucs, the second angle is the alpha and final rotation needed.

The VBA UCS method uses 3 points, a new origin, a point on the postive new x-axis and a point on the positive new y-axis. Its very easy to work with but it required 3 points that form a right angle. Draw a line from the end of the vector perpendicular to the axis. that is the projection of the vector on the axis and the new origin point on the axis. another point any distance in the direction of the positive axis is the second point. The new y-axis point is the endpoint of the vector.

``` '3D Vectors
set_wcs

Set blockrefObj = acadDoc.ModelSpace.InsertBlock(endpt2, blkname, 0.375, 0.375, 0.375, 0)

Call set_ucs(px2, py1, pz1, _
px2 + 1, py1, pz1, _
px2, py2, pz2, _
"UCS_alpha")

blockrefObj.Rotate endpt2, alpha

'these are just for reference
Call set_ucs(px1, py2, pz1, _
px1, py2 + 1, pz1, _
px2, py2, pz2, _
"UCS_beta")

Call set_ucs(px1, py1, pz2, _
px1, py1, pz2 + 1, _
px2, py2, pz2, _
"UCS_gamma")
set_wcs

Sub set_ucs(x1 As Double, y1 As Double, z1 As Double, _
x2 As Double, y2 As Double, z2 As Double, _
x3 As Double, y3 As Double, z3 As Double, strname As String)
'pt1 is origin, pt2 is xaxis, pt3 is yaxis

Dim originPt(0 To 2) As Double
Dim xAxisPt(0 To 2) As Double
Dim yAxisPt(0 To 2) As Double

originPt(0) = x1: originPt(1) = y1: originPt(2) = z1
xAxisPt(0) = x2: xAxisPt(1) = y2: xAxisPt(2) = z2
yAxisPt(0) = x3: yAxisPt(1) = y3: yAxisPt(2) = z3