Numpy position и vector arrays - реализовать обнаружение столкновений - PullRequest
0 голосов
/ 13 августа 2010

Я использую точечные спрайты в PyOpenGL с numpy и glDrawArrays.Итак, у меня есть два массива, один для точек и один для векторов.

        r = lambda: random.random()        
        self.pts = numpy.zeros((2000,2), dtype=numpy.uint16)
        for pt in self.pts:
            pt[0] = 300*r()
            pt[1] = 200*r()

        self.vectors = numpy.zeros((2000,2), dtype=numpy.uint16)
        for vec in self.vectors:
            vec[0] = 3*r()
            vec[1] = 3*r()

Теперь мне нужно обновить массив позиций и вектор на основе столкновения с границами экрана.Так, например,

if pt[0][0]-width < 0: pt[0][0] = width; vec[0][0] *= -1

В конце я должен иметь на экране массивы pts размером 2000x2 для подачи в opengl.

EDIT - текущее решение для сохранения точек внутри ограничительной рамки (0, 0, ширина, высота)

points [:,0][points[:,0] > width] = width
vectors[:,0][points[:,0] > width] *= -1
points [:,0][points[:,0] < 0] = 0
vectors[:,0][points[:,0] < 0] *= -1
points [:,1][points[:,1] > height] = height
vectors[:,1][points[:,1] > height] *= -1
points [:,1][points[:,1] < 0] = 0
vectors[:,1][points[:,1] < 0] *= -1

1 Ответ

0 голосов
/ 13 августа 2010

Если я понимаю ваш вопрос, вы хотите сделать что-то вроде этого: (пытаясь проиллюстрировать несколько различных методов здесь)

import numpy as np

numpoints, numdimensions = 2000, 2

# Generate random points
points = np.random.random((numpoints, numdimensions))
points[:,0] *= 300
points[:,1] *= 200
points = points.astype(np.int16)

# Generate random vectors
vectors = np.random.randint(-3, 3, size=(numpoints, numdimensions)).astype(np.int16)

# Update points and vectors where point x-coords are > width 
points[:,0][points[:,0] > width] = width
vectors[:,0][points[:,0] > width] = -1
...