python - Python 中的二维矢量投影

标签 python math 2d projection

下面的代码将蓝色矢量 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()

最佳答案

不应该

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

成为

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

不幸的是,我无法对其进行测试,但这是我认为唯一不对的地方。

关于python - Python 中的二维矢量投影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1082187/

相关文章:

Android:从 SurfaceView 更改 Activity

python - 如何在终端的atom中运行python代码?

java - 关于简单算术运算的问题

python - 张量不是该图的元素;部署 Keras 模型

math - 将 3D 点转换为 2D

javascript - 计算末端旋转圆

java - 重力与预定目的地

python - 如何将二维列表中的值 append 到另一个列表并打印它

python - 如何将十进制数转换为具有最小值的基数?

python - 为什么类方法的 super 需要第二个参数?