Vektor multiplizieren (geklärt)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
kame
User
Beiträge: 49
Registriert: Samstag 23. Februar 2008, 14:45
Kontaktdaten:

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
Zuletzt geändert von kame am Montag 25. Februar 2008, 01:02, insgesamt 1-mal geändert.
BlackJack

Neues Tupel erzeugen, in dem die erste Position des alten mit einem Faktor multipliziert wird und die anderen beiden Werte einfach übernommen werden.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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:
Zuletzt geändert von Leonidas am Samstag 23. Februar 2008, 15:44, insgesamt 1-mal geändert.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
kame
User
Beiträge: 49
Registriert: Samstag 23. Februar 2008, 14:45
Kontaktdaten:

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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
kame
User
Beiträge: 49
Registriert: Samstag 23. Februar 2008, 14:45
Kontaktdaten:

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. :)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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])
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
kame
User
Beiträge: 49
Registriert: Samstag 23. Februar 2008, 14:45
Kontaktdaten:

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)   
kame
User
Beiträge: 49
Registriert: Samstag 23. Februar 2008, 14:45
Kontaktdaten:

kann mir jemand helfen?
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)
kame
User
Beiträge: 49
Registriert: Samstag 23. Februar 2008, 14:45
Kontaktdaten:

Vielen Dank :)
Da wäre ich nie drauf gekommen.
Antworten