user12624554
user12624554

Reputation:

Drawing polygon patterns using python

I need to draw the image on the right , however my code generates the image on the left .How do I fix this error? I have tried manipulating the s value ,however that messes up the code further.On both the x and y axis , my s is increasing ,however we do not want that .We want the value of s to remain the same uptil a point .

 import turtle

 T = turtle.Turtle()
 turtle.tracer(0,0)
 T.speed(0)
 T.pensize(3)

 zoom = 40 
def drawshape(A,sidelength,s):
 for x in range(s):
angle=360/s
A.forward(sidelength)
A.right(angle)

def patternA(T,n,s):
for j in range(0,(n+1) // 2):
    T.penup()
          
    for i in range(1,(n+1)//2):
        
        if s <= 1 :
            return()

        else:
                        
            T.penup()
            T.setpos((j)* zoom, (i) * zoom)
            T.pendown()
            sidelength=12
            

            drawshape(T,sidelength,s)
            T.penup()
            s=s-1
    s=3
    for i in range(((n+1)//2),n+1):
        T.penup()
        if s <= 1 :
            return()
        else:
                        
            T.penup()
            T.setpos((j)* zoom, (i) * zoom)
            T.pendown()
            
            sidelength=12
            drawshape(T,sidelength,s)
            T.penup()
            s=s+1


s=6
n=7


patternA(T,n,s)

def patternB(T,n,s):
   for j in range(1,((n+1)//2)):

    
        for i in range(1,(n+1)//2):
     
          if s <= 1 :
            return()

          else:
                        
            T.penup()
            T.setpos((-j)* zoom, (i) * zoom)
            T.pendown()
                            
            sidelength=12
            drawshape(T,sidelength,s)
            s=s-1
       s=3
       for i in range(((n+1)//2),n+1):
        
        if s <= 1 :
            return()
        else:
                        
            T.penup()
            T.setpos((-j)* zoom, (i) * zoom)
            T.pendown()
            
            
            sidelength=12
            drawshape(T,sidelength,s)
            s=s+1

    
 s=5
 n=7
        
 patternB (T, n, s)

 turtle.update() 
 turtle.done()

Upvotes: 0

Views: 383

Answers (2)

cdlane
cdlane

Reputation: 41872

The key to this problem is to take the min() of the polygon's distance from the X and Y axes. Here's a solution that's a minor change to my answer to your earlier "Drawing a pattern using turtle" question:

from turtle import Screen, Turtle

DISTANCE = 50

def dualsaddle(t, n, minimum=3):
    assert n % 2 == 1, "n should be odd"

    t.penup()

    for x in range(-n // 2 + 1, n // 2 + 1):
        t.setx(x * DISTANCE)

        for y in range(-n // 2 + 1, n // 2 + 1):
            t.sety(y * DISTANCE)

            t.pendown()
            t.circle(10, steps=minimum + min(abs(x), abs(y)))
            t.penup()

screen = Screen()
screen.tracer(False)

turtle = Turtle()
turtle.hideturtle()
turtle.pensize(3)

dualsaddle(turtle, 7)

screen.tracer(True)
screen.exitonclick()

enter image description here

Upvotes: 1

user12624554
user12624554

Reputation:

Here is my attempt-

import turtle
T=turtle.Turtle()
zoom = 50
T.speed(0)
turtle.tracer(0,0)

def drawshape(T,sidelength,s):
  for x in range(s):
    angle=360/s
    T.pendown()
    T.forward(sidelength)
    T.right(angle)
    T.penup()

def dualsaddle(T, n):

    T.penup()

    for x in range(-n // 2 + 1, n // 2 + 1):
        T.setx(x * zoom)

        for y in range(-n // 2 + 1, n // 2 + 1):
            T.sety(y * zoom)

            sidelength=10
            if abs(x)==0 or abs(y)==0:
                drawshape(T,sidelength,3)
            elif abs(x)==1 or abs(y)==1:
                drawshape(T,sidelength,4)
            elif abs(x)==2 or abs(y)==2:
                drawshape(T,sidelength,5)
            elif abs(x)==3 or abs(y)==3:
                drawshape(T,sidelength,6)


for i in range (7):

    dualsaddle(turtle, 7)


turtle.hideturtle()
turtle.update()
turtle.done()

Upvotes: 1

Related Questions