Das hört sich nach einer einfachen Frage an, aber ich finde es überraschend schwierig, mit guter Leistung recht zu kommen.Wie zeichne effizient genau N Punkte auf dem Bildschirm?
Der erste Algorithmus, den ich mir ausgedacht habe, ist das zufällige Zeichnen von Punkten, das Überprüfen, ob es bereits gezeichnet wurde, und das anderweitige Zeichnen. Dies funktioniert gut, wenn wir nur wenige Punkte ziehen, aber katastrophaler werden, wenn wir uns dem Bildschirm nähern.
Die beste, die ich kam, ist die Liste der Pixel zu konstruieren, mischen Sie es und wählen Sie die erste n (ich habe python's random.sample dafür verwendet). Es funktioniert besser, ist aber immer noch ein bisschen langsam, weil die ganze Liste von Pixeln im Speicher erstellt werden muss, was beim Zeichnen von 5 Punkten furchtbar übertrieben ist. Hier ist mein Python-Code:
#!/usr/bin/env python
""" drawn n random points on the screen """
import pygame
from pygame.locals import *
import sys
import random
from itertools import product
n = int(sys.argv[1])
s = pygame.display.set_mode()
sx, sy = s.get_size()
points = random.sample(list(product(range(sx), range(sy))), n)
for p in points:
s.fill((255, 255, 255), pygame.Rect(*p, 1, 1))
pygame.display.flip()
while True:
for event in pygame.event.get():
if event.type == QUIT or event.type == KEYDOWN:
sys.exit()
Irgendwelche Vorschläge für einen besseren Algorithmus?
Bearbeiten: Gerade herausgefunden, dieses Problem wird "Reservoir Sampling" genannt. Wikipedia hat eine Reihe von guten Algorithmen: https://en.wikipedia.org/wiki/Reservoir_sampling
Auf den ersten Blick '(x, y) für (x, y) in' scheint nicht notwendig –
@ cricket_007: guter Punkt, das war ein Rest von einer ersten Version . Ich habe den Code in meiner Frage bearbeitet. –