# Vectors in the Plane ```
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"

vec_draw1 R, "A+B"

vec_draw1 R, "A+C"

vec_draw1 R, "A+D"

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

If Not IsMissing(str_text) Then
txt1 CStr(str_text), pt1, 0.25
End If
End Sub

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

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)

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)
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
'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
vec_ang = Atn(m)
End If

If x < 0 And y > 0 Then  'Second Q
vec_ang = Pi + Atn(m)
End If

If x < 0 And y < 0 Then  'Third Q
vec_ang = Pi + Atn(m)
End If

If x > 0 And y < 0 Then  'Fourth Q
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 pt3() As Double

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