2D-Vektor-Projektion in Python
-
22-08-2019 - |
Frage
Der Code unten projiziert das blaue Vektor, AC, auf den roten Vektor, AB, der resultierende projizierte Vektor, AD, als lila gezeichnet. Dies soll als meine eigene Implementierung von dieser Wolfram Demonstration .
Irgend etwas stimmt nicht aber, und ich kann wirklich herausfinden, was. Sollte sein, dass entweder die Projektionsformel selbst falsch ist oder dass ich einige lokalen Koordinaten verwechseln mit Weltkoordinaten. Jede Hilfe ist willkommen.
Dieser Code getrimmt ist, aber trotzdem 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()
Lösung
Sollte das nicht
D = project(AC,AB)
AD = vsub(D,A)
sein
AD = project(AC,AB)
D = vadd(A,AD)
Leider kann ich es nicht testen, aber das ist das einzige, was mir falsch aussieht.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow