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 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, _
         blockrefObj.Rotate endpt2, alpha
      'these are just for reference
       Call set_ucs(px1, py2, pz1, _
                  px1, py2 + 1, pz1, _
                  px2, py2, pz2, _

       Call set_ucs(px1, py1, pz2, _
                  px1, py1, pz2 + 1, _
                  px2, py2, pz2, _

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 ucsObj As AcadUCS
    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

   Set ucsObj = acadDoc.UserCoordinateSystems.Add(originPt, xAxisPt, yAxisPt, strname)
    acadDoc.ActiveUCS = ucsObj

 End Sub

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.