# Vectors and Geometry

exercises from “Linear Algebra”, David Poole, 2006, Thomson

To find a number half-way between two numbers, add them then divide by two. Similarly, to find a midpoint of a line add the coordinates of the endpoints and divide by two.

Since a vector and a point have the same data structure, to find a vector half way between two other vectors, it has a different notation, but it breaks down to the same calculation.

We use the standard notation to show points as Capitals. Vectors to those points are lower case. VBA vector variables are lower case. VBA points will be as ptA, ptB etc, although since Points and Vectors in VBA have identical data structures we dont need to double declare. Vectors are mobile. The algebra of vectors does not depend on position. To draw them in autocad, a start position is specified.

Given two vectors a and b, the vector from a to b is b-a. This is practically the definition of a vector. In autocad a line has a startpoint and endpoint. The vector represented by that line is the difference from start to finish. The line can be moved or copied, and as long as it is not rotated or stretched, it represents the same vector. The total difference of the coordinates is the vector. Autocad Lines have properties of DeltaX, DeltaY and DeltaZ. These do not change when the line is copied and moved. They are the vector.

If we take a line with endpoints A and B, the vectors from the origin to those points are a and b. If we define a vector from the origin to the midpoint of the line as m, then the vector from a to m is m-a. m-a is already defined as 1/2 (b-a), so we have an equation that we can simplify to get the result – given two points A and B, the vector to the midpoint is m = 1/2 (a + b).

In this diagram a parallelogram diagonal shows the result of adding two vectors. When they are subtracted the result is represented by the diagonal between them. The diagonals bisect each other, so that in this case half of the long diagonal, 1/2 (a + b) is equal to m.

To find a point a third of the way between two points, or in general any fraction, requires to go back to the original equation.

Vector algebra can be used to prove and illustrate geometry.

A line from the midpoints of two sides of a triangle is half the length and parallel to the other side. Here we use the vector midpoint formula to find the midpoints of sides of a triangle, then subtract those vectors from each other to find a vector equation for the line joining them, then simplify that equation to see that it is exactly one half the length of the other side. The figure is drawn in vba and the same calculation made to verify the result.

An arbitrary quadrilateral which has its midpoints joined forms a parallelogram. The vectors on opposite sides are compared in VBA to see if they have identical values.

doing the calculation g = 1/3 (a + b + c) also draws a vector to the centroid G.

I had trouble with this one. The altitude of a triangle is a line from a vertex perpendicular to the other side. The 3 altitudes intersect at a point called the orthocenter. Prove this by finding the intersection of two altitudes and show the third one goes thru the point and is perpendicular to the third side. I could not figure out how to get vector h. I could use actual data to prove it for this one specific case, but not a general vector equation. i believe solution lies with the similarity of triangles – the projection of AB on BC at P is the same as the projection of BH on BC at P, so that AB dot BC is equal to BH dot BC. and the same argument for AB on AC. In lieu of that, i show the drawing of the figure in autocad VBA.

The triangle vertexes are given. The altitude starts at a vertex. It terminates at a right angle to the other side, which has known endpoints and hence a known slope. The slope of the altitude is the negative inverse of the slope of the line it meets. Autocad has a method to determine an intersection between two drawing objects, called InterSectWith. I use it twice, once to find the orthocenter intersection of altitudes point H, then to find the intersection with the far side.

First the line is drawn from the vertex using the slope and an arbitrary length. That establishes actual autocad entities to use with the InterSectWith method. I draw all lines with a function that returns a line object, and once the proper endpoint is found, its easy to change the endpoint property of the line.

slope = tan theta = delta y / delta x

Slope and tangent work with undirected lines. On the graph, its the angle the line makes with the positive x axis from -90 to +90. Given the slope as a simple number, we have lost the ability to know what quadrant the coordinates were in. If you wanted to draw vectors, you would have to analyze the x and y values independently. I dont worry about that here. If the line is drawn the wrong way, I change the length of its sign. The bottom line is that slope and tangent work with the same set of angles, and to find the angle from the slope, use the arctangent function ATN.

theta = ATN (slope)

See the function for line3 which accepts a startpoint, a slope and a length to draw a line.

code after the picture

