Categories
Drawing Adinkra Symbols using Python

Dame Dame

Dame Dame means “chequered or checkered” as in the pattern on a chess or draught board. It is the symbol of intelligence, ingenuity, and strategy.

We will use a grid of 5 pixels to trace out the image. The image of this is shown below:

Analyzing the Symbol

Dame Dame consists of a filled square surrounded by an outer circle. The four sides of the square are connected to the circle by a shape that looks like a tong.

The Plan to Draw the Symbol

To draw Dame Dame, we first draw the filled square. Next we draw the outer circle.

The tong like shape connecting the square to the circle is drawn for all the four sides of the square.

The Algorithm to Draw the Symbol

The algorithm to draw Dame Dame is given below:

  1. Increase the pen size to 20 pixels
  2. Move the turtle to the position (-60, 60)
  3. Draw the inner filled square as a square of length 120 pixels
  4. Lift up the pen
  5. Move the pen to the position (0, -170)
  6. Draw a circle of radius 170
  7. Lift up the pen
  8. Set the heading of the pen to 0
  9. Move the pen to the position (60, 20)
  10. Draw the right handle
  11. Lift up the pen
  12. Set the heading of the pen to 0
  13. Draw the line joining the right handle to the circle
  14. Lift up the pen
  15. Set the heading of the pen to 90
  16. Move the pen to the position (-20, 60)
  17. Draw the top handle
  18. Lift up the pen
  19. Set the heading of the pen to 90
  20. Draw the line joining the top handle to the circle
  21. Lift up the pen
  22. Set the heading of the pen to 180
  23. Move the pen to the position (-60, -20)
  24. Draw the left handle
  25. Lift up the pen
  26. Set the heading of the pen to 180
  27. Draw the line joining the left handle to the circle
  28. Lift up the pen
  29. Set the heading of the pen to 270
  30. Move the pen to the position (20, -60)
  31. Draw the bottom handle
  32. Lift up the pen
  33. Set the heading of the pen to 270
  34. Draw the line joining the bottom handle to the circle

From the above steps, you will notice that steps (7-13), (14-20), (21-27) and (28-34) are similar. As a result, they would make a great candidate for a function.

Using Turtle Graphics

We will use the template.py file and rename it to damedame.py. The first task will be do increase the pen size of the turtle.

The code to do this is shown below:

turtle.pensize(20)

Next we draw the filled square. The code to do this is shown below:

turtle.setposition(-60, 60)
turtle.pendown()
turtle.begin_fill()
turtle.forward(120)
turtle.right(90)
turtle.forward(120)
turtle.right(90)
turtle.forward(120)
turtle.right(90)
turtle.forward(120)
turtle.right(90)
turtle.end_fill()

The generated image is shown below:

Next we draw the outer circle. The code to do this is shown below:

turtle.penup()
turtle.setposition(0, -170)
turtle.pendown()
turtle.circle(170)

The generated image is shown below:

Next we draw the right handle. The code to do this is shown below:

turtle.penup()
turtle.setheading(0)
turtle.setposition(60, 20)
turtle.pendown()
turtle.forward(50)
turtle.right(90)
turtle.forward(40)
turtle.right(90)
turtle.forward(50)

The generated image is shown below:

Now we draw the line that connects the right handle to the circle. The code to do this is shown below:

turtle.penup()
turtle.setheading(0)
turtle.setposition(110, 0)
turtle.pendown()
turtle.forward(50)

The generated image is shown below:

Next we draw the top handle. The code to do this is shown below:

turtle.penup()
turtle.setheading(90)
turtle.setposition(-20, 60)
turtle.pendown()
turtle.forward(50)
turtle.right(90)
turtle.forward(40)
turtle.right(90)
turtle.forward(50)

The generated image is shown below:

Now we draw the line that connects the top handle with the circle. The code to do this is shown below:

turtle.penup()
turtle.setheading(90)
turtle.setposition(0, 110)
turtle.pendown()
turtle.forward(50)

The generated image is shown below:

Next we draw the left handle. The code to do this is shown below:

turtle.penup()
turtle.setheading(180)
turtle.setposition(-60, -20)
turtle.pendown()
turtle.forward(50)
turtle.right(90)
turtle.forward(40)
turtle.right(90)
turtle.forward(50)

The generated image is shown below:

Now we draw the line that connects the left handle to the circle. The code to do this is shown below:

turtle.penup()
turtle.setheading(180)
turtle.setposition(-110, 0)
turtle.pendown()
turtle.forward(50)

The generated image is shown below:

Next we draw the bottom handle. The code to do this is shown below:

turtle.penup()
turtle.setheading(270)
turtle.setposition(20, -60)
turtle.pendown()
turtle.forward(50)
turtle.right(90)
turtle.forward(40)
turtle.right(90)
turtle.forward(50)

The generated image is shown below:

Now we draw the line that connects the bottom handle to the circle. The code to do this is shown below:

Complete Code

"""
Project Name: Drawing Adinkra Symbols using Python
Symbol Name: Dame Dame
Developer Name: Truston Ailende
Email Address: trustonailende@gmail.com
"""
import turtle
import math
 
# Square
def drawSquare(length):
    turtle.penup()
    turtle.setposition(-length/2.0, length/2.0)
    turtle.pendown()
    for i in range(0, 4):
        turtle.forward(length)
        turtle.right(90)
    turtle.penup()
    turtle.home()
 
# Horizontal lines
def drawHorizontalLine(length, division):
    pixelSpace = int(length / division)
    half = int(length / 2)
    for j in range((-half + pixelSpace), half, pixelSpace):
        turtle.penup()
        turtle.setposition(-half, j)
        turtle.pendown()
        turtle.forward(length)
    turtle.penup()
    turtle.home()
 
# Vertical lines
def drawVerticalLine(length, division):
    pixelSpace = int(length / division)
    half = int(length / 2)
    turtle.right(90)
    for k in range((-half + pixelSpace), half, pixelSpace):
        turtle.penup()
        turtle.setposition(k, half)
        turtle.pendown()
        turtle.forward(length)
    turtle.penup()
    turtle.home()
 
# Draw the grid
turtle.speed(1000000)
drawSquare(400)
drawHorizontalLine(400, 40)
drawVerticalLine(400, 40)
 
# Change the colour mode
turtle.colormode(255)
 
# Change the pencolor to red
turtle.pencolor(255, 0, 0)
 
# Draw the horizontal centre line
turtle.setposition(-200, 0)
turtle.pendown()
turtle.forward(400)
turtle.penup()
 
# Draw the vertical centre line
turtle.setposition(0, 200)
turtle.setheading(270)
turtle.pendown()
turtle.forward(400)
 
# Reset all the properties
turtle.home()
turtle.pencolor(0, 0, 0)
 
# Place code here
# Set the pensize to 20
turtle.pensize(20)

# Draw the filled center square
turtle.setposition(-60, 60)
turtle.pendown()
turtle.begin_fill()
turtle.forward(120)
turtle.right(90)
turtle.forward(120)
turtle.right(90)
turtle.forward(120)
turtle.right(90)
turtle.forward(120)
turtle.right(90)
turtle.end_fill()

# Draw the outer circle
turtle.penup()
turtle.setposition(0, -170)
turtle.pendown()
turtle.circle(170)

# Draw the right handle
turtle.penup()
turtle.setheading(0)
turtle.setposition(60, 20)
turtle.pendown()
turtle.forward(50)
turtle.right(90)
turtle.forward(40)
turtle.right(90)
turtle.forward(50)

# Draw the line joining the right handle to the circle
turtle.penup()
turtle.setheading(0)
turtle.setposition(110, 0)
turtle.pendown()
turtle.forward(50)

# Draw the top handle
turtle.penup()
turtle.setheading(90)
turtle.setposition(-20, 60)
turtle.pendown()
turtle.forward(50)
turtle.right(90)
turtle.forward(40)
turtle.right(90)
turtle.forward(50)

# Draw the line joining the top handle to the circle
turtle.penup()
turtle.setheading(90)
turtle.setposition(0, 110)
turtle.pendown()
turtle.forward(50)

# Draw the left handle
turtle.penup()
turtle.setheading(180)
turtle.setposition(-60, -20)
turtle.pendown()
turtle.forward(50)
turtle.right(90)
turtle.forward(40)
turtle.right(90)
turtle.forward(50)

# Draw the line joining the left handle to the circle
turtle.penup()
turtle.setheading(180)
turtle.setposition(-110, 0)
turtle.pendown()
turtle.forward(50)

# Draw the bottom handle
turtle.penup()
turtle.setheading(270)
turtle.setposition(20, -60)
turtle.pendown()
turtle.forward(50)
turtle.right(90)
turtle.forward(40)
turtle.right(90)
turtle.forward(50)

# Draw the line joining the bottom handle to the circle
turtle.penup()
turtle.setheading(270)
turtle.setposition(0, -110)
turtle.pendown()
turtle.forward(50)

# End the program
turtle.done()

Where it Can be Found

I searched online but I was unable to find any reference to anyone using the Dame Dame symbol.

Summary

At the end of this post, we have successfully used the Python Turtle environment to draw the Dame Dame symbol.

The code for this series is available on GitHub. Please feel free to check it out.

Next time, we will look at the Epa symbol.

Support the Series

Using the Adinkra symbols, I created the Adinkra Notebooks Collection.

You can support this series by buying one of them.

Categories
Drawing Adinkra Symbols using Python

Akoma Ntoaso

Akoma Ntoaso is the symbol for understanding and agreement.

We will use the 5 pixel grid to trace out this image. The image of this is shown below:

Analyzing the Symbol

Akoma Ntoaso consists of a circle with lines radiating out from it which connect to semi-circles that are perpendicular to those lines.

The Plan to Draw Symbol

To draw this symbol, we will draw the circle first then move from one quadrant to the other and complete the shape.

We will start from the upper right quadrant and draw the semi-circle and the connecting line then move clockwise until the entire symbol is completed.

Algorithm to Draw the Symbol

The algorithm to draw the Akoma Ntoaso symbol is shown below:

  1. Move the turtle to the position (0, -70)
  2. Draw a filled circle of radius 70 pixel
  3. Draw a line in the upper left quadrant from (-165, 30) to (-30, 165)
  4. Draw a semi-circle in the upper left quadrant and fill it
  5. Draw a line from the center of the circle to the upper left semi-circle
  6. Draw a line in the upper right quadrant from (30, 165) to (165, 30)
  7. Draw a semi-circle in the upper right quadrant and fill it
  8. Draw a line from the center of the circle to the upper right semi-circle
  9. Draw a line in the lower right quadrant from (165, -30) to (30, -165)
  10. Draw a semi-circle in the lower right quadrant and fill it
  11. Draw a line from the center of the circle to the lower right semi-circle
  12. Draw a line in the lower left quadrant from (-30, -165) to (-165, -30)
  13. Draw a semi-circle in the lower left quadrant and fill it
  14. Draw a line from the center of the circle to the lower left semi-circle

Using Turtle Graphics

We will use the template.py file and rename it to akoma_ntoaso.py. However, we have to add some code to draw diagonal lines that will cut across the grid.

The code to do this is given below:

def coordinateDistance(x1, y1, x2, y2):
dx = x1 – x2
dy = y1 – y2
D = math.sqrt((dx * dx) + (dy * dy))
return D

turtle.penup()
turtle.setposition(-200, 200)
turtle.setheading(315)
diagonalLength = coordinateDistance(-200, 200, 200, -200)
turtle.pendown()
turtle.forward(diagonalLength)

turtle.penup()
turtle.setposition(-200, -200)
turtle.setheading(45)
diagonalLength = coordinateDistance(-200, -200, 200, 200)
turtle.pendown()
turtle.forward(diagonalLength)

turtle.pencolor(0, 0, 0)

turtle.setheading(0)
turtle.penup()
turtle.home()

The function coordinateDistance calculates the distance between two extreme ends of the grid.

Now we can start drawing the symbol.

The code for steps 1 and 2 is given below:

turtle.penup()
turtle.setposition(0, -70)
turtle.pendown()
turtle.begin_fill()
turtle.circle(70)
turtle.end_fill()

The generated image is show below:

For step 3 we draw a line from (-165, 30) to (-30, 165). To do this, we move the turtle to the position (-165, 30) and we set the heading to 45 degrees.

Next we find the distance between the two points we want our line to extend to and move the turtle that distance.

The code to do this is shown below:

turtle.penup()
turtle.setposition(-165, 30)
turtle.setheading(45)
diagonalLength = coordinateDistance(-165, 30, -30, 165)
turtle.pendown()
turtle.forward(diagonalLength)

The generated image is shown below:

For step 4 of the algorithm, we draw a semi-circle. The code to do this is given below:

turtle.penup()
turtle.setposition(-30, 165)
turtle.pendown()
turtle.setheading(135)
turtle.begin_fill()
turtle.circle(diagonalLength/2, 180)
turtle.end_fill()

The generated image is shown below:

Step 5 of the algorithm is easy. We return the turtle back to the center of the grid and draw a line connecting the circle to the semi-circle.

The code to do this is shown below:

turtle.penup()
turtle.home()
turtle.setheading(135)
turtle.pendown()
turtle.pensize(30)
turtle.forward(diagonalLength * 0.75)

The generated image is shown below:

Now that one part of the symbol has been drawn, you will notice that steps 6 to 8, 9 to 11 and 12 to 14 are basically a repeat of steps 3 to 5.

This means that we could use a single function to draw the symbol. I will leave this as an exercise for you.

For step 6, we move the pen to the position (30, 165) and we draw a line to position (165, 30).

The code to do this is shown below:

turtle.penup()
turtle.home()
turtle.pensize(1)
turtle.setposition(30, 165)
turtle.setheading(-45)
diagonalLength = coordinateDistance(30, 165, 165, 30)
turtle.pendown()
turtle.forward(diagonalLength)

The generated image is shown below:

Next we proceed to draw the semi-circle in the upper right quadrant. The code to do this is shown below:

turtle.penup()
turtle.setposition(165, 30)
turtle.pendown()
turtle.setheading(45)
turtle.begin_fill()
turtle.circle(diagonalLength/2, 180)
turtle.end_fill()

The generated image is shown below:

Now we draw the line to join the semi-circle to the circle.

The code to do this is shown below:

turtle.penup()
turtle.home()
turtle.setheading(45)
turtle.pendown()
turtle.pensize(30)
turtle.forward(diagonalLength * 0.75)

The generated image is shown below:

Next we draw a line in the lower right quadrant. The code to do this is shown below:

turtle.penup()
turtle.home()
turtle.pensize(1)
turtle.setposition(165, -30)
turtle.setheading(-135)
turtle.pendown()
turtle.forward(diagonalLength)

The generated image is shown below:

We now draw the semi-circle. The code to do this is shown below:

turtle.penup()
turtle.setposition(30, -165)
turtle.pendown()
turtle.setheading(-45)
turtle.begin_fill()
turtle.circle(diagonalLength/2, 180)
turtle.end_fill()

The generated image is shown below:

Now we connect the semi-circle to the center circle. The code to do this is shown below:

turtle.penup()
turtle.home()
turtle.setheading(-45)
turtle.pendown()
turtle.pensize(30)
turtle.forward(diagonalLength * 0.75)

Next we draw a line in the lower left quadrant. The code to do this is shown below:

turtle.penup()
turtle.home()
turtle.pensize(1)
turtle.setposition(-30, -165)
turtle.setheading(135)
turtle.pendown()
turtle.forward(diagonalLength)

We now draw the semi-circle. The code to do this is shown below:

turtle.penup()
turtle.setposition(-165, -30)
turtle.pendown()
turtle.setheading(225)
turtle.begin_fill()
turtle.circle(diagonalLength/2, 180)
turtle.end_fill()

The generated image is shown below:

Finally, we draw the line connecting the semi-circle to the center circle. The code to do this is shown below:

turtle.penup()
turtle.home()
turtle.setheading(225)
turtle.pendown()
turtle.pensize(30)
turtle.forward(diagonalLength * 0.75)

The generated image is shown below:

Complete Code

"""
Project Name: Drawing Adinkra Symbols using Python
Symbol Name: Akoma Ntoaso
Developer Name: Truston Ailende
Email Address: trustonailende@gmail.com
"""
import turtle
import math
 
# Square
def drawSquare(length):
    turtle.penup()
    turtle.setposition(-length/2.0, length/2.0)
    turtle.pendown()
    for i in range(0, 4):
        turtle.forward(length)
        turtle.right(90)
    turtle.penup()
    turtle.home()
 
# Horizontal lines
def drawHorizontalLine(length, division):
    pixelSpace = int(length / division)
    half = int(length / 2)
    for j in range((-half + pixelSpace), half, pixelSpace):
        turtle.penup()
        turtle.setposition(-half, j)
        turtle.pendown()
        turtle.forward(length)
    turtle.penup()
    turtle.home()
 
# Vertical lines
def drawVerticalLine(length, division):
    pixelSpace = int(length / division)
    half = int(length / 2)
    turtle.right(90)
    for k in range((-half + pixelSpace), half, pixelSpace):
        turtle.penup()
        turtle.setposition(k, half)
        turtle.pendown()
        turtle.forward(length)
    turtle.penup()
    turtle.home()
 
# Draw the grid
turtle.speed(1000000)
drawSquare(400)
drawHorizontalLine(400, 40)
drawVerticalLine(400, 40)
 
# Change the colour mode
turtle.colormode(255)
 
# Change the pencolor to red
turtle.pencolor(255, 0, 0)
 
# Draw the horizontal centre line
turtle.setposition(-200, 0)
turtle.pendown()
turtle.forward(400)
turtle.penup()
 
# Draw the vertical centre line
turtle.setposition(0, 200)
turtle.setheading(270)
turtle.pendown()
turtle.forward(400)
 
# Reset all the properties
turtle.home()
 
# Place code here
def coordinateDistance(x1, y1, x2, y2):
    dx = x1 - x2
    dy = y1 - y2
    D = math.sqrt((dx * dx) + (dy * dy))
    return D

# Draw the top left diagonal
turtle.penup()
turtle.setposition(-200, 200)
turtle.setheading(315)
diagonalLength = coordinateDistance(-200, 200, 200, -200)
turtle.pendown()
turtle.forward(diagonalLength)

# Draw the bottom left diagonal
turtle.penup()
turtle.setposition(-200, -200)
turtle.setheading(45)
diagonalLength = coordinateDistance(-200, -200, 200, 200)
turtle.pendown()
turtle.forward(diagonalLength)

# Reset the colour back to black
turtle.pencolor(0, 0, 0)

# Reset the heading to 0
turtle.setheading(0)
turtle.penup()
turtle.home()

# Draw the center circle
turtle.penup()
turtle.setposition(0, -70)
turtle.pendown()
turtle.begin_fill()
turtle.circle(70)
turtle.end_fill()

# Draw a line in the upper left quadrant
turtle.penup()
turtle.setposition(-165, 30)
turtle.setheading(45)
diagonalLength = coordinateDistance(-165, 30, -30, 165)
turtle.pendown()
turtle.forward(diagonalLength)

# Draw a semi-circle in the upper left quadrant
turtle.penup()
turtle.setposition(-30, 165)
turtle.pendown()
turtle.setheading(135)
turtle.begin_fill()
turtle.circle(diagonalLength/2, 180)
turtle.end_fill()

# Draw a line from the center of the circle to the upper left semi-circle
turtle.penup()
turtle.home()
turtle.setheading(135)
turtle.pendown()
turtle.pensize(30)
turtle.forward(diagonalLength * 0.75)

# Draw a line in the upper right quadrant
turtle.penup()
turtle.home()
turtle.pensize(1)
turtle.setposition(30, 165)
turtle.setheading(-45)
diagonalLength = coordinateDistance(30, 165, 165, 30)
turtle.pendown()
turtle.forward(diagonalLength)

# Draw a semi-circle in the upper right quadrant
turtle.penup()
turtle.setposition(165, 30)
turtle.pendown()
turtle.setheading(45)
turtle.begin_fill()
turtle.circle(diagonalLength/2, 180)
turtle.end_fill()

# Draw a line from the center of the circle to the upper right semi-circle
turtle.penup()
turtle.home()
turtle.setheading(45)
turtle.pendown()
turtle.pensize(30)
turtle.forward(diagonalLength * 0.75)

# Draw a line in the lower right quadrant
turtle.penup()
turtle.home()
turtle.pensize(1)
turtle.setposition(165, -30)
turtle.setheading(-135)
turtle.pendown()
turtle.forward(diagonalLength)

# Draw a semi-circle in the lower right quadrant
turtle.penup()
turtle.setposition(30, -165)
turtle.pendown()
turtle.setheading(-45)
turtle.begin_fill()
turtle.circle(diagonalLength/2, 180)
turtle.end_fill()

# Draw a line from the center of the circle to the lower right quadrant
turtle.penup()
turtle.home()
turtle.setheading(-45)
turtle.pendown()
turtle.pensize(30)
turtle.forward(diagonalLength * 0.75)

# Draw a line in the lower left quadrant
turtle.penup()
turtle.home()
turtle.pensize(1)
turtle.setposition(-30, -165)
turtle.setheading(135)
turtle.pendown()
turtle.forward(diagonalLength)

# Draw a semi-circle in the lower left quadrant
turtle.penup()
turtle.setposition(-165, -30)
turtle.pendown()
turtle.setheading(225)
turtle.begin_fill()
turtle.circle(diagonalLength/2, 180)
turtle.end_fill()

# Draw a line from the center of the circle to the lower left quadrant
turtle.penup()
turtle.home()
turtle.setheading(225)
turtle.pendown()
turtle.pensize(30)
turtle.forward(diagonalLength * 0.75)

# End the program
turtle.done()

Where Can it Be Found?

A search of Google for organizations using this symbol yielded the Ghana Stock Exchange. It is the logo of the organization.

Summary

At the end of this post, we have successfully used the Python Turtle environment to draw the Akoma Ntoaso symbol.

The code for this series is available on GitHub. Please feel free to check it out.

Next time, we will look at the Dame Dame symbol.

Support the Series

Using the Adinkra symbols, I created the Adinkra Notebooks Collection.

You can support this series by buying one of them.

Categories
Maths Magic Devlog

Back to Programming

As a teacher, Summer is the busiest time of the year. You have parents on the look out for activities to engage their children.

With the opportunity comes great sacrifice. During this period, I was unable to write code for Maths Magic. However, the graphics to complete the game were in development so all is not lost.

So its back to programming. I will be working tireless to finish the game by October 1st.

The motion graphics to be used has been found so it is no longer and issue.

All that is left is to write the code.

Categories
Maths Magic Devlog

Hard Decisions

So I have made up my mind to just finish Maths Magic with or without Motion Graphics.

There is the need to just get this game across the finish line so that I can move on to the next one.

At the moment work on Maths Magic has stopped due to my busy schedule during the holidays.

At the end of the day, nonsense is better than nothing.

Categories
Maths Magic Devlog

Motion Graphics

At this point, the logic for Maths Magic is finished. All that remains is to add magic to the game.

Add magic is hard because it requires active use of the imagination. In the first ever version of Maths Magic, there was no need for motion graphics.

It felt like something was missing so hence the need to add it to this version.

The task is to add some sort of animation every time the user gets the sum of the numbers right.

So far, I am unable to come up with an animation. However I am confident that I will figure it out.