Logo « Ami » avec l’AxiDraw

Projets

L’AxiDraw est une machine permettant de dessiner sur une feuilles avec un stylo selon un programme. En spé Nsi nous avons la possibilité de l’utiliser pour ce projet de fin première.

Introduction

J’ai décidé de reprendre un logo tiré du manga « 20th century boys », car j’aime beaucoup le design et il me semblait simple à recréer avec le code python pour l’AxiDraw.

Le début du travail

Nous avons appris comment utiliser l’AxiDraw avec nos professeurs pendant le cours, et donc la première chose à comprendre a été de coder ce dessin. C’est plutôt simple à comprendre, en effet l’AxiDraw marche seulement avec les coordonnés, on a des fonctions « segment » et « segments » fourni.

def segment(x_depart:int, y_depart:int, x_arrivee:int, y_arrivee:int):
    if not coord_in_cadre(x_depart,y_depart) or not coord_in_cadre(x_arrivee,y_arrivee):
        # raise ValueError("Dépassement du cadre imposé")
        global dessin_valide
        dessin_valide = False
        print("Segment ne pouvant être tracé")
        return
    if axi_connect and dessin_valide:
        ad.goto(x_depart * 8.267 / 793.7, y_depart * 8.267 / 793.7) 
        ad.pendown() # Le stylo est baissé
        ad.lineto(x_arrivee * 8.267 / 793.7, y_arrivee * 8.267 / 793.7) 
        ad.penup()  # Le stylo est relevé en fin de tracé
    else:
        draw.line((x_depart, y_depart, x_arrivee, y_arrivee), fill = black) # Tracé du segment
   
def segments(points:list):
    for i in range(len(points) - 1):
        if not coord_in_cadre(points[i][0],points[i][1]) or not coord_in_cadre(points[i+1][0],points[i+1][1]):
            global dessin_valide
            dessin_valide = False
            print("Segments ne pouvant être tracés")
            return        
    if axi_connect and dessin_valide:
        for i in range(len(points)):
            points[i][0], points[i][1] = points[i][0] * 8.267 / 793.7, points[i][1] * 8.267 / 793.7
        ad.goto(points[0][0], points[0][1])
        ad.draw_path(points) 
        ad.penup() 
    else:
        for i in range(len(points)-1):
            draw.line((points[i][0], points[i][1], points[i+1][0], points[i+1][1]), fill = black) 

Ces deux fonctions ont besoin de coordonnés précises pour fonctionner. Pour avoir ces coordonnés j’ai eu une idée plutôt simple à utiliser, j’ai utilisé Paint car l’application donne les coordonné de la souris en temps réel. La dernière étape était de simplifier mon dessin d’origine en usant de segments et de points, puis j’ai pu reprendre tout les coordonnées et les mettre dans mon code python.

Différentes parties du dessin :

Pour l’intérieur de l’oeil j’ai utilisé les fonctions cercles codé par mes professeurs, cette fonction a besoin des coordonnés du centre du cercle et du rayon pour pouvoir dessiner les cercles. C’est assez facile à dessiner, voici le résultat :

Pour tout le contour de l’oeil et la main à l’intérieur, j’ai utilisé la fonction segments qui permet de dessiner plusieurs segments les uns à la suite des autres à partir des coordonné de chaque point noté sur le screenshot de paint juste au dessus.

Le dessin que j’ai choisi n’étant pas vraiment répétitif je n’ai pas pu utilisé de fonction crée par moi même alors j’ai simplement tout fait avec les fonctions segment, segments, cercle et polygone.

Voici tout le code que j’ai écris et l’image final :

Le code python

segments(([443,207],[400,219],[355,254],[289,315],[236,353],[190,374],[230,394],[265,415],[315,455],[360,490],[425,509],[610,510],[708,452],[759,410],[823,380],[840,369],[819,355],[764,324],[699,261],[635,224],[568,202],[482,202]))


segment(422,530,422,507)
segment(607,530,607,507)
segments(([435,507],[435,475],[594,475],[594,507]))
segments(([458,475],[435,421],[427,357],[427,283],[440,237],[444,131],[454,120],[468,120],[478,136],[481,255]))
segments(([471,266],[490,241],[509,225],[529,230],[539,251]))
segments(([524,269],[552,236],[574,240],[587,262]))
segments(([566,286],[587,262],[599,256],[612,259],[619,273],[605,302],[604,409],[590,444],[566,475]))


polygone([[427,365],[459,335],[486,317],[513,309],[541,316],[575,332],[605,362],[579,392],[550,412],[513,422],[487,416],[464,404],[439,377]])

segments(cercle(514,367,40))
segments(cercle(514,367,19))
segments(cercle(514,367,10))

Conclusion

Ce projet de Nsi était intéressant à faire car l’AxiDraw est un outil nouveau pour moi. J’ai pu apprendre plein de chose

L’image finale