9.2. Figury 2D i 3D

Możliwość programowego umieszczania różnych bloków w Minecraft Pi Edition można wykorzystać jako atrakcyjny sposób wizualizacji różnych figur. Jednak o ile budowanie prostych kształtów, jak np. kwadrat czy sześcian, nie stanowi raczej problemu, o tyle trójkąty, koła i bardziej skomplikowane budowle nie są trywialnym zadaniem. Tworzenie 2- i 3-wymiarowych konstrukcji ułatwi nam biblioteka minecraftstuff.

Instalacja

Symulator mcpi-sim domyślnie nie działa z omawianą biblioteką i wymaga modyfikacji. Zmienione pliki oraz omawianą bibliotekę umieściliśmy w archiwum mcpi-sim-fix.zip, które po ściągnięciu należy rozpakować do katalogu ~/mcpi-sim/local nadpisując oryginalne pliki.

9.2.1. Linia

W pustym pliku mcsim-fig.py umieszczamy kod:

Kod nr
 1#!/usr/bin/env python
 2# -*- coding: utf-8 -*-
 3
 4import os
 5import local.minecraft as minecraft  # import modułu minecraft
 6import local.block as block  # import modułu block
 7import local.minecraftstuff as mcstuff  # import biblioteki do rysowania figur
 8from local.vec3 import Vec3  # klasa reprezentująca punkt w MC
 9
10os.environ["USERNAME"] = "Steve"  # nazwa użytkownika
11os.environ["COMPUTERNAME"] = "mykomp"  # nazwa komputera
12
13mc = minecraft.Minecraft.create("")  # połaczenie z symulatorem
14figura = mcstuff.MinecraftDrawing(mc)  # obiekt do rysowania kształtów
15
16
17def plac(x, y, z, roz=10, gracz=False):
18    """
19    Funkcja tworzy podłoże i wypełnia sześcienny obszar od podanej pozycji,
20    opcjonalnie umieszcza gracza w środku.
21    Parametry: x, y, z - współrzędne pozycji początkowej,
22    roz - rozmiar wypełnianej przestrzeni,
23    gracz - czy umieścić gracza w środku
24    Wymaga: globalnych obiektów mc i block.
25    """
26
27    podloga = block.STONE
28    wypelniacz = block.AIR
29
30    # podloga i czyszczenie
31    mc.setBlocks(x, y - 1, z, x + roz, y - 1, z + roz, podloga)
32    mc.setBlocks(x, y, z, x + roz, y + roz, z + roz, wypelniacz)
33    # umieść gracza w środku
34    if gracz:
35        mc.player.setPos(x + roz / 2, y + roz / 2, z + roz / 2)
36
37
38def linie():
39    # Funkcja rysuje linie
40    # tuple z współrzędnymi punktów
41    punkty1 = ((-10, 0, -10), (10, 0, -10), (10, 0, 10), (-10, 0, 10))
42    punkty2 = ((-15, 5, 0), (15, 5, 0), (0, 5, 15), (0, 5, -15))
43    p1 = Vec3(0, 0, 0)  # punkt początkowy
44    for punkt in punkty1:
45        x, y, z = punkt
46        p2 = Vec3(x, y, z)  # punkt końcowy
47        figura.drawLine(p1.x, p1.y, p1.z, p2.x, p2.y, p2.z, block.WOOL, 14)
48    for punkt in punkty2:
49        x, y, z = punkt
50        p2 = Vec3(x, y, z)  # punkt końcowy
51        figura.drawLine(p1.x, p1.y, p1.z, p2.x, p2.y, p2.z, block.OBSIDIAN)
52
53
54def main():
55    mc.postToChat("Biblioteka minecraftstuff")  # wysłanie komunikatu do mc
56    plac(-15, 0, -15, 30)
57    linie()  # wywołanie funkcji
58
59    return 0
60
61
62if __name__ == '__main__':
63    main()

Większość kodu omówiona została w Podstawach. W nowym kodzie, który został podświetlony, importujemy bibliotekę minecraftstuff oraz klasę Vec3. Reprezentuje ona punkty o podanych współrzędnych w trójwymiarowym świecie MC. Polecenie figura = mcstuff.MinecraftDrawing(mc) tworzy instancję głównej klasy biblioteki, która udostępni jej metody.

Do rysowania linii wykorzystujemy metodę drawLine(), której przekazujemy jako argumenty współrzędne punktu początkowego i końcowego, a także typ bloku i ewentualnie podtyp. Ponieważ chcemy narysować kilka linii wychodzących z tego samego punktu, współrzędne punktów końcowych umieszczamy w dwóch tuplach (niemodyfikowalnych listach) jako… tuple. W pętlach odczytujemy je (for punkt in punkty1:), rozpakowujemy (x, y, z = punkt) i przekazujemy do konstruktora omówionej wyżej klasy Vec3 (p2 = Vec3(x, y, z)).

Całość omówionego kodu dla przejrzystości umieszczamy w funkcji linie(), którą wywołujemy w funkcji głównej i testujemy.

9.2.2. Koło

Przed funkcją główną main() wstawiamy kod:

Kod nr
54def kolo(x, y, z, r):
55    # Funkcja rysuje koło pionowe i poziome o środku x, y, z i promieniu r
56    figura.drawCircle(x, y, z, r, block.LEAVES, 2)
57    figura.drawHorizontalCircle(x, y, z, r, block.LEAVES, 2)

Funkcja kolo(x, y, z, r) wykorzystuje metodę drawCircle() do rysowania koła w pionie oraz drawHorizontalCircle() do rysowania koła w poziomie. Obydwie metody pobierają współrzędne środka koła, jego promień oraz typ i podtyp bloku, służącego do rysowania.

Umieść wywołanie funkcji, np. kolo(0, 10, 0, 10), w funkcji głównej i przetestuj.

9.2.3. Kula

Do skryptu wstawiamy kolejną funkcję przed funkcją main():

Kod nr
60def kula(x, y, z, r):
61    # Funkcja rysuje kulę o środku x, y, z i promieniu r
62    figura.drawSphere(x, y, z, r, block.WOOD, 2)

Metoda drawSphere() buduje kulę. Pierwsze trzy argumenty to współrzędne środka, kolejne to: promień, typ i ewentualny podtyp bloku. Umieść wywołanie funkcji, np. kula(0, 10, 0, 9), w funkcji głównej i przetestuj.

9.2.4. Kształt

Przed funkcją main() wstawiamy:

Kod nr
65def ksztalt():
66    # Funkcja łączy podane w liście wierzchołki i opcjonalnie wypełnia figurę
67    ksztalt = []  # lista punktów
68    ksztalt.append(Vec3(-11, 0, 11))  # współrzędne 1 wierzchołka
69    ksztalt.append(Vec3(11, 0, 11))  # współrzędne 2 wierzchołka
70    ksztalt.append(Vec3(0, 0, -11))  # współrzędne 3 wierzchołka
71    figura.drawFace(ksztalt, True, block.SANDSTONE, 2)

Chcąc narysować trójkąt do listy do listy ksztalt dodajemy trzy instancje klasy Vec3 definiujące kolejne wierzchołki: ksztalt.append(Vec3(-11, 0, 11)). Do rysowania dowolnych kształtów służy metoda drawFace(), która punkty przekazane w liście łączy liniami budowanymi z podanego bloku. Drugi argument, logiczny, decyduje o tym, czy figura ma zostać wypełniona (True), czy nie (False).

Po wywołaniu wszystkich omówionych funkcji możemy zobaczyć w symulatorze poniższą budowlę:

../../_images/mcsim-fig.png

Ćwiczenie 1

Wykorzystując odpowiednią metodę biblioteki minecraftstuff, spróbuj zbudować napis „KzK” podobny do pokazanego poniżej. Przetestuj swój kod w symulatorze i w Minecrafcie Pi.

../../_images/mcsim-KzK.png

Licencja Creative Commons Materiały Python 101 udostępniane przez Centrum Edukacji Obywatelskiej na licencji Creative Commons Uznanie autorstwa-Na tych samych warunkach 4.0 Międzynarodowa.

Utworzony:

2025-04-12 o 10:21 w Sphinx 7.3.7

Autorzy:

Patrz plik „Autorzy”