Years ago an electrical engineer stopped by my desk, leaned over the partition and said, I want you to automate my ladder diagrams. I want to push a button and the drawing comes out. He had seen what we had done, what others had done, with an automated program that spit out a family of parts that were going down our only area of the plant with a production line. I answered him that I could not write that program, which he interpreted I would not write the program. You don’t know how much time that button would save me, he said. In my only perfect response in this lifetime I said, you don’t know how long it would take me to write that button.

Our successful automation program had all the necessary ingredients. The product line had existed a long time. It had sold a lot. The variations in the family of parts were considerable but considering the volume and the number of times they had been reproduced, a system had developed to name and describe them. The product line had several smart people good with computers working in that area for a long time. High volume, good people doing it manual for a long time, discrete number of variations. That is what you must have to automate – a manual system.

The first step to automation, besides an actual product, is a five minute refresher, or introduction, to databases, specifically table relationships, and specifically what is a key field, and what is a foreign key. This is how data is stored. This is how the product is described. MS Access used to be a useful tool, but version changes, file version problems, 32-64 bit problems, getting it funded, being replaced by the big do-all database, all these caused it to drop in my work environment. But the principles of product structure, a main table and parts tables connected by relations, are applied in excel.

I will come back to this. This is a large topic not really suited to the blog format. I need to think up a sample project. It will be math related, not with obvious commercial applications.

# Polygon Circle

Regular polygons are called convex and star polygons that cross themselves are non-convex. For both types the vertexes (vertices) are on a circle that has a center and radius.

The turning angle the turtle uses from line to line is more generally called the exterior angle of a polygon. Its the angle from the line extended to the next line.

The sum of the exterior angles of a regular polygon = 360.

$nA=360$

To find the radius of a regular polygon, divide it into triangles. each wedge has a central angle of 360/n.

Bi-Secting one of these triangles creates a right triangle with a known angle and a known side length.

This formula works for regular polygons and for star polygons. If a line is drawn from the center to each vertex, and a line drawn perpendicular to the edge, right triangles with known sides and angles are created.

now that we have the radius, the center point can be found. Think of the turtle on a vertex, heading turned to the next line. It is on a triangle we already solved to find the radius. we use the same angles. The angle that the turtle needs to turn to look at the center is 90-A/2. I use acad utility polarpoint, not the turtle, to draw the circle. I wrote a new turtle class function to return the current turtle position as a point using a dynamic array and used it directly in PolarPoint.

Sub poly_1(angle As Double, n As Integer, len_side As Double)
Dim inc As Integer
Dim A As Double
Dim ctr() As Double
Dim ang2ctr As Double

rad = len_side / (2 * (Sin(A / 2)))

For inc = 1 To n
turtle1.fd len_side
turtle1.left angle
Next inc

txt_h "A = " & angle, turtle1.x1, turtle1.y1, 0.125
txt_h "n = " & n, turtle1.x1, turtle1.y1 - 0.25, 0.125
txt_h "R = " & (angle * n / 360), turtle1.x1, turtle1.y1 - 0.5, 0.125
txt_h "Radius = " & Round(rad, 4), turtle1.x1, turtle1.y1 - 0.75, 0.125

End Sub

'this is part of the turtle class module to return current position as a point array
Public Function pt1() As Double()
Dim pnt(0 To 2) As Double
pnt(0) = Me.x1: pnt(1) = Me.y1: pnt(2) = 0
pt1 = pnt
End Function



I am not going to try to draw these triangles, but all the graphics check out, it seems like my formulas derived from simpler polygons gives me the correct center and radius.


Sub turtle_demo_18()
init_turtle
Dim n As Integer, R As Integer
Dim A As Long

A = 164
n = LCM(A, 360) / A
R = LCM(A, 360) / 360

Call poly_1(CDbl(A), n, 1)
End Sub



# polygons

