2009-07-04 8 views
2

Der folgende Code projiziert den blauen Vektor AC auf den roten Vektor AB, der resultierende projizierte Vektor AD wird als violett gezeichnet. Dies ist als meine eigene Implementierung von this Wolfram demonstration gedacht.2D-Vektorprojektion in Python

Etwas stimmt aber nicht, und ich kann wirklich herausfinden, was. Sollte entweder sein, dass die Projektionsformel selbst falsch ist oder dass ich einige lokale Koordinaten mit Weltkoordinaten verwechsele. Jede Hilfe wird geschätzt.

Dieser Code getrimmt, aber immer noch ohne Probleme ausgeführt werden, vorausgesetzt, Sie haben pygame:

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() 

Antwort

6

Sollte dies nicht

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

Leider I,

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

sein Ich kann es nicht testen, aber das ist das einzige, was mir falsch erscheint.

+1

Das Definieren von D durch Hinzufügen von A zu D funktioniert nicht, da D noch nicht definiert ist. Oder fehlt mir etwas? Meintest Du "D = vadd (A, AD)"? – Mizipzor

+0

Danke, korrigiert. – schnaader

+0

Getestet, und es scheint zu funktionieren. Mit dieser kleinen Korrektur akzeptiere ich deine Antwort, danke. ;) – Mizipzor