# Parabolas part 2

the standard equation for a parabola with Directrix horizontal and Vertex at the origin is

$X^2=4pY$

The Directrix and Focus are both specified as p distance from the vertex (0,0).  A positive p value draws a parabola open up, a negative value open down.

The Autocad VBA AcadPoint  is drawn at the focus, and AcadLine at the directrix. Both take the same type location array of 3 doubles (x,y,z). The point object is theoretically dimensionless. It takes two variables that control its visibility style and size, PDMODE and PDSIZE.

```
Sub draw_focus(X1 As Double, Y1 As Double)
Call newlayer("Focus", 5, acLnWt035)

Dim pt1(0 To 2) As Double
pt1(0) = X1: pt1(1) = Y1: pt1(2) = 0
pointobj.Layer = "Focus"
End Sub

Sub draw_directrix(X1 As Double, Y1 As Double, X2 As Double, Y2 As Double)
Call newlayer("Directrix", 5, acLnWt035)

Dim pt1(0 To 2) As Double
Dim pt2(0 To 2) As Double
pt1(0) = X1: pt1(1) = Y1: pt1(2) = 0
pt2(0) = X2: pt2(1) = Y2: pt2(2) = 0
lineobj.Layer = "Directrix"
End Sub

```

The parabola as function with one and only one value for X is our standard VBA loop and structure.  The form button calls its dedicated sub, which takes the values from the form, specifies the function to calculate Y, then calls the sub loop passing the function name.

```
Sub draw_pr03()
'Horiz Directrix
Call init_parabola
funcname = "PR_03"

A = frm_parabola.txt_a3.Value
strLabel = "X^2 = 4 * " & A & " * Y"
Call draw_parabola(funcname)
Call draw_focus(0, A)
Call draw_directrix(Xmin, -A, Xmax, -A)
End Sub

Function PR_03(X As Double) As Double
'Y = X^2 / 4P
PR_03 = (X ^ 2) / (4 * A)
End Function

Sub init_parabola()
Xmin = frm_parabola.txt_xmin
Xmax = frm_parabola.txt_xmax
X_inc = frm_parabola.txt_xinc
A = 0
B = 0
C = 0
End Sub

Sub draw_parabola(funcname As String)

Dim X As Double, Y As Double
Dim pt() As Double
Dim i As Integer, numpts As Integer

numpts = (Xmax - Xmin) / X_inc 'number of line segments
numpts = numpts + 1 'one more pt than line segment
ReDim pt(1 To numpts * 2) 'store x and y for one pt

For i = 1 To numpts
X = Xmin + ((i - 1) * X_inc)
Y = Application.Run(funcname, X)
pt(i * 2 - 1) = X: pt(i * 2) = Y
Next i

Update

If frm_parabola.chk_box_label_graph = True Then
label_graph
End If
End Sub

```

The parabola with vertical directrix has standard equation

$Y^2=4pX$

This is the same equation for both orientations but with X and Y transposed (switched). A standard rotation around the origin swaps values (X, Y) -> (Y,-X) , so that (2,1) when rotated clockwise, the graph viewed on its side, becomes (1, -2)

In this case with vertex at origin and rotation about origin, whether we rotate or just swap values, it may not matter.  If we were producing point tables, which we will, we might be more aware of which end is the beginning of the curve. Our program increments X values from negative starting point to positive ending point. But it is convention to start with X horizontal. We could build a Y loop passing values that would look exactly the same. Or we can just swap values as the last step in the process.

When we make a more general parabola program and move the vertex off the origin, the curve is then rotated about the vertex, not the origin, and the kludge of just swapping x and y in existing programming will become more convoluted and even more of a kludge.

The function is the same input / output formula, so we don’t need to change that. Our loop where we write the values into the array that feeds the acad polyline is the only change to turn the standard parabola on its side.

```
Sub draw_pr04()
'Vert Directrix
Call init_parabola
A = frm_parabola.txt_a4.Value
strLabel = "Y^2 = 4 * " & A & " * X"

funcname = "PR_03"
'transpose x and y
Call draw_parabola_yx(funcname)

Call draw_focus(A, 0)
Call draw_directrix(-A, -Xmin, -A, -Xmax)
End Sub

Sub draw_parabola_yx(funcname As String)
'for horizontal axis of symmetry

Dim X As Double, Y As Double
Dim pt() As Double
Dim i As Integer, numpts As Integer

numpts = (Xmax - Xmin) / X_inc 'number of line segments
numpts = numpts + 1 'one more pt than line segment
ReDim pt(1 To numpts * 2) 'store x and y for one pt

For i = 1 To numpts
X = Xmin + ((i - 1) * X_inc)
Y = Application.Run(funcname, X)

'(x,y) -> (y,x) transpose, not rotate
pt(i * 2 - 1) = Y: pt(i * 2) = X
Next i

Update

If frm_parabola.chk_box_label_graph = True Then
label_graph
End If
End Sub

```