Ahoj, nevíte někdo jak v pythonu udělat Z-bufer?
Fórum › Python
Jak implementovat Z bufer
Já znám jen Z-buffer z grafiky. To je prostě pole vzdáleností pixelů a používá se k tomu, aby se vzdálenějšími pixely nepřekreslovaly ty bližší. Na tom nic není, není mi jasné, na co se ptáš.
class Buffer:
def __init__(self, width, height):
self.colorbuf = [[(0, 0, 0)] * width for _ in range(height)]
self.depthbuf = [[-10000] * width for _ in range(height)]
def putpixel(self, x, y, z, color):
if self.depthbuf[y][x] < z:
self.depthbuf[y][x] = z
self.colorbuf[y][x] = color
Tak když řešíš z-buffer, tak už asi nějak kreslit umíš. Tak v tom putpixel můžeš ten pixel místo ukládání rovnou vykreslit, nebo až nakonec vykreslit celý colorbuf (to bude rychlejší).
Takže třeba v Tkinteru (jen proto, že je ve standardní knihovně. Samozřejmě to bude pomalé a pro velké plochy úplně nepoužitelné. Např. Pygame umí pěkně blitnout celou plochu) nějak takhle:
import tkinter as tk
class Buffer:
def __init__(self, width, height):
self.colorbuf = [[(0, 0, 0)] * width for _ in range(height)]
self.depthbuf = [[-10000] * width for _ in range(height)]
def putpixel(self, x, y, z, color):
if self.depthbuf[y][x] < z:
self.depthbuf[y][x] = z
self.colorbuf[y][x] = color
def toimage(self):
imagedata = " ".join(
"{" + " ".join("#%02x%02x%02x" % color for color in row) + "}"
for row in self.colorbuf
)
return imagedata
def main():
width, height = 400, 400
buffer = Buffer(width, height)
def drawrect(x1, y1, x2, y2, z, color):
for y in range(y1, y2 + 1):
for x in range(x1, x2 + 1):
buffer.putpixel(x, y, z, color)
drawrect(50, 100, 350, 150, -10, (255, 0, 0)) # cerveny, -10
drawrect(50, 250, 350, 300, -30, (0, 255, 0)) # zeleny, -30
drawrect(175, 50, 225, 350, -20, (0, 0, 255)) # modry, -20 => za cervenym, pred zelenym
root = tk.Tk()
canvas = tk.Canvas(root, width=width, height=height)
canvas.pack()
image = tk.PhotoImage()
image.put(buffer.toimage())
canvas.create_image((0, 0), anchor=tk.NW, image=image)
root.mainloop()
if __name__ == "__main__":
main()
Jestli chceš kreslit dynamickou scénu, tak Python výkonostně není dobrá volba na grafiku po pixelech.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Jak oříznout produktové foto, jak změnit pozadí na bílé ? — založil diamondgroup
Makro pro Word: Jak zjistit jestli je vybraný text a jak nastavit sc… — založil oxidián
Pls jak zpustit z programu jinou aplikaci, a jak dělit aby zůstal zb… — založil Choco-TUx
Jak jak dobre navrhnout DB v MySQL — založil Beranek
Jak na to???? — založil silaro
Moderátoři diskuze