2009-07-04 25 views
2

以下のコードは、赤いベクトルABに青のベクトルACを投影します。結果の投影されるベクトルADは紫色で描画されます。これは私自身の実装であるthis Wolfram demonstrationを意図しています。Pythonでの2Dベクトル投影

何かが間違っていますが、私は本当に何を理解することができます。投影式自体が間違っているか、ローカル座標系とワールド座標系を間違えているはずです。どんな助けもありがとうございます。

このコードはトリミングされているが、まだ問題なく実行することができ、あなたは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() 

答えて

6

この

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

は残念ながら

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

すべきではありませんそれをテストすることはできませんが、それは私に間違って見える唯一のものです。

+1

Dがまだ定義されていないため、AをDに追加することによってDを定義する。または私は何かを逃していますか?あなたは "D = vadd(A、AD)"を意味しましたか? – Mizipzor

+0

ありがとうございました。 – schnaader

+0

それをテストしたところ、うまくいくようです。その小さな修正で、私はあなたの答えを受け入れます、ありがとう。 ;) – Mizipzor

関連する問題