The 2300 year old geometry primer begins with definitions for point, line and plane surface establishing these concepts which will be used virtually unchanged even in modern cad applications. A point has no parts, it says. Later geometers will add it only has position but no dimension. A line has only length, no width, only one dimension. A plane surface has both length and width, two dimensions. 17th century mathematicians added XYZ variables to locate position. Euclid constructed, stated (“I say that…”), and proved elementary facts of geometry by starting with the most basic usable definitions and with virtual or real tools of straightedge and compass, that only allowed lines and circles to be constructed, made a textbook of geometry theorems that all depend on previous constructions for the proof of their canonic accuracy. His very first theorem constructs an equilateral triangle, a triangle with all sides and all angles equal, from a single random line.

Euclid has been criticized by moderns because he included no previous definition, postulate or axiom that two circles overlapping intersect in a single point. I thought finding that intersection point would be the hardest part of programming it, but there is a dedicated method, Intersectwith, for nearly every autocad object which returns a single dimension array of x, y and z values for all intersections. Here I just choose the first one. I use a random number generator to create the seed line.

Sub prime_pr1()
'given lineAB call proposition1
Connect_Acad
Dim ptA(0 To 2) As Double
Dim ptB(0 To 2) As Double
Dim Ax As Double, Ay As Double
Dim Bx As Double, By As Double
Ax = rnddbl(0, 10)
Ay = rnddbl(0, 10)
Bx = rnddbl(11, 20)
By = rnddbl(0, 10)
Call pt(ptA, Ax, Ay, 0)
Call pt(ptB, Bx, By, 0)
Call pr1(ptA, ptB)
acadApp.Update
End Sub
Sub pr1(ptA() As Double, ptB() As Double)
Dim lineAB As AcadLine, lineAC As AcadLine, lineBC As AcadLine
Dim circD As AcadCircle, circE As AcadCircle
Dim ptC(0 To 2) As Double
Dim r As Double
Dim intpts As Variant
Set lineAB = acadDoc.ModelSpace.AddLine(ptA, ptB)
r = distance(ptA, ptB)
Set circD = acadDoc.ModelSpace.AddCircle(ptA, r)
r = distance(ptB, ptA)
Set circE = acadDoc.ModelSpace.AddCircle(ptB, r)
intpts = circD.IntersectWith(circE, acExtendNone)
Call intpts_eval(intpts)
'going to take positive y value
'keeps traditional illustrations upright
If ptG1(1) > ptG2(1) Then
ptC(0) = ptG1(0)
ptC(1) = ptG1(1)
ptC(2) = ptG1(2)
Else
ptC(0) = ptG2(0)
ptC(1) = ptG2(1)
ptC(2) = ptG2(2)
End If
Set lineAC = acadDoc.ModelSpace.AddLine(ptA, ptC)
Set lineBC = acadDoc.ModelSpace.AddLine(ptB, ptC)
End Sub

helper functions

Option Explicit
Public num_int_pts As Integer
Public ptG1(0 To 2) As Double
Public ptG2(0 To 2) As Double
'to evaluate the output array of the Intersectwith method
'loads up to two points in a global variable
'the calling program has to decide which one to use
'the core loop here taken directly out of autocad vba help for Intersectwith method
Sub intpts_eval(intpts As Variant)
Dim i As Integer, j As Integer, k As Integer
Dim str As String
If VarType(intpts) <> vbEmpty Then
For i = LBound(intpts) To UBound(intpts)
str = "Intersection Point[" & k & "] is: " & intpts(j) & "," & intpts(j + 1) & "," & intpts(j + 2)
Debug.Print str
str = ""
i = i + 2
j = j + 3
k = k + 1
Next
End If
Debug.Print LBound(intpts)
Debug.Print UBound(intpts)
'global var
num_int_pts = k
Select Case k
Case Is = 0
ptG1(0) = 0: ptG1(1) = 0: ptG1(2) = 0
ptG2(0) = 0: ptG2(1) = 0: ptG2(2) = 0
Case Is = 1
Call pt(ptG1, (intpts(0)), (intpts(1)), (intpts(2)))
ptG2(0) = 0: ptG2(1) = 0: ptG2(2) = 0
Case Is = 2
Call pt(ptG1, (intpts(0)), (intpts(1)), (intpts(2)))
Call pt(ptG2, (intpts(3)), (intpts(4)), (intpts(5)))
Case Is > 2
MsgBox "thats a lot of points"
End Select
End Sub
Sub pt(ByRef ptn() As Double, x As Double, y As Double, z As Double)
ptn(0) = x: ptn(1) = y: ptn(2) = z
End Sub
Function rnddbl(upr As Double, lwr As Double) As Double
Randomize
rnddbl = CDbl((upr - lwr + 1) * Rnd + lwr)
End Function
' straight out of autocad vba help
' Calculate distance between two points
Function distance(sp As Variant, ep As Variant) As Double
Dim x As Double
Dim y As Double
Dim z As Double
x = sp(0) - ep(0)
y = sp(1) - ep(1)
z = sp(2) - ep(2)
distance = Sqr((Sqr((x ^ 2) + (y ^ 2)) ^ 2) + (z ^ 2))
End Function