2009-07-04 5 views
2

아래 코드는 빨간색 벡터 AB에 파란색 벡터 AC를 투영합니다. 결과 투영 된 벡터 AD는 자주색으로 그려집니다. 이는 this Wolfram demonstration을 직접 구현 한 것입니다.Python의 2D 벡터 프로젝션

뭔가 잘못되었지만 실제로 무엇을 파악할 수 있습니다. 투영 수식 자체가 잘못되었거나 일부 로컬 좌표를 세계 좌표로 잘못 이해 했어야합니다. 어떤 도움을 주셔서 감사합니다. 나는

import pygame 
from pygame.locals import * 

def vadd(a,b): 
    return (a[0]+b[0],a[1]+b[1]) 

def vsub(a,b): 
    return (a[0]-b[0],a[1]-b[1]) 

def project(a, b): 
    """ project a onto b 
     formula: b(dot(a,b)/(|b|^2)) 
    """ 
    abdot = (a[0]*b[0])+(a[1]*b[1]) 
    blensq = (b[0]*b[0])+(b[1]*b[1]) 

    temp = float(abdot)/float(blensq) 
    c = (b[0]*temp,b[1]*temp) 

    print a,b,abdot,blensq,temp,c 
    return c 

pygame.init() 
screen = pygame.display.set_mode((150, 150)) 
running = True 

A = (75.0,75.0) 
B = (100.0,50.0) 
C = (90,70) 

AB = vsub(B,A) 
AC = vsub(C,A) 

D = project(AC,AB) 
AD = vsub(D,A) 

while running: 
    for event in pygame.event.get(): 
     if event.type == QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE): 
      running = False 

    pygame.draw.line(screen, (255,0,0), A, B) 
    pygame.draw.line(screen, (0,0,255), A, C) 
    pygame.draw.line(screen, (255,0,255), A, D) 
    pygame.display.flip() 

답변

6

이 아닌이

D = project(AC,AB) 
AD = vsub(D,A) 

불행하게도

AD = project(AC,AB) 
D = vadd(A,AD) 

해야합니다 당신은 파이 게임을 가정,

이 코드는 트리밍하지만 여전히 문제없이 실행할 수 있습니다 그것을 테스트 할 수는 없지만 그것이 저에게 잘못 보이는 유일한 것입니다.

+1

D가 정의되어 있지 않으므로 D를 D에 추가하여 D 정의. 또는 나는 무엇인가 놓치고 있냐? "D = vadd (A, AD)"라는 뜻입니까? – Mizipzor

+0

감사합니다. – schnaader

+0

테스트를 거쳤습니다. 그 사소한 수정으로 나는 당신의 대답을 받아들입니다, 감사합니다. ;) – Mizipzor