Seite 1 von 1

Vektor multiplizieren (geklärt)

Verfasst: Samstag 23. Februar 2008, 14:52
von kame
Simple Fragen sind doch wohl auch erlaubt oder?

ball.pos = (1, 2, 3)

Der Ball hat eine bestimmte Position. Wie kann ich nun nur das x mit einem Faktor multiplizieren?

Danke,
kame

Verfasst: Samstag 23. Februar 2008, 15:10
von BlackJack
Neues Tupel erzeugen, in dem die erste Position des alten mit einem Faktor multipliziert wird und die anderen beiden Werte einfach übernommen werden.

Verfasst: Samstag 23. Februar 2008, 15:10
von Leonidas
Hallo kame, willkommen im Forum,

für aufwendige Vektorberechnungen solltest du dir SciPy ansehen, aber wenn es nur etwas einfaches sein soll, kannst du auch diesen Code nehmen:

Code: Alles auswählen

>>> def scalar_mult(v, f):
...     return tuple(i * f for i in v)
... 
>>> scalar_mult((1, 2, 3), 2)
(2, 4, 6)
Edit: Sorry BlackJack, hab dein Posting nicht gesehen und schon die Lösung geschrieben. Aber du hast die Erklärung des Codes gepostet, das ist für kame ja auch etwas.

Edit: und dann habe ich auch noch die eigentlich zu lösende Aufgabe falsch verstanden. Shame on me :oops:

Verfasst: Samstag 23. Februar 2008, 15:33
von kame
Danke BlackJack und Leonidas.
Aber ich kann das noch nicht umsetzten. Ich würde mich für den Code von BlackJack interessieren.

Das hier habe ich bisher.
Und ich möchte, dass sich der Ball langsam nach unten bewegt.

Code: Alles auswählen

from visual import *

L = 10 # Laenge des Koordinatensystems

xaxis = curve(pos=[(0,0,0), (L,0,0)], color=(0.5,0.5,0.5))
yaxis = curve(pos=[(0,0,0), (0,L,0)], color=(0.5,0.5,0.5))
zaxis = curve(pos=[(0,0,0), (0,0,L)], color=(0.5,0.5,0.5))

ball1 = sphere(pos=(0,L,0), color=color.red)
ball1.geschwindigkeit = vector(0,-1,0)

while 1:
    rate(30)
    print "Position:", ball1.pos, "Geschwindigkeit:", ball1.geschwindigkeit
    ball1.pos = ball1.pos # + ...


EDIT: In Zeile 10 sollte kein Kommentar stehen.

Verfasst: Samstag 23. Februar 2008, 15:49
von Leonidas
Du hast ein Tupel aus drei Werten: ``ball.pos[0]``, ``ball.pos[1]`` und ``ball.pos[2]``. Jetzt must du ein neues Tupel herstellen, das geht ja mit ``('erste Position', 'zweite Position', 'dritte Position')``. Also musst du den Wert am ersten Index mit deiner Konstante multiplizieren und die beiden anderen aus den alten Daten übernehmen. Wo ist das Problem?

Verfasst: Samstag 23. Februar 2008, 15:59
von kame

Code: Alles auswählen

while 1:
    rate(30)
    print "Position:", ball1.pos, "Geschwindigkeit:", ball1.geschwindigkeit
    ball1.pos = (ball1.pos[0],ball1.pos[1]*0.99,ball1.pos[2])
Jetzt funktionierts!
Das Problem ist, das ich erst seit ein paar Tagen mit Python programmiere. :)

Verfasst: Samstag 23. Februar 2008, 16:22
von Leonidas
Wenn du es etwas schöner haben willst:

Code: Alles auswählen

while True:
    rate(30)
    print "Position: %s Geschwindigkeit: %.2f" % (ball1.pos, ball1.geschwindigkeit)
    ball1.pos = (ball1.pos[0], ball1.pos[1]*0.99, ball1.pos[2])

Verfasst: Samstag 23. Februar 2008, 17:12
von kame
Ich habs schöner gemacht und liebe dieses Python. Genial was ich nach 5 Tagen Python-Erfahrung schon hinbekommen habe.

Kann mal jemand meinen Code testen und sagen warum der Rechner nicht alle Bälle hinzeichnet? Liegt das an der Rechenleistung oder an meiner nicht-fachgerechten Programmierung?

Code: Alles auswählen

from visual import *

L = 10 # Laenge des Koordinatensystems

xaxis = curve(pos=[(0,0,0), (L,0,0)], color=(0.5,0.5,0.5))
yaxis = curve(pos=[(0,0,0), (0,L,0)], color=(0.5,0.5,0.5))
zaxis = curve(pos=[(0,0,0), (0,0,L)], color=(0.5,0.5,0.5))

ball = sphere(pos=(0,L,0), color=color.blue)

fz = 1
timer = 0.00
while 1:
    rate(30)
    timer = timer + 0.03
    fy_sin = math.sin(timer*1.1) * 10
    fx_cos = math.cos(timer*2.5) * 10
    print "Timer: %.2f Position: %s" % (timer, ball.pos)
    ball.pos = (fx_cos,fy_sin,ball.pos[2]*fz)
    if timer*100 % 2 == 0:
        ball2 = sphere(pos=ball.pos, color=color.green)
    if timer*100 % 2 == 1:
        ball3 = sphere(pos=ball.pos, color=color.red)   

Verfasst: Sonntag 24. Februar 2008, 14:09
von kame
kann mir jemand helfen?

Verfasst: Sonntag 24. Februar 2008, 14:57
von BlackJack
Benutze für `timer` keine Fliesskommazahlen, die sind ungenau.

Wie man hier sieht, ist das Ergebnis deshalb nur am Anfang ein paar mal *genau* 1 bzw. *genau* 0:

Code: Alles auswählen

timer = 0.00
while True:
    timer += 0.03
    print '%.50f' % (timer * 100 % 2)

Verfasst: Montag 25. Februar 2008, 01:01
von kame
Vielen Dank :)
Da wäre ich nie drauf gekommen.