Étape 13 : Advanced notes 3: noeuds
Vous pouvez trouver une équation paramétrique pour noeuds sur le net. Cette fois, nous allons faire des choses un peu différents du précédent. Avant, nous avons eu des boucles conduisant directement les appels à mc.setBlock(). Mais dans nos parcelles de surface, telles que la bouteille de Klein, souvent le même bloc serait obtenir faite plusieurs fois, qui est lente et inefficace. Une meilleure façon est de garder une trace de l’ensemble des blocs exactes qui sont déjà dessinés pour éviter de refaire la même chose.
Permettez-moi de passer à travers un exemple comme ça ( knot.py) dessiner un noeud. Commencez avec un en-tête standard comme :
Il faut maintenant générer notre noeud. J’ai utilisé les formules potentille de ici. Pour cela, une boucle d’un paramètre t de 0 à 2 * pi, avec de petites assez des mesures pour s’assurer que nous n’avons pas les lacunes. J’ai utilisé 10000 étapes. Puisque cela en mémoire, les ordinateurs sont rapides et les blocs qui se chevauchent sont envoyés uniquement une fois à Minecraft, c’est plus facile plus facile de faire des étapes plus qu’afin que le nombre est suffisant. Il est important que les coordonnées qui vont dans le dictionnaire d’être entiers, donc nous pouvons dire que le même bloc est en dessin (un bloc au (1.1,1.2,1.4) et un bloc à (1,1,1) sont la même chose dans Minecraft).
Nous avons tout d’abord initialiser et définir la position du nœud par rapport au joueur. Notez que la position du joueur ne sont pas nécessairement un entier (vous ne pourriez pas être debout exactement aligné avec un bloc) et devrait être transformée en un entier.
Maintenant, nous faisons un ensemble vide nommé fait pour stocker les coordonnées que nous avons déjà attiré :
Et nous attirons le jeu :
Cela attire seulement les données qui n’est pas déjà dessinées. Notez que nous avons besoin d’arrondir des coordonnées avec la fonction int() x, y et z. C’est la magie derrière l’enlèvement de chevauchement : lorsque les coordonnées arrondies sont identiques, qu’un seul bloc est dessiné. (Note : la double parenthèse dans la ligne de done.add((x,y,z)) sont due au fait que ce que nous ajoutons au jeu est la coordonnée triple (x, y, z).)
Le code ci-dessus est knot.py.
Le noeud serait mieux si la corde était plus épaisse. Il y a bien des égards un peut le faire. Une façon inefficace, mais facile car les ordinateurs sont rapides ces jours-ci, est juste dessiner une petite boule au lieu d’un point à chaque pixel. Pour ce faire, tout d’abord, je fais une petite fonction utilitaire pour dessiner un ballon tandis que signant la fait mettre pour assurer il n’y a pas de blocs dupliqués :
Cet exemple utilise la méthode inequality pour remplir un ballon à (x0, y0, z0), de rayon r.
Ensuite il suffit de modifier notre boucle while de fabrication noeud pour faire une boule au lieu de juste un point :
Le résultat est knot2.py dans les exemples de scripts.
Autres noeuds de l’échantillon sont en trefoil.py, trefoil2.py et borromean.py. Si vous dessinez à l’aide de matériaux multiples, vous pouvez utiliser un dictionnaire à la place d’un ensemble, ou juste passer successivement par les différents matériaux et désactiver l’ensemble devant chacun (c’est ce que je fais dans trefoil2.py et borromean.py).