Question

Le code fait saillie au-dessous du vecteur bleu, AC, sur le vecteur rouge, AB, la résultante vectorielle projetée, AD, est tracé en violet. Ceci est conçu comme ma propre mise en œuvre de cette de démonstration Wolfram.

Quelque chose ne va pas, cependant, et je ne peux vraiment comprendre ce que. Devrait être soit que la formule de projection est mal ou que je me trompe des coordonnées locales avec coordonnées du monde. Toute aide est appréciée.

Ce code est coupé mais peut encore être exécutée sans problème, supposant que vous avez 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()
Était-ce utile?

La solution

Si pas

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

est

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

Malheureusement, je ne peux pas tester, mais c'est la seule chose qui semble mal pour moi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top