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

Vektor multiplizieren (geklärt)

Beitragvon kame » Samstag 23. Februar 2008, 14:52

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

Beitragvon BlackJack » Samstag 23. Februar 2008, 15:10

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

Beitragvon Leonidas » Samstag 23. Februar 2008, 15:10

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

Beitragvon kame » Samstag 23. Februar 2008, 15:33

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.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Samstag 23. Februar 2008, 15:49

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

Beitragvon kame » Samstag 23. Februar 2008, 15:59

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. :)
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Samstag 23. Februar 2008, 16:22

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

Beitragvon kame » Samstag 23. Februar 2008, 17:12

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:

Beitragvon kame » Sonntag 24. Februar 2008, 14:09

kann mir jemand helfen?
BlackJack

Beitragvon BlackJack » Sonntag 24. Februar 2008, 14:57

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:

Beitragvon kame » Montag 25. Februar 2008, 01:01

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

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder