Dim A() As Double, B() As Double Dim C() As Double, D() As Double Dim R() As Double A = pt(4, 1, 0) B = pt(2, -3, 0) C = pt(-2, 2, 0) D = pt(-3, -2, 0) vec_draw1 A, "A" vec_draw1 B, "B" vec_draw1 C, "C" vec_draw1 D, "D" R = v_add(A, B) vec_draw1 R, "A+B" R = v_add(A, C) vec_draw1 R, "A+C" R = v_add(A, D) vec_draw1 R, "A+D" R = v_add3(A, B, C) vec_draw1 R, "A+B+C" R = vec_add_2(1, A, 2, B) vec_draw1 R, "A+2B" R = vec_add_2(1, A, -3, C) vec_draw1 R, "A-3C" R = v_add3(A, C, v_m(1 / 3, D)) vec_draw1 R, "A+C+1/3D" Sub vec_draw1(pt1() As Double, Optional str_text As Variant) 'line from origin to pt1 Dim lineobj As AcadLine Set lineobj = acadDoc.ModelSpace.AddLine(pt(0, 0, 0), pt1) If Not IsMissing(str_text) Then txt1 CStr(str_text), pt1, 0.25 End If End Sub 'add 2 vectors, return vector Function v_add(pt1() As Double, pt2() As Double) As Double() v_add = pt(pt1(0) + pt2(0), pt1(1) + pt2(1), pt1(2) + pt2(2)) End Function 'multiply scalar by vector, return vector Function v_m(m As Double, pt1() As Double) As Double() v_m = pt(m * pt1(0), m * pt1(1), m * pt1(2)) End Function 'add 3 vectors, return vector Function v_add3(pt1() As Double, pt2() As Double, pt3() As Double) As Double() v_add3 = pt(pt1(0) + pt2(0) + pt3(0), pt1(1) + pt2(1) + pt3(1), pt1(2) + pt2(2) + pt3(2)) End Function 'add 2 vectors each multiplied by a scalar, A-B would be vec_add_2(1, A, -1, B) Function vec_add_2(m As Double, pt1() As Double, n As Double, pt2() As Double) As Double() Dim temp1() As Double, temp2() As Double temp1 = v_m(m, pt1) temp2 = v_m(n, pt2) vec_add_2 = v_add(temp1, temp2) End Function

it would be possible to do this on one line but it would be hard to read.

Dim temp1() As Double, temp2() As Double temp1 = vec_add_2(2, A, -3, B) temp2 = vec_add_2(-3, C, 4, D) R = v_add(temp1, temp2) vec_draw1 R, "2A-3B-3C+4D"

Length and Direction –

Function vec_len(pt1() As Double) As Double Dim x As Double, y As Double, z As Double x = pt1(0): y = pt1(1): z = pt1(2) vec_len = (x ^ 2 + y ^ 2 + z ^ 2) ^ (1 / 2) End Function

Dividing a vector by the length (multiplying by the inverse of the length) produces a vector with length one in the same direction –

The angle of a 2D vector is a directed line measured from the positive X axis. It takes a value between 0 and 360 degrees not including 360 or 0 and 2 pi not including 2 pi. The inverse tangent is used with y/x as argument. Tangent returns an angle for an undirected line between -90 to +90 or -pi/2 to +pi/2. The code is a bit tedious but its pretty straightforward. We have to trap out zero values of x, to avoid divide by zero, then check for zeros of y and interpret, then retrieve the value for the inverse tangent and interpret according to which quadrant the head of the vector is in.

Function vec_ang(pt1() As Double) As Double 'returns angle in radians 'check for zero length vector return 0 for angle Dim x As Double, y As Double x = pt1(0) y = pt1(1) If x = 0 And y = 0 Then vec_ang = 0 Exit Function End If 'get axis directions If x = 0 Or y = 0 Then If y = 0 And x > 0 Then vec_ang = 0 If x = 0 And y > 0 Then vec_ang = Pi / 2 If y = 0 And x < 0 Then vec_ang = Pi If x = 0 And y < 0 Then vec_ang = 3 * Pi / 2 Exit Function End If 'calculate m tangent Dim m As Double m = y / x If x > 0 And y > 0 Then 'First Q 'Debug.Print rad2deg(Atn(m)) vec_ang = Atn(m) End If If x < 0 And y > 0 Then 'Second Q 'Debug.Print rad2deg(Atn(m)) vec_ang = Pi + Atn(m) End If If x < 0 And y < 0 Then 'Third Q 'Debug.Print rad2deg(Atn(m)) vec_ang = Pi + Atn(m) End If If x > 0 And y < 0 Then 'Fourth Q 'Debug.Print rad2deg(Atn(m)) vec_ang = 2 * Pi + Atn(m) End If End Function

Sub vec_draw3(startpt1() As Double, vectorpt2() As Double, Optional str_text As Variant) 'line from startpoint at vector distance and angle Dim lineobj As AcadLine Dim pt3() As Double pt3 = v_add(startpt1, vectorpt2) Set lineobj = acadDoc.ModelSpace.AddLine(startpt1, pt3) If Not IsMissing(str_text) Then txt1 CStr(str_text), pt1, 0.25 End If End Sub

triangles with random vertexes and medians – (I moved them after the program drew them)

Sub vec_draw2(pt1() As Double, pt2() As Double, Optional str_text As Variant) 'simple line from pt1 to pt2 Dim lineobj As AcadLine Set lineobj = acadDoc.ModelSpace.AddLine(pt1, pt2) If Not IsMissing(str_text) Then txt1 CStr(str_text), midpt2(pt1, pt2), 0.25 End If End Sub