Завъртане - TransformOriginPoint - PyQt4

Опитвах се да създам малък потребителски интерфейс с помощта на PyQt.

Той има прозорец, бутон (завъртане) и многоъгълник (правоъгълник) в QGraphicsView. Една от целите на приложението е да позволи на потребителя да завърти многоъгълника. Това е, след като бутонът е щракнат и потребителят щракне в точка, най-близкият връх автоматично се измества или накланя към щракването на потребителя. Също така зададох многоъгълника да бъде подвижен преди щракването и да не може да се движи след щракването.

Проблемът е, че ако потребителят премести многоъгълника и след това щракне, полигонът се завърта по странен начин. Може ли някой да ми помогне да разбера грешката? Предполагам, че може да е с setTransformOriginPoint.

РЕДАКТИРАНЕ: Имам два класа, наследени от QtGui.QWidget и QtGui.QGraphicsScene.

class Window(QtGui.QWidget):
    def polychange(self , sender): //Called by the button , 
        if sender:
                self.view.polyrotate = 1 //self.view is an instance of QGraphicsScene class
                self.view.polyf.setFlag(QtGui.QGraphicsItem.ItemIsMovable , False)

        else:
                self.view.polyrotate = 0 
                self.view.degrees = 0
                self.view.polyf.setFlag(QtGui.QGraphicsItem.ItemIsMovable)

class Example(QtGui.QGraphicsView):
    def mousePressEvent(self , e):
        super(Example , self).mousePressEvent(e)
        self.x = e.x()
        self.y = e.y()
        if self.polyrotate == 1:
            self.Rotate()

    def Rotate(self):

        self.pverticesx = []
        self.pverticesy = []
        distances = []
        for i in range(4):
            self.pverticesx.append(self.polyf.mapToScene(self.polyf.polygon()[i]).x())
            self.pverticesy.append(self.polyf.mapToScene(self.polyf.polygon()[i]).y())

        x1 = self.x
        y1 = self.y      

        for i in range(4):
             distance = math.hypot(self.pverticesx[i] - x1 , self.pverticesy[i] - y1)
             distances.append(distance)
        midpointx = (self.pverticesx[0] +  self.pverticesx[2]) / 2
        midpointy = (self.pverticesy[0] +  self.pverticesy[2]) / 2
        index = distances.index(min(distances))          
        pointx = self.pverticesx[index]                
        pointy = self.pverticesy[index]
        vector1 = [x1 - midpointx , y1 - midpointy]
        vector2 = [pointx - midpointx , pointy - midpointy]
        num = 0

        for i in [0 , 1]:
            num = num + (vector1[i] * vector2[i])  
        den = math.sqrt(sum(map(lambda x : x * x , vector1))) *  math.sqrt(sum(map(lambda x : x * x , vector2)))

        degree = math.degrees(math.acos(num / den))
        self.degrees = degree + self.degrees
        if self.degrees > 360:
            rotation = self.degrees / 360
            self.degrees = self.degrees - (rotation * 360)

        self.polyf.setTransformOriginPoint(midpointx , midpointy)
        self.polyf.setRotation(self.degrees)

Ето по-изчерпателна връзка към моя код. RotateApp . Благодаря предварително.


person Manoj    schedule 30.01.2013    source източник
comment
Трябва да редактирате публикацията си, за да съдържа съответните редове код, където изчислявате и прилагате трансформацията (и/или началната точка). Някои от причините са, че този въпрос (ако има отговор) все още е полезен за други в далечното бъдеще (не съм сигурен колко дълго го съхранява pastebin) и фактът, че pastebin е блокиран от някои фирмени проксита;)   -  person Tim Meyer    schedule 30.01.2013
comment
Редактирах го. Надявам се, че можете да ми помогнете сега :)   -  person Manoj    schedule 30.01.2013


Отговори (2)


не съм толкова запознат с PyQt, но при въртене, повечето API се въртят около точката (0,0), така че правилното поведение е да: 1 - преместите многоъгълника на 0,0 2- завъртите многоъгълника 3- преместите многоъгълника обратно

надявам се, че това помага,

за разбирането.

person Max    schedule 31.01.2013
comment
Благодаря за вашето предложение. Но не трансформира началната точка, погрижете се за този факт. Въпреки това скоро ще го пробвам. - person Manoj; 31.01.2013

Открих отговора на собствения си въпрос. Преди завъртане, midpointx и midpointy са в координатите на сцената. Така че трябваше да ги картографирам обратно в координатната система на QGraphicsItem. Този ред преди self.setRotation() ще свърши работа.

self.polyf.setTransformOriginPoint(self.polyf.mapFromScene(QtCore.QPointF(midpointx , midpointy)))

Сега моят многоъгълник не се движи на случаен принцип.

person Manoj    schedule 31.01.2013