2016-05-24 25 views
1

ich ein Polygon für einen Zeiger definiert haben:Drehen eines Polygons um seinen Mittelpunkt

für dieses Polygon
0,-12,10,12,-10,12 

Der Schwerpunkt ist:

0,0 

Ich möchte das Polygon um den Schwerpunkt zu drehen, so dass 45 Grad bewirken, dass der Zeiger auf 2 Uhr und 180 auf 6 Uhr, 270 bis 9 Uhr, zeigt.

ich dies in Qt5.6 ich schreibe, so weit mein Code wie folgt aussieht, weiß ich es nicht richtig ist:

QStringList lstPoints = strPoints.split(clsXMLnode::mcucPointsDelimiter); 
    int intPoints = lstPoints.length(); 
    if (intPoints >= 2) { 
     int intArraySize = intPoints/2; 
     QPoint aryPts[intArraySize], ptXY = pobjChild->ptGetXY(); 
     int i, p; 
     i = p = 0; 

     while(p<intPoints) { 
      float fltX = lstPoints[p++].toFloat() 
       ,fltY = lstPoints[p++].toFloat(); 
      if (fltAngle != 0.0f) { 
       double dblRadians = (fltAngle/180.0) * M_PI 
         ,dblCosAngle = cos(dblRadians) 
         ,dblSinAngle = sin(dblRadians); 
       fltX = fltX * dblCosAngle - fltY * dblSinAngle; 
       fltY = fltY * dblSinAngle + fltX * dblCosAngle; 
      } 
    //Translate local co-ordinates to co-ordinates to be used on display 
      fltX += (float)ptXY.x(); 
      fltY += (float)ptXY.y(); 
      aryPts[i++] = QPoint((int)fltX, (int)fltY); 
     } 
     if (strColor.isEmpty() != true) { 
      pobjPainter->setPen(QColor(strColor)); 
     } 
     if (strFill.isEmpty() != true) { 
      pobjPainter->setBrush(QBrush(QColor(strFill))); 
     } 
     pobjPainter->drawPolygon(aryPts, intArraySize, Qt::WindingFill); 

strPoints eine Zeichenfolge, die das Polygon durch begrenzt enthält ‚‘ .

Ohne Drehung (0) erscheint das Polygon genau dort, wo ich es erwarten würde, aber bei jeder Drehung erscheint es immer noch, wo ich es erwarte, sieht aber nicht richtig aus.

Antwort

0

Das Problem ist hier:

fltX *= dblCosAngle - fltY * dblSinAngle; 
    fltY *= dblSinAngle + fltX * dblCosAngle; 

dies entspricht

fltX = fltX*(dblCosAngle - fltY * dblSinAngle); 
    fltY = fltY*(dblSinAngle + fltX * dblCosAngle); 

aber sollten Sie

double tmpX = fltX; 
    fltX = fltX*dblCosAngle - fltY*dblSinAngle; 
    fltY = fltY*dblCosAngle + tmpX*dblSinAngle; 
+0

Sie verwenden danken, entdeckte ich, dass das ist, warum Sie meine bemerken Code liest jetzt anders, aber es ist immer noch nicht korrekt. – SPlatten

+0

Es gibt auch ein Problem beim Überschreiben von 'fltX', das habe ich gerade hinzugefügt. – alain

+0

Danke, werde jetzt versuchen. – SPlatten

Verwandte Themen