Seite 1 von 1

rotate drehpunkt verstellen (QGraphicsItem)

Verfasst: 27. Mai 2007 20:52
von thomasgruebler
Hallo,

ich programmiere an einem Simulationsprogramm für autonome Roboter.
Der Roboter ist ein svg. Das sollte gedreht werden in kurven etc. wenn ich jezzt rotate(45) reinschreibe, dreht der genau um die linke obere ecke um 45°. und ich möchte den drehpunkt aber gerne in der mitte bzw verstellbar einmal bei dem reifen, dann bei dem andern.

derzeit sieht meine funktion die vom timer aufgerunfen wird andauernd so aus:

Code: Alles auswählen

void Robot::timerEvent ( QTimerEvent * )
{
    alpha += angle;

    xpos += ::cos( gradtorad( alpha ) ) * speed;
    ypos += ::sin( gradtorad( alpha ) ) * speed;

    rotate ( angle );
    setPos ( xpos, ypos );


    update();

//Reset angle variable
    angle = 0;
}
gelernt hab ich das aus dem colliding mice example von trolltech.

lg
Thomas

Verfasst: 27. Mai 2007 20:58
von upsala
translate(-pos)
rotate(angle)
translate(pos)

Verfasst: 27. Mai 2007 21:47
von thomasgruebler
upsala hat geschrieben:translate(-pos)
rotate(angle)
translate(pos)
danke. habs mal so nachgemacht:

Code: Alles auswählen

    alpha += angle;
    translate ( -xpos, -ypos );
    xpos += ::cos( gradtorad( alpha ) ) * speed;
    ypos += ::sin( gradtorad( alpha ) ) * speed;

    rotate ( angle );
    setPos ( xpos, ypos );
alpha ist außerdem der derzeitige winkel und angle der drehwinkel. xpos/ypos sind die derzeitigen koordinaten und nicht eine verschiebung.

doch es funktioniert nicht.

außerdem muss ich den drehpunkt auf jedem punkt der achse (es gibt anfangs nur eine achse in der mitte und hinten vorne stützräder). denn machmal ist ein rad schneller als das andere oder so.

Verfasst: 27. Mai 2007 22:40
von thomasgruebler
Hab jetzt rausgefunden was du meinst.

das translate mit dem halben with/height. nur derzeit weis ich nicht wie ich die einstellen kann.
es gibt nur auslesen und scale. gehts nicht einfacher?

lg
Thomas

Verfasst: 29. Mai 2007 14:29
von thomasgruebler
hallo.

jetzt mach ichs mal so:

Code: Alles auswählen

    setPos ( (xpos + boundingRect().width()/2),
              (ypos + boundingRect().height()/2) );
    xpos += ::cos( gradtorad( alpha ) ) * speed;
    ypos += ::sin( gradtorad( alpha ) ) * speed;

    rotate ( angle );
    setPos ( xpos, ypos );

//angle...drehwinkel
//alpha...derzeitiger winkel
//xpos/ypos.....derzeitige position. ich brauch die werte später.
nur es will nicht :(

es passiert wieder dasselbe. es dreht um den linken oberen punkt.

bitte helft mir

lg
Thomas