Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的二维矢量投影_Python_Math_2d_Projection - Fatal编程技术网

Python中的二维矢量投影

Python中的二维矢量投影,python,math,2d,projection,Python,Math,2d,Projection,下面的代码将蓝色向量AC投影到红色向量AB上,得到的投影向量AD绘制为紫色。这是我自己实现的 然而,有些地方出了问题,我真的能弄明白是什么。要么投影公式本身是错误的,要么我把局部坐标和世界坐标弄错了。感谢您的帮助 假设您有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[

下面的代码将蓝色向量AC投影到红色向量AB上,得到的投影向量AD绘制为紫色。这是我自己实现的

然而,有些地方出了问题,我真的能弄明白是什么。要么投影公式本身是错误的,要么我把局部坐标和世界坐标弄错了。感谢您的帮助

假设您有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()
这不应该吗

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


不幸的是,我无法测试它,但这是我唯一觉得不对的地方。

通过在D中添加A来定义D不起作用,因为D还没有定义。还是我遗漏了什么?你的意思是“D=vadd(A,AD)”?测试了它,它似乎起了作用。稍加更正,我接受你的回答,谢谢
AD = project(AC,AB)
D = vadd(A,AD)