# Vectors 3 This is my third try at vectors. It starts with basic vector algebra.

A vector is an ordered triple of numbers, representing the xyz coordinates of the head, the tail at 0,0,0. A vector and a point have the same structure, an array of 3 doubles. Vector algebra functions accept a vector as input and return the calculated vector. Position comes into play when we want to display the vector in autocad. (these are NOT all debugged on first draft)

Here are the elementary vector functions.
Plus (U,V) returns vector U + V
Minus (U,V) returns vector U – V
Scalar(c, U) returns vector c * U
Dot(U, V) returns double dot product
Leng(U) returns double length of vector
UnitV(U) returns unit vector along U
Dist(U, V) returns double distance between vectors
Angle(U, V) returns angle between vectors as double in radians
Ortho(U, V) returns boolean True if vectors are perpendicular
Proj(U, V) returns vector V projected on U
Neg(U) returns negative vector

Draw(vec) Draws vector in autocad as simple line

the function to create a point takes the triples input and returns the array of 3 doubles.

dim pt1() as double
pt1 = PT(1,2,3)

this is used as the basic vector creation function.

```dim u() as double
u= VEC(1,2,3)

Function vec(x As Double, y As Double, z As Double) As Double()
Dim pnt(0 To 2) As Double
pnt(0) = x: pnt(1) = y: pnt(2) = z
vec = pnt
End Function
```
```Function plus(u() As Double, v() As Double) As Double()
Dim w(0 To 2) As Double
w(0) = u(0) + v(0)
w(1) = u(1) + v(1)
w(2) = u(2) + v(2)

plus = w
End Function

Function scalar(c As Double, u() As Double) As Double()
Dim w(0 To 2) As Double
w(0) = c * u(0)
w(1) = c * u(1)
w(2) = c * u(2)

scalar = w
End Function

Function minus(u() As Double, v() As Double) As Double()
Dim w(0 To 2) As Double
w(0) = u(0) - v(0)
w(1) = u(1) - v(1)
w(2) = u(2) - v(2)

minus = w
End Function

Function dot(u() As Double, v() As Double) As Double
Dim w As Double
w = u(0) * v(0) + u(1) * v(1) + u(2) * v(2)
dot = w
End Function

Function leng(u() As Double) As Double
Dim w As Double
w = u(0) ^ 2 + u(1) ^ 2 + u(2) ^ 2
w = Sqr(w)

leng = w
End Function

Function unitv(u() As Double) As Double()
Dim w() As Double
Dim L As Double

L = leng(u)
w = scalar(1 / L, u)

unitv = w
End Function

Function dist(u() As Double, v() As Double) As Double
Dim L As Double
L = leng(minus(u, v))

dist = L
End Function

Function angle(u() As Double, v() As Double) As Double
Dim Dot_UV As Double
Dim len_U As Double
Dim len_V As Double
Dim cos_theta As Double

Dot_UV = dot(u, v)
len_U = leng(u)
len_V = leng(v)

cos_theta = Dot_UV / (len_U * len_V)

angle = WorksheetFunction.Acos(cos_theta)
End Function

Function ortho(u() As Double, v() As Double) As Boolean
Dim w As Double
w = dot(u, v)

If w = 0 Then
ortho = True
Else
ortho = False
End If
End Function

Function proj(u() As Double, v() As Double) As Double()
Dim w() As Double
Dim x As Double
Dim Dot_UV As Double
Dim Dot_UU As Double

x = Dot_UV / Dot_UU
w = scalar(x, u)

proj = w
End Function

Function neg(u() As Double) As Double()
Dim w(0 To 2) As Double
w(0) = -1 * u(0)
w(1) = -1 * u(1)
w(2) = -1 * u(2)

neg = w
End Function

```

To draw a vector in autocad, this is borrowed from the line wrapper, I kept the optional layer parameter even though i dont intend to use it much at first.

g_pt is a public point variable, same as a vector, if we set it each time, its easy to draw vectors end to end.
we could save the newly created line object the same way, and sometimes thats useful, but i removed it for now.

```
Public u() As Double
Public v() As Double
Public g_pt() As Double

Sub draw(vec() As Double, startpt() As Double, Optional strlayer As Variant)
Dim endpt() As Double

endpt = pt(vec(0) + startpt(0), vec(1) + startpt(1), vec(2) + startpt(2))