2010-12-20 6 views
0

화면에 직접 렌더링되지 않는 파이 게임을 사용하여 빠른 선을 그리려는 중입니다. 나는 원하는 해상도의 픽셀 수만큼 큰 파이썬리스트를 얻었고 픽셀이 라인 알고리즘에 의해 명중 된 횟수에 해당하는 정수 값을 저장합니다. 이를 사용하면 2D 히트 맵이 작성되므로 평면 픽셀 값을 그리는 대신 픽셀 값이 선을 통과하는 횟수를 기준으로 픽셀 값이 증가하고 "고온"픽셀이 더 밝아집니다.파이 게임에서 빠른 선 그리기

이 방법을 사용하는 이유는이 선들이 얼마나 많이 그려지는지, 그리고 주어진 픽셀이 얼마나 많은 횟수로 히트 될지 미리 알 수 없다는 것입니다. 각 렌더링이 올바른 최대 및 최소 RGB 값을 갖도록 출력의 크기를 조정하고자하므로 화면에 그릴 수 없습니다.

상대적으로 순진한 Bresenham의 알고리즘보다이 선을 그리는 더 좋은 방법이 있습니까? 여기 drawLine 함수의 중요한 부분이다 :

# before the loop, to save repeated multiplications 
    xm = [] 
    for i in range(resolution[0]): 
    xm.append(i * resolution[0]) 

    # inside of drawLine, index into the f list, of size resolution[0] * resolution[1] 
    for x in range(x0, x1 + 1): 
    if steep: 
     idx = y + xm[x] 
     f[idx] += 1 
    else: 
     idx = x + xm[y] 
     f[idx] += 1 

결과적 스케일링 F의 내부의 최대 값에 기초하여 상기 스크린에 그려. 예를 들어 최대 값이 1000 인 경우 각 픽셀의 RGB 값은 (f [i] * 255)/1000이라고 가정 할 수 있습니다.

프로필 정보에 따르면 런타임은 인덱스 조회에 의해 지배됩니다 f에 입력하십시오. 나는이 기본적인리스트가 파이썬에서 numpy 배열이나 배열보다 빠르다는 것을 증명하기 위해 이전의 질문을 사용했다. 그러나 이와 같은 라인을 그리기 위해 여전히 개선 할 여지가있는 것처럼 보인다.

알 수없는 라인 수를 화면에 그릴 때 가장 좋은 방법은 무엇입니까? 최종 출력을 화면으로 렌더링하도록 조정한다는 것을 알고 있습니까? 인덱스 오버 헤드를 제거하는 좋은 방법이 있습니까?

답변

1

Cython이나 비슷한 것을 사용해보십시오.

사이 썬은 쓰기 C 및 C++ 확장자 CPython의 파이썬 런타임 모듈을 단순화 에 프로그래밍 언어 (당신이 경우에 도움이 얼마나/경우에, 나는 알고에 관심이있을 것이다). 엄밀히 말하자면 Cython 구문은 Python 구문 의 상위 집합으로 추가적으로 다음을 지원합니다. 직접 C 함수 호출 또는 Cython 코드의 C++ 함수/메소드 호출. Cython 변수, 클래스 및 클래스 속성을 C 유형으로 강력하게 입력합니다 (C 유형). Cython은 Python이 아닌 C 또는 C++ 코드로 컴파일되고 결과는 Python Extension 모듈 또는 독립 실행 형 응용 프로그램 으로 CPython 런타임을 포함하여 사용됩니다. (http://en.wikipedia.org/wiki/Cython)

+0

당연히 'cdef'가 적절하게 필요합니다. 그렇지 않으면 ** 많아야 ** ** 10 %가됩니다. – delnan

+1

완벽하고, numpy와 적절한 cdef 문을 가진 Cython은 가장 기본적인 추가가 있더라도 극적으로 개선되었습니다. 계속 연결해 보겠습니다.하지만 지금까지는 numpy 배열에서 명시적인 int 인덱싱으로 전환하면 약 80 % -90 % 빨라졌습니다. 감사! – swrittenb