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 lineobj As acadline Dim endpt() As Double endpt = pt(vec(0) + startpt(0), vec(1) + startpt(1), vec(2) + startpt(2)) Set lineobj = acadDoc.ModelSpace.AddLine(startpt, endpt) If Not IsMissing(strlayer) Then lineobj.Layer = strlayer End If g_pt = endpt End Sub