Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from PyQt4 import QtGui , QtCore
- import sys
- import math , time
- class Window(QtGui.QWidget):
- def __init__(self):
- super(Window , self).__init__()
- self.UI()
- def UI(self):
- layout = QtGui.QGridLayout()
- button = QtGui.QPushButton('Rotate')
- button.clicked.connect(self.polychange)
- button.setCheckable(True)
- self.view = Example()
- layout.addWidget(button , 0 , 0)
- layout.addWidget(self.view , 0 , 1)
- self.setLayout(layout)
- self.show()
- def polychange(self , sender):
- if sender:
- self.view.polyrotate = 1
- self.view.polyf.setFlag(QtGui.QGraphicsItem.ItemIsMovable , False)
- else:
- self.view.degrees = 0
- self.view.polyf.setFlag(QtGui.QGraphicsItem.ItemIsMovable)
- class Example(QtGui.QGraphicsView):
- def __init__(self):
- super(Example , self).__init__()
- self.setSceneRect(0 , 0 , 200 , 200)
- self.degrees = 0
- self.polyrotate = 0
- self.polygon = QtGui.QPolygonF([QtCore.QPointF(50 , 50 ) , QtCore.QPointF(100 , 50) , QtCore.QPointF(100 , 100) , QtCore.QPointF(50 , 100)])
- self.polyf = QtGui.QGraphicsPolygonItem(self.polygon)
- self.polyf.setFlag(QtGui.QGraphicsItem.ItemIsMovable)
- self.scene = QtGui.QGraphicsScene()
- self.setScene(self.scene)
- self.scene.addItem(self.polyf)
- 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)
- if __name__ == '__main__':
- app = QtGui.QApplication(sys.argv)
- we = Window()
- sys.exit(app.exec_())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement