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 Dim AB As AcadLine, BC As AcadLine, CA As AcadLine Dim AP As AcadLine, BQ As AcadLine, CR As AcadLine '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 Set line1 = acadDoc.ModelSpace.AddLine(startpt, endpt) 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) pt2 = acadDoc.Utility.PolarPoint(pt1, theta, leng) Set line3 = acadDoc.ModelSpace.AddLine(pt1, pt2) 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 Function intersectWith(L1 As AcadLine, L2 As AcadLine) As Double() 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 Dim AB As AcadLine, BC As AcadLine, CA As AcadLine Dim PK As AcadLine, QK As AcadLine, RK As AcadLine '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 AB As AcadLine, BC As AcadLine, CD As AcadLine, DA As AcadLine Dim PR As AcadLine, QS As AcadLine 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