```
Sub test7()
'5 p30 altitude of triangle from vertex to perpendicular
init
'orthocenter
Dim ptH() As Double
'lines
'slopes
Dim m_AB As Double, m_BC As Double, m_CA As Double
'points
Dim ptA() As Double, ptB() As Double, ptC() As Double
Dim ptP() As Double, ptQ() As Double, ptR() As Double

ptA = pt(2, 1, 0)
ptB = pt(9, 3, 0)
ptC = pt(3, 6, 0)

Set AB = line1(ptA, ptB)
Set BC = line1(ptB, ptC)
Set CA = line1(ptC, ptA)

m_AB = slope(ptA, ptB)
m_BC = slope(ptB, ptC)
m_CA = slope(ptC, ptA)

Set AP = line3(ptA, (-1 / m_BC), 5)
Set BQ = line3(ptB, (-1 / m_CA), -5)
Set CR = line3(ptC, (-1 / m_AB), -5)

ptH = intersectWith(AP, BQ)

AP.EndPoint = ptH
BQ.EndPoint = ptH
CR.EndPoint = ptH

' txt1 "A", ptA, 0.375
' txt1 "B", ptB, 0.375
' txt1 "C", ptC, 0.375
' txt1 "H", ptH, 0.375

ptP = intersectWith(AP, BC)
ptQ = intersectWith(BQ, CA)
ptR = intersectWith(CR, AB)

AP.EndPoint = ptP
BQ.EndPoint = ptQ
CR.EndPoint = ptR

Update
End Sub

Function line1(startpt() As Double, endpt() As Double, Optional strlayer As Variant) As AcadLine

If Not IsMissing(strlayer) Then
line1.Layer = strlayer
End If

g_pt = endpt
End Function

Function line3(pt1() As Double, slope As Double, leng As Double) As AcadLine
Dim pt2() As Double, theta As Double
theta = Atn(slope)

g_pt = pt2
End Function

Function slope(pt1() As Double, pt2() As Double) As Double
Dim x As Double, y As Double, z As Double
y = pt2(1) - pt1(1)
x = pt2(0) - pt1(0)

If x = 0 Then
MsgBox "div by zero in slope"
Exit Function
Else
slope = y / x
End If

End Function

Dim ptH(0 To 2) As Double
Dim intpoints As Variant

intpoints = L1.intersectWith(L2, acExtendBoth)

' copied changed from autocad activex help for Intersectwith
Dim I As Integer, j As Integer

If VarType(intpoints) <> vbEmpty Then
For I = LBound(intpoints) To UBound(intpoints)

ptH(0) = intpoints(j)
ptH(1) = intpoints(j + 1)
ptH(2) = intpoints(j + 2)

I = I + 2
j = j + 3
Next
Else
MsgBox "did not find intersect"
End If

intersectWith = ptH

End Function

```

Prove the perpendicular bisectors of a triangle are concurrent. The point K is called the circumcenter. A circle with center at K passes through the vertexes.

code to draw (not prove) after the picture

```
Sub test8()
'6 p30 perpendicular bisector of 3 sides of triangle are concurrent
init

'circumcenter
Dim ptK() As Double
'lines
'slopes
Dim m_AB As Double, m_BC As Double, m_CA As Double
'points
Dim ptA() As Double, ptB() As Double, ptC() As Double
Dim ptP() As Double, ptQ() As Double, ptR() As Double

ptA = pt(2, 1, 0)
ptB = pt(9, 3, 0)
ptC = pt(3, 6, 0)

Set AB = line1(ptA, ptB)
Set BC = line1(ptB, ptC)
Set CA = line1(ptC, ptA)

m_AB = slope(ptA, ptB)
m_BC = slope(ptB, ptC)
m_CA = slope(ptC, ptA)

ptP = midpoint(ptB, ptC)
ptQ = midpoint(ptC, ptA)
ptR = midpoint(ptA, ptB)

Set PK = line3(ptP, (-1 / m_BC), 5)
Set QK = line3(ptQ, (-1 / m_CA), -5)
Set RK = line3(ptR, (-1 / m_AB), -5)

ptK = intersectWith(PK, QK)
PK.EndPoint = ptK
QK.EndPoint = ptK
RK.EndPoint = ptK

Update
End Sub
```

finally, another unfinished project, prove the lines joining the midpoints of a quadrilateral bisect each other.

```
Sub test10()
'8 p30 lines joining midpoints of opposite sides of a quadrilateral bisect each other
init

Dim ptZ() As Double
'lines

Dim ptA() As Double, ptB() As Double, ptC() As Double, ptD() As Double
Dim ptP() As Double, ptQ() As Double, ptR() As Double, ptS() As Double

ptA = pt(2, 8, 0)
ptB = pt(10, 7, 0)
ptC = pt(12, 2, 0)
ptD = pt(1, 3, 0)

Set AB = line1(ptA, ptB)
Set BC = line1(ptB, ptC)
Set CD = line1(ptC, ptD)
Set DA = line1(ptD, ptA)

ptP = midpoint(ptA, ptB)
ptQ = midpoint(ptB, ptC)
ptR = midpoint(ptC, ptD)
ptS = midpoint(ptD, ptA)

Set PR = line1(ptP, ptR)
Set QS = line1(ptQ, ptS)

txt1 "A", ptA, 0.375
txt1 "B", ptB, 0.375
txt1 "C", ptC, 0.375
txt1 "D", ptD, 0.375

txt1 "P", ptP, 0.375
txt1 "Q", ptQ, 0.375
txt1 "R", ptR, 0.375
txt1 "S", ptS, 0.375

ptZ = intersectWith(PR, QS)
txt1 "Z", ptZ, 0.375

Update
End Sub
```