A straight line is completely determined by the coordinates of its endpoints. A straight line having a definite length and direction but no definite location in space is a vector. In its most basic form its a single point. A vector and a point are both a 3-array of doubles. Make them a dynamic array.

The functions to calculate direction, midpt, cosines, addition and scalar multiplication of vectors all return an array of 3 doubles. The line subroutines work with arrays of 3 doubles. Where I have one point argument, assuming 0,0,0 for the other, I number the routine_1. Where I have two point arguments, I number the routine_2. Passing and assigning points cleans up the code to almost logo like clarity.

dim pt1() as double, pt2() as double

pt1 = pt(2, 4, 6)

pt2 = pt(1, 9, 10)

line1 pt1

line1 pt2

line2 pt1, pt2

line2 midpt1(pt1), midpt1(pt2)

Function pt(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 pt = pnt End Function Sub line1(pt1() As Double) 'line from origin to pt1 Dim lineobj As AcadLine Set lineobj = acadDoc.ModelSpace.AddLine(pt(0, 0, 0), pt1) End Sub Sub line2(pt1() As Double, pt2() As Double) 'line from pt1 to pt2 Dim lineobj As AcadLine Set lineobj = acadDoc.ModelSpace.AddLine(pt1, pt2) End Sub Sub line3(startpt1() As Double, vectorpt2() As Double) 'line from startpoint at vector distance and angle Dim lineobj As AcadLine Dim pt3() As Double pt3 = add_vectors(startpt1, vectorpt2) Set lineobj = acadDoc.ModelSpace.AddLine(startpt1, pt3) End Sub

Function dist1(pt1() As Double) As Double Dim x As Double, y As Double, z As Double x = pt1(0): y = pt1(1): z = pt1(2) dist1 = (x ^ 2 + y ^ 2 + z ^ 2) ^ (1 / 2) End Function Function dist2(pt1() As Double, pt2() As Double) As Double Dim x As Double, y As Double, z As Double x = pt2(0) - pt1(0) y = pt2(1) - pt1(1) z = pt2(2) - pt1(2) dist2 = (x ^ 2 + y ^ 2 + z ^ 2) ^ (1 / 2) End Function Function midpt1(pt1() As Double) As Double() Dim x As Double, y As Double, z As Double x = pt1(0): y = pt1(1): z = pt1(2) midpt1 = pt(x / 2, y / 2, z / 2) End Function Function midpt2(pt1() As Double, pt2() As Double) As Double() Dim x1 As Double, y1 As Double, z1 As Double x = (pt1(0) + pt2(0)) / 2 y = (pt1(1) + pt2(1)) / 2 z = (pt1(2) + pt2(2)) / 2 midpt2 = pt(x, y, z) End Function Function dir_cosines1(pt1() As Double) As Double() Dim cos_alpha As Double, cos_beta As Double, cos_gamma As Double Dim d As Double d = dist1(pt1) If d = 0 Then dir_cosines1 = pt(0, 0, 0) Exit Function End If cos_alpha = pt1(0) / d cos_beta = pt1(1) / d cos_gamma = pt1(2) / d dir_cosines1 = pt(cos_alpha, cos_beta, cos_gamma) End Function Function dir_cosines2(pt1() As Double, pt2() As Double) As Double() Dim cos_alpha As Double, cos_beta As Double, cos_gamma As Double Dim d As Double d = dist1(pt1) If d = 0 Then dir_cosines2 = pt(0, 0, 0) Exit Function End If cos_alpha = (pt2(0) - pt1(0)) / d cos_beta = (pt2(1) - pt1(1)) / d cos_gamma = (pt2(2) - pt1(2)) / d dir_cosines2 = pt(cos_alpha, cos_beta, cos_gamma) End Function Function dir_angle(dir_cosine As Double) As Double dir_angle = WorksheetFunction.Acos(dir_cosine) dir_angle = rad2deg(dir_angle) End Function Function add_vectors(pt1() As Double, pt2() As Double) As Double() add_vectors = pt(pt1(0) + pt2(0), pt1(1) + pt2(1), pt1(2) + pt2(2)) End Function Function mult_vector(n As Double, pt1() As Double) As Double() mult_vector = pt(n * pt1(0), n * pt1(1), n * pt1(2)) End Function

Sub test5() Call Connect_Acad pt1 = pt(2, 4, 6) pt2 = pt(1, 9, 10) line1 pt1 line1 pt2 line2 midpt1(pt1), midpt1(pt2) Dim cosines() As Double cosines = dir_cosines1(pt1) pt3 = mult_vector(10, cosines) 'makes a line 10 in length along same line as pt1 line1 pt3 'alpha angle Debug.Print dir_angle(cosines(0)) End Sub Sub test6() Call Connect_Acad pt1 = pt(5, 1, 2) pt2 = pt(1, 2, 3) pt3 = add_vectors(pt1, pt2) line1 pt1 line3 pt1, pt2 line1 pt3 acadApp.Update End Sub