The inputs for this example problem are the angle 174 and 360. When a multiple of 174’s add up to a multiple of 360, the program stops. In advance we do not know how many 174s will add up to how many 360s, but we want the first one. This is the Least Common Multiple of Angle A (174) and 360.
LCM (A, 360)

174 has prime factors of 2 * 3 * 29
360 has prime factors of 2 * 2 * 2 * 3 * 3 * 5
the least common multiple is 360 * 29 = 10440.

we can substitute that into either side of the equation
$nA=360R$
$n*174 = 10440$
$10440 = 360*R$
to find that n = 60 and R = 29

The LCM can be figured different ways. There is a famous method of Euclid, and Euler, (no Eugene). There is an excel function to do it. Sample VBA code can be downloaded. The simplest method conceptually is the same way the turtle does it, by adding angles one by one and testing the result.

Here is brute force way one with no advance knowledge of when the program will stop. The program stops when the turtle heading returns to its original position. I also have a second emergency stop at 361 which never comes into play usually. (*footnote – the examples in the group photo that look like folded ribbon were polygons that did not close until 360 lines were drawn but were forced into an early exit with ” If inc > 130 Then Exit Do”) (**footnote – if the turn angle A is an integer, the maximum number of lines to bring the heading back to start is 360.)

Sub poly_360(len_side As Double, angle As Double)

Dim inc As Integer

Do
turtle1.fd len_side
turtle1.left angle

inc = inc + 1
If inc > 361 Then Exit Do

End Sub


Here is a primitive LCM function based on the same method, not intended to be the final version. The angles are added one by one and the result divided by 360 looking for a remainder, breaking out when the remainder is zero. The VBA mod operator works accurately only with integers. I had some overflows on the multiplication. The function seems to work better when all is type Long.

Function LCM(A As Long, B As Long)
Dim n As Long
Dim result As Long
Dim remainder As Long
n = 0

Do
n = n + 1
result = n * A
remainder = result Mod B
Loop While remainder <> 0

LCM = result
End Function


Now the sub to draw the polygon can be taken back to its roots. The loop calculations can be removed, because we will know in advance how many lines will be drawn.

Text information labels are added after the drawing is complete.

Sub poly_1(angle As Double, n As Integer, len_side As Double)
Dim inc As Integer

For inc = 1 To n
turtle1.fd len_side
turtle1.left angle
Next inc

txt_h "A = " & angle, turtle1.x1, turtle1.y1, 0.125
txt_h "n = " & n, turtle1.x1, turtle1.y1 - 0.25, 0.125
txt_h "R = " & (angle * n / 360), turtle1.x1, turtle1.y1 - 0.5, 0.125
End Sub


The sub to call the poly can be fancy or plain. It can draw families of polygons. It can loop and draw a range of turning angles.
This particular one will draw all the polygons with total turns (R) = 29 of angles between 1 and 180.

Sub turtle_demo_16()
init_turtle

Dim inc As Integer
Dim n As Integer, R As Integer
Dim A As Long, B As Long

B = 360

For inc = 1 To 180

A = inc
n = LCM(A, B) / A
R = LCM(A, 360) / 360

If R = 29 Then

Debug.Print "LCM of " & A; " and " & B; " = " & LCM(A, B)
Debug.Print "A = " & A
Debug.Print "n = " & n
Debug.Print "R = " & R
Debug.Print " "

Call poly_1(CDbl(A), n, 1)

turtle1.x1 = turtle1.x1 + 5

End If
Next inc

End Sub


Sub turtle_demo_16()
init_turtle

Dim inc As Integer
Dim n As Integer, R As Integer
Dim A As Long, B As Long
B = 360

For inc = 160 To 181
A = inc
n = LCM(A, B) / A
R = LCM(A, 360) / 360
Call poly_1(CDbl(A), n, 1)
turtle1.x1 = turtle1.x1 + 1.1
Next inc

End Sub


$R<20$

# test 2-7-2019

just testing and experimenting with latex math typesetting, don’t read.

https://en.wikibooks.org/wiki/LaTeX/Mathematics

the basic syntax –
$\alpha A \beta B \gamma \Gamma \pi \Pi \phi \varphi \mu \Phi$

$\alpha A \beta B \gamma \Gamma \pi \Pi \phi \varphi \mu \Phi$

**************************

size parameter 1 –
$\alpha A \beta B \gamma \Gamma \pi \Pi \phi \varphi \mu \Phi$

size parameter 2 –
$\alpha A \beta B \gamma \Gamma \pi \Pi \phi \varphi \mu \Phi$

size parameter 3 –
$\alpha A \beta B \gamma \Gamma \pi \Pi \phi \varphi \mu \Phi$

size parameter 4 –
$\alpha A \beta B \gamma \Gamma \pi \Pi \phi \varphi \mu \Phi$

size parameter 5 does not display.

***************************************

$\leq \subset < > \geq = \approx \neq \parallel \in \perp \sphericalangle \notin \measuredangle$

$\pm \times \ast \div$

***************************************************

+ – = ! / ( ) [ ] | ‘ : *

$+ - = ! / ( ) [ ] | ' : *$

*************************************************************

$\sin \cos \tan \cot \sec \csc$

$\sin \cos \tan \cot \sec \csc$

$\cos (2\theta) = \cos^2 \theta - \sin^2 \theta$

***************************************************************************

$\lim\limits_{x \to \infty} \exp(-x) = 0$

****************************************************************************

$3\times{}^1/_2=1{}^1/_2$

$\tan \theta + 2= \frac {\sin \theta} {\cos \theta} + 2$

***************************************************************************

$\sqrt{\frac{a}{b}}$

$\sqrt[n]{1+x+x^2+x^3+\dots+x^n}$

********************************

https://en.wikibooks.org/wiki/LaTeX/Mathematics

********************************

# Approximating the Circle

Drawing Circles the Hard Way – with Straight Lines

Our turtle has a local viewpoint. He can draw a line one unit, turn one degree, then repeat that 360 times, coming back around where he started, but at no time is a center or radius known, even though the approximate circle has both. By measuring the drawn approximate circle or by doing a little math the radius can be found. The circumference is total direction traveled. Using the formula Circum = pi*(Dia) and substituting 360 for the Circum the radius is found to be 180 / pi or approx 57.3.

If we make the subroutine more general to accept as input the angle turned between each line and the length of the lines, we no longer have a loop of 360 and we need to calculate the number of lines to draw.

num_lines = 360 / angle

will give a full circle (as long as angle is a multiple of 360). With this sub we can experiment with varying angles and line lengths and see how the radius changes. Using 1 and 1 gives the same results as before, but also using any two numbers that are the same, such as 10 and 10, give a circle (more or less) with the same radius as 1 and 1. Using different numbers for angle and line length will make the circle diameter change as a direct proportion of the ratio

len_lines / ang.

Longer lines will give larger diameters. Larger angles will give smaller diameters.

We can see by experimentation that every ratio of line_length to angle has a definite radius, so lets find that equation.
We already needed an equation between num_lines and ang, which was num_lines = 360 / ang. If for instance we turned 120 degrees with each turn, we would only need 3 lines and our approximate circle would be a triangle. If we turn one degree, we need 360 lines.

We also used the fact that 360 lines of one unit had a circumference of 360. No matter how many lines of whatever length,
the circumference is num_lines * len_lines.

C= (num_lines) * (len_lines) and into that we substitute our calculation num_lines = 360 / ang.

C = (360 / ang) * (len_lines)

Circumference of course is 2 pi R
2 pi R = (360/ang) * len_lines
R = (180/ang) * (len_lines/pi)

R = (180/pi) * (len_lines/ang)

and there is our ratio of line length to ang as a direct proportion to R.

Don’t forget, like I did when measuring the radius of a polygon, this radius is calculated by adding the straight line lengths and calculating the radius of a circle of that circumference. If the straight line approximation is crude, the radius will be crude. The more lines used to approximate the circle, the better the radius calculated from them.

R and ang can be switched with a little algebra to find ang.

ang = (180 / pi) * ( len_lines / R)

and now we can re-write our sub-routine so it accepts the radius and len_lines as argument and calculates the angle to turn each line and the number of lines to close (or almost close) the circle.

Finally having written a general program to draw circles of a given radius using straight lines of a given length, drawing an arc of given degree is just reducing the number of lines drawn by the same ratio as arc degrees to 360.

for a circle
num_lines = 360 / ang

for an arc with deg as the new input
num_lines = 360 / ang
num_lines = (deg / 360) * num_lines

but more simply this is
num_lines = deg / ang

# Turtle Basic 2019

Turtle Basic 2019

A very useful, advanced, early book is “Turtle Geometry” by Harold Abelson and Andrea diSessa, two MIT scientists, published in 1980. The MIT group had been working 10 years or more at that time with Turtle geometry, Logo and Lisp. The book is written with emphasis on the mathematical ideas, not any specific implementation. The ideas are just as valid now as then. We can use their substantial, challenging concepts and implement them 40 years later. Our examples can go beyond what they show, because our tools are so much better.

I am doing a turtle graphics implementation using Autocad, creating a turtle class in excel VBA. Excel is simply providing the VBA editor. The principles and code would would work just as well in dot net, and identically in vba native in autocad or bricscad.

Position and Heading are the two basic turtle properties. Heading will be in degrees, between 0 and 360, not including 360. VBA and autocad demand radians. Our subs will do the conversion. Position consists of variables X and Y (and Z when the turtle sprouts wings some day). We will use type Double for all.

Class variables are either Private or Public. If a variable is Public it can be set directly. That should do for X and Y. If Heading is public, then Turtle.Heading = 361 is possible. We want to convert values to between 0 and 359.99. Get and Let manage Private class variables. These can be named anything you want but they cannot have the same name as the variable they control.

Basic turtle commands are FORWARD #, BACK #, RIGHT # and LEFT #. These are methods or procedures that change Position or Heading properties. PENUP and PENDOWN change a boolean PEN variable.

In a Class Module, not a standard code module –

Public x1 As Double
Public y1 As Double
Public x2 As Double
Public y2 As Double
Public pen As Boolean


Current Position is x1, y1. The other endpoint of the line the turtle is going to draw is x2, y2. The heading is private. All others are public.

Insert Procedure Property from the VBA pulldown will insert a stub procedure to get a start on controlling a private variable. These normally have the same name. You would use the same name to read and write, which is how every property works. But lets use Heading for the read property and SetHeading for the write property. So instead of something like

We have

In the class module is the Let, the Get, and the convertang function. The only way to set the Heading is thru Let which converts every angle to a value between 0 and 360, no matter how many consecutive turns or negative values added.

Public Property Get heading() As Double
End Property

Public Property Let setheading(ByVal ang As Double)
End Property


wordpress is really hard to deal with, it thinks these inequality signs are html tags

The basic line drawing function is FORWARD #. Position and Heading are known. The only value required is distance. The other end of the line, x2, y2, has to be calculated with Cos and Sin, which require radians, not degrees. The value of the Pen boolean is checked to see if the line is to be drawn. The line is drawn with normal autocad vba methods. Finally the endpoint x2,y2 is made the new current position.

Public Sub forward(dist As Double)

If pen Then
Call drawline(x1, y1, x2, y2)
End If

x1 = x2
y1 = y2
End Sub

Sub drawline(x1 As Double, y1 As Double, x2 As Double, y2 As Double)
'internal sub to draw line
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

Update
End Sub


Since this is autocad, or something very much like it, we could definitely have turtle properties for line width, color and type. But we will save those for later.

Back is the same as Forward, except we add 180 to the direction, but we do not change the Heading variable.

x2 = x1 + dist * Cos(ang2rad(pheading + 180))


Changing Heading with Left # and Right #

Public Sub left(ang As Double)
End Sub

Public Sub right(ang As Double)
End Sub


The degree to radian utility and Penup / Pendown

Function ang2rad(ang As Double) As Double
ang2rad = ang * Pi / 180
End Function

Public Sub penup()
pen = False
End Sub

Public Sub pendown()
pen = True
End Sub


In a standard code module, the class has to be instantiated, that means a new specific turtle object has to be created using the class template. If CTurtle is the name of the class module, then –

Dim turtle1 As CTurtle
Set turtle1 = New CTurtle


The variables are set with default value zero, so that debug.print turtle1.x1 would print 0. In the class module you can set initial values.

Private Sub Class_Initialize()
pen = True
End Sub


To begin drawing, lets start with a basic polygon. An interior angle of an equilateral triangle is 60 degrees. The exterior angle is 120 degrees. The exterior angle is the angle you would turn if you were walking the lines of the triangle. Its the continuation of the line you are on past the vertex onto the next line. Its “how much the turtle must turn in drawing the vertex” (p.7 – Abelson).

Sub turtle_triangle()
Dim i As Integer
Dim turtle As CTurtle
Set turtle = New CTurtle

For i = 1 To 3
turtle.fd 10
turtle.right 120
Next i

End Sub


In practice to save a little typing, I will do some of the declarations in public and subs.

Sub turtle_triangle()
init_turtle

For i = 1 To 3
turtle1.fd 10
turtle1.right 120
Next i

End Sub


To generalize a polygon, the total exterior angles sum up to 360 – the turtle makes one full turn to come back to its initial heading. The simplest polygon, or N-gon where N stands for number of sides, would have one degree turns and have 360 sides.

 Sub turtle_polygon(num_sides As Integer, angle As Double, len_side As Double)
init_turtle

For i = 1 To num_sides
turtle1.fd len_side
turtle1.right angle
Next i

End Sub


This has to be called by something with arguments. You have to know what the arguments are to get good regular polygons. I am sticking with double as type for angle, not integer. Num_sides has to be integer, because a half side is not realistic, and also num_sides is used as a counter in a for loop. A double actually would run there without error, but sooner or later you would miss your expected result by one item due to a rounding error.

Here is a demo which makes a variety of polygons.

Sub polygon_demo()
turtle_polygon 3, 120, 1
turtle_polygon 4, 90, 2
turtle_polygon 5, 72, 3
turtle_polygon 6, 60, 4
turtle_polygon 7, (360 / 7), 5
turtle_polygon 8, 45, 6
turtle_polygon 9, 40, 7
turtle_polygon 10, 36, 8
turtle_polygon 11, (360 / 11), 9
turtle_polygon 12, 30, 10
End Sub


Given the number of sides, and given the fact that the exterior angles always add up to 360, the turn angle is just 360 / num_sides. In the case of 7 and 11 sides, the angle is not an integer. Its a repeating decimal. I let vba calculate the number and feed whatever precision it wants to autocad, and it closes the polygon fine.

Since the angle is calculated we could put that into the sub and take it out of the arguments list. We could do it the other way, calculate the number of sides from the angle, but thats trickier because num_sides is an integer and we might not always get an integer from a division.

So we can calculate angle, take it out of the argument list, and get exactly the same results.

Sub turtle_polygon2(num_sides As Integer, len_side As Double)
init_turtle
Dim angle As Double
angle = 360 / num_sides

For i = 1 To num_sides
turtle1.fd len_side
turtle1.right angle
Next i
End Sub


But what about this idea of knowing the angle and not knowing the number of sides? The polygon is done when the turtle turns exactly 360 degrees. If the angle is a double though, some angles are not multiples of 360. If we are not going to control the loop with the number of sides as a counter, we need a way to stop when the turtle returns to its original heading and an emergency stop in case it never does. Using doubles for heading, there is no guarantee it will ever exactly be 360 degrees once it starts, due to double rounding imprecision.

Here is a Do Loop where the test is at the end of the loop, so heading starts out zero, or whatever, it adds one increment, then it checks before running the loop again. In addition I have an emergency counter to stay out of an infinite loop. The parameters are length of the side and angle. No opinion expressed about how many sides there will be. In practice it turns out and is logical, if the angle is an integer, the maximum number of sides will be 360.

Angle 45 should give us an octagon, and it does, with 8 lines.

Sub do_poly2()
Set turtle1 = New CTurtle
poly_demo2 1, 45
End Sub


90 gives a square, 120 a triangle, 36 gives a 10-gon. What if I try to draw a 7-gon? First lets let VBA do the math.

poly_demo2 1, (360 / 7)


Looks like it works fine, but when I list all the lines, I get 201 (or whatever my max counter is). They are on top of one another, I dont see any separation, I dont see any difference in the listing, 8 decimal places, but there is a difference out there somewhere. It looks like a septagon. It appeared to work before because we were controlling the number of sides, and here we are not.

We knew there would be non-closing figures. Any angle, integer or not, that is not a multiple of 360 is not going to give a closed polygon. For any angle that is a multiple of 360 we get a simple convex polygon. Some angles are not multiple of 360 but a multiple of 360 times an integer. For instance, 108 * 10 = 360 * 3. If we input 108 the figure goes all the way around 3 times before the heading is exactly zero again, and it draws a total of 10 lines.

poly_demo2 1, 108


# More Turtle Graphics

A basic class implementation for turtle graphics in autocad –

The basic idea of turtle graphics is that the pen has a location and a direction. The instruction to draw a line only needs distance. The ending point is the new current location. To translate distance at angle from a given point to coordinates the Sin and Cosine are used.

The public class variables are x1, y1 – the current location, the beginning of the line to be drawn, and x2, y2, the calculated end points. Heading is a private double. It is private so that the class can always keep the angle heading between 0 <= heading < 360 no matter how many cumulative turns. A boolean PEN variable allows a PENUP or PENDOWN state.

Turtle1.FD 6 draws a line 6 units (assuming PEN is DOWN). Turtle.Left 45 and Turtle.Right 45 turn heading to the left or right 45 degrees or any number. Input to the user is in degrees. The class module converts to radians in private.

some example code using the turtle class –

Sub turtle_demo_A()

Dim turtle1 As CTurtle
Set turtle1 = New CTurtle

Debug.Print turtle1.x1
Debug.Print turtle1.y1
Debug.Print turtle1.pen
'x1 and y1 are zero
'pen is true
'these are class defaults

'class_initialize default is 90

'seems like an argument but you call LET with assignment
'property let heading sets and controls value between 0 <= pheading < 360

'just like A = A + 3
'right side of equation is GET and left side is LET

turtle1.left 90

turtle1.right 90

turtle1.fd 12
'line is 45 to left

End Sub


all this boils down to –


Sub turtle_demo_B()

Dim turtle1 As CTurtle
Set turtle1 = New CTurtle

turtle1.x1 = 2
turtle1.y1 = 3

turtle1.fd 12
End Sub


The Class Module code for the turtle to draw a line contains the trigonometry to calculate the point at dist and angle. It draws the line using the familiar AddLine method with EndPoints as an array of 3 doubles, xyz. This is a 2D implementation, Z is always zero for now but does not have to be.

Public Sub fd(dist As Double)

If pen Then
Call drawline(x1, y1, x2, y2)
End If

x1 = x2
y1 = y2
End Sub

Sub drawline(x1 As Double, y1 As Double, x2 As Double, y2 As Double)
'internal sub to draw line
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

Update
End Sub


Drawing the same line in code with no class implementation –

Sub turtle_demo_C()

Dim pt1(0 To 2) As Double
Dim pt2(0 To 2) As Double

Dim x1 As Double, y1 As Double
Dim x2 As Double, y2 As Double

Dim ang As Double
Dim dist As Double

x1 = 2
y1 = 3
ang = 45
dist = 12

x2 = x1 + dist * Cos(ang2rad(ang))
y2 = y1 + dist * Sin(ang2rad(ang))

pt1(0) = x1: pt1(1) = y1: pt1(2) = 0
pt2(0) = x2: pt2(1) = y2: pt2(2) = 0

End Sub


Instead of doing the calculations, Autocad provides the Utility PolarPoint to do the trig. Polarpoint returns an array. Autodesk help uses a Variant to capture it, but a dynamic array works fine (see pt2).

Sub turtle_demo_D()

Dim pt1(0 To 2) As Double
Dim pt2() As Double

Dim x1 As Double, y1 As Double

Dim ang As Double
Dim dist As Double

x1 = 0
y1 = 0
ang = 45
dist = 12

'these are commented out
'x2 = x1 + dist * Cos(ang2rad(ang))
'y2 = y1 + dist * Sin(ang2rad(ang))

pt1(0) = x1: pt1(1) = y1: pt1(2) = 0

End Sub


We can further simplify this process with a function to populate point arrays. Every Point can be declared as a dynamic array.

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 turtle_demo_E()

Dim pt1() As Double
Dim pt2() As Double

Dim ang As Double
Dim dist As Double

ang = 45
dist = 12

pt1 = Pt(2, 3, 0)

End Sub


we can streamline a little bit more with a dedicated Line sub-routine. now lets compare the turtle and more conventional autocad methods. Each will draw a line and turn before drawing the next. Using dynamic arrays, what was pt2 can become pt1 with a simple assignment. That is not possible with the conventional static array where points are declared as – Dim PT1 (0 to 2) as Double.

Sub turtle_demo_F()

Dim turtle1 As CTurtle
Set turtle1 = New CTurtle

turtle1.x1 = 1
turtle1.y1 = 2

turtle1.fd 12
turtle1.left 30
turtle1.fd 12

Dim pt1() As Double
Dim pt2() As Double

Dim ang As Double
Dim dist As Double

ang = 45
dist = 12

pt1 = Pt(1, 2, 0)
line1 pt1, pt2

pt1 = pt2
line1 pt1, pt2

End Sub


Turtle graphics has geometry implications, start here, go forward, turn and repeat. Turtle graphics is local with a simple interface and limited command set. Coordinate graphics is a global grid, but its interface can also be simplified. The two approaches might be able to work together.

A random star generator –

Sub turtle_demo_6()
init_turtle
Dim dblsize As Double
Dim inc As Integer

For inc = 1 To 480

dblsize = rnddbl(0, 360)

dblsize = rnddbl(0, 1024)
turtle1.x1 = dblsize

dblsize = rnddbl(512, 1024)
turtle1.y1 = dblsize

dblsize = rnddbl(2, 17)
star_5 dblsize

Next inc

End Sub

Sub star_5(dblsize As Double)

For i = 1 To 5
turtle1.fd dblsize
turtle1.right 144
Next i

End Sub

Function rnddbl(upr As Double, lwr As Double) As Double
' Randomize
' better results without Randomize

rnddbl = CDbl((upr - lwr + 1) * Rnd + lwr)
End Function



any comment in the code causes wordpress to substitute the html equivalent, even the code tag vb with quotations gets corrupted. use wordpress code tag and it moves by itself above an empty line. I really struggle sometimes with wordpress and its code behavior. The only way i even get it to work is to load the old editor. There is an easier way to edit posts, they helpfully remind me. I tried that a few times.