Python中的2D向量投影

3
下面的代码将蓝色向量AC投影到红色向量AB上,得到的投影向量AD用紫色表示。这是我自己实现this Wolfram demonstration的意图。
但是似乎有些问题,我真的无法弄清楚是什么问题。可能是投影公式本身有误或者我混淆了一些局部坐标和世界坐标。任何帮助都将不胜感激。
此代码已削减,但仍可正常执行,假设您拥有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()
1个回答

6

这不应该

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

成为

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

很遗憾,我无法测试它,但这是我看到的唯一错误。


1
将 A 加到 D 中定义 D 是不起作用的,因为 D 还没有被定义。或者我漏掉了什么?你是不是想说 "D = vadd(A,AD)"? - Mizipzor
测试过了,看起来可以工作。在进行了那个小改正之后,我接受你的答案,谢谢;) - Mizipzor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接