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()
War es hilfreich?

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
scroll top