from PyQt4 import QtGui, QtCore import math from PyQt4.QtGui import QGraphicsEllipseItem import time class Window(QtGui.QWidget): def __init__(self): QtGui.QWidget.__init__(self) self.view = View(self) #self.button = QtGui.QPushButton('Clear view', self) #self.button.clicked.connect(self.handleClearView) # self.button.clicked.connect(self.handlePoints) layout = QtGui.QVBoxLayout(self) layout.addWidget(self.view) #layout.addWidget(self.button) def handleClearView(self): self.view.scene().clear() class View(QtGui.QGraphicsView): def __init__(self, parent): QtGui.QGraphicsView.__init__(self, parent) self.setScene(QtGui.QGraphicsScene(self)) self.setSceneRect(QtCore.QRectF(self.viewport().rect())) self.listOfPoints = [] self.listOfClusters = [] self.counter = 0; self.choosen = 0; self.Point = QtGui.QPushButton('Point', self) self.Claster = QtGui.QPushButton('Claster', self) self.ClusteringEuclid = QtGui.QPushButton('Clustering Euclid', self) self.ClusteringManhattan = QtGui.QPushButton('Clustering Manhattan', self) self.Claster.move(83,0) self.ClusteringEuclid.move(166,0) self.ClusteringManhattan.move(292,0) self.Point.clicked.connect(self.handleButton2) self.Claster.clicked.connect(self.handleButton3) self.ClusteringEuclid.clicked.connect(self.handleButton4) self.ClusteringManhattan.clicked.connect(self.handleButton5) self.colorList = [QtCore.Qt.red, QtCore.Qt.green, QtCore.Qt.black, QtCore.Qt.magenta, QtCore.Qt.yellow, QtCore.Qt.blue, QtCore.Qt.gray, QtCore.Qt.cyan, QtCore.Qt.darkRed] def handleButton2(self): self.counter = 0; print(self.counter) def handleButton3(self): self.counter = 1; print(self.counter) def handleButton4(self): self.counter = 2; self.choosen = 1; def handleButton5(self): self.counter = 2; def mousePressEvent(self, event): self._start = event.pos() def mouseReleaseEvent(self, event): start = QtCore.QPointF(self.mapToScene(self._start)) if self.counter == 0: point = start ellipsec = self.scene().addEllipse(point.x(),point.y(),4,4) ellipsec.setBrush(QtCore.Qt.gray) ellipsec.setPen(QtCore.Qt.gray) self.listOfPoints.append(point) elif self.counter == 1: point = start ellipsec = self.scene().addEllipse(point.x()-5,point.y()-5,10,10) ellipsec.setBrush(QtCore.Qt.gray) ellipsec.setPen(QtCore.Qt.gray) self.listOfClusters.append(point) elif self.counter == 2: while (True): breakPoint = 0 Array = [[] for y in range(len(self.listOfClusters))] for i in range(len(self.listOfPoints)): min = math.sqrt(math.pow((self.listOfClusters[0].x() - self.listOfPoints[i].x()),2) + math.pow((self.listOfClusters[0].y() - self.listOfPoints[i].y()),2)) index = 0; for j in range(len(self.listOfClusters)): if self.choosen == 1: distance = math.sqrt(math.pow((self.listOfClusters[j].x() - self.listOfPoints[i].x()),2) + math.pow((self.listOfClusters[j].y() - self.listOfPoints[i].y()),2)) else: distance = (math.fabs(self.listOfClusters[j].x()-self.listOfPoints[i].x()) + math.fabs(self.listOfClusters[j].y() - self.listOfPoints[i].y())) if min > distance: min = distance index = j; Array[index].append(self.listOfPoints[i]) self.scene().clear() for i in range(len(self.listOfClusters)): ellipseColor = self.scene().addEllipse(self.listOfClusters[i].x(),self.listOfClusters[i].y(), 10, 10) ellipseColor.setPen(self.colorList[i]) ellipseColor.setBrush(self.colorList[i]) for j in range(len(Array[i])): pointColor = self.scene().addEllipse(Array[i][j].x(),Array[i][j].y(), 4, 4) pointColor.setPen(self.colorList[i]) pointColor.setBrush(self.colorList[i]) lineColor = self.scene().addLine(self.listOfClusters[i].x()+5,self.listOfClusters[i].y()+5,Array[i][j].x()+2,Array[i][j].y()+2, self.colorList[i]) for i in range (len(self.listOfClusters)): newPointX = 0 newPointY = 0 for j in range (len(Array[i])): newPointX += Array[i][j].x() newPointY += Array[i][j].y() if len(Array[i]) != 0: newX = newPointX / len(Array[i]) newY = newPointY / len(Array[i]) newPoint = QtCore.QPoint(newX, newY) if (newPoint.x() == self.listOfClusters[i].x()) & (newPoint.y() == self.listOfClusters[i].y()): breakPoint += 1; self.listOfClusters[i] = newPoint if breakPoint == len(self.listOfClusters): print("end") break; else: self.scene().clear() if __name__ == '__main__': import sys app = QtGui.QApplication(sys.argv) window = Window() window.resize(640, 480) window.show() sys.exit(app.exec_())