Stap 13: Advanced notities 3: knopen
Parametrische vergelijking voor knopen kunt u vinden op het net. Dit keer, gaan we om dingen net iets anders dan voor te doen. Eerder hadden we lussen rijden direct bellen naar mc.setBlock(). Maar in onze oppervlakte percelen, zoals de Klein-fles, vaak hetzelfde blok zou krijgen getrokken meerdere keren, die is traag en inefficiënt. Een betere manier is om het aantal exacte blokken die reeds is opgesteld om te voorkomen dat het opnieuw uitvoeren van het zelfde ding bij te houden.
Verhuren mij gaat via een voorbeeld als dat (in knot.py) voor het tekenen van een knoop. Begin met een standaardkoptekst zoals:
We moeten nu onze knoop genereren. Ik gebruikte de vijftigerkruid formules uit hier. Dit vereist een parameter-t van 0 naar 2 looping * pi, met kleine genoeg stappen om ervoor te zorgen dat we hebben geen hiaten. Ik gebruikte 10000 stappen. Omdat dit in het geheugen gebeurt, en computers snel zijn, en overlappende blokken slechts eenmaal naar Minecraft verzonden zijn, is het gemakkelijker om gemakkelijker te stappen dan om te denken hoeveel is genoeg te doen. Het is belangrijk voor de coördinaten die gaan in het woordenboek als gehele getallen, dus we vertellen kunnen dat hetzelfde blok wordt tekening (een blok op (1.1,1.2,1.4) en een blok op (1,1,1) zijn het zelfde ding in Minecraft).
We eerst initialiseren en de positie van het knooppunt ten opzichte van de speler te stellen. Merk op dat de positie van de speler een geheel getal (u kan niet staan precies uitgelijnd met een blok) hoeft niet te worden en moet worden omgezet in een geheel getal.
We maken nu een lege verzameling met de naam gedaan om op te slaan van de coördinaten die we al hebt getekend:
En we trekken de set:
Dit trekt alleen gegevens die reeds is niet getekend. Merk op dat we nodig hebben om af te ronden de x-, y- en z coördinaten met de functie int(). Dat is de magie achter de verwijdering van de overlapping: wanneer de afgeronde coördinaten hetzelfde zijn, alleen één blok is getekend. (Opmerking: de dubbele haakjes in de done.add((x,y,z)) -lijn zijn wijten aan het feit dat wat we voegen naar de set is de coördinaat triple (x, y, z).)
De bovenstaande code is knot.py.
De knoop zou beter zijn als het touw dikker kijken. Er zijn vele manieren kan men dat doen. Een inefficiënte manier, maar makkelijk aangezien computers snel deze dagen zijn, is gewoon te tekenen van een kleine bal in plaats van een punt op elke pixel. Om dat te doen, moet ik eerst een beetje hulpprogrammafunctie tot het opstellen van een bal terwijl inchecken de gedaan om ervoor te zorgen dat er geen dubbele blokken:
Dit wordt de ongelijkheid-methode gebruikt om in te vullen een bal op (x0, y0, z0), met straal r.
Wijzig alleen onze knoop te maken terwijl lus om een bal in plaats van slechts een punt te maken:
Het resultaat is in knot2.py in de voorbeeldscripts.
Andere voorbeeld knopen zijn in trefoil.py, trefoil2.py en borromean.py. Als u met meerdere materialen tekent, kunt u gebruiken een woordenboek in plaats van een verzameling, of gewoon sequentieel doorlopen van de verschillende materialen en schakelt u de set voor elk (dat is wat ik doen in trefoil2.py en borromean.py).