Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import sys
- from ui_mainform import Ui_MainWindow
- from PySide.QtCore import *
- from PySide.QtGui import *
- class Point(object):
- def __init__(self, x, y):
- self.x, self.y = x, y
- def transform(self, k, height):
- return Point(self.x * k, (height - self.y) * k)
- class LineFunction(object):
- def __init__(self, pointFrom, pointTo):
- self.pointFrom = pointFrom
- self.pointTo = pointTo
- self.ld = min(abs(pointFrom.x - pointTo.x), abs(pointFrom.y - pointTo.y))
- self.gd = max(abs(pointFrom.x - pointTo.x), abs(pointFrom.y - pointTo.y))
- self.value = self.gd >> 1
- self.d = self.gd - self.ld
- self.step = 0
- def calc_next(self):
- if self.value < 0: self.value += self.d
- else: self.value -= self.ld
- self.step += 1
- def __str__(self):
- s = ''
- if self.step > 0:
- if self.value < 0: s = 'it\'s less then 0; /'
- else: s = 'it\'s >= 0; -'
- return '<font color=blue>Step {0:00}:</font> f({0:0}) = {1} <font color=red>{2}</font>'\
- .format(self.step, self.value, s)
- class Form(QMainWindow, Ui_MainWindow):
- def __init__(self):
- super(Form, self).__init__()
- self.setupUi(self)
- self.connect_actions()
- def setupUi(self, MainWindow):
- super(Form, self).setupUi(MainWindow)
- self.scene = QGraphicsScene()
- self.graphicsView.setScene(self.scene)
- self.k = 40
- def connect_actions(self):
- self.pushButtonDraw.clicked.connect(self.draw)
- self.pushButtonClear.clicked.connect(self.clear)
- def draw(self):
- pointFrom = Point(self.spinBoxFromX.value(), self.spinBoxFromY.value())
- pointTo = Point(self.spinBoxToX.value(), self.spinBoxToY.value())
- width = self.spinBoxWidth.value()
- height = self.spinBoxHeight.value()
- self.textBrowserTrace.append('<font color=green><b>Point from: ({0}; {1}), point to: ({2}; {3}).</b></font>'\
- .format(pointFrom.x, pointFrom.y, pointTo.x, pointTo.y))
- self.drawGrid(width, height)
- self.drawLine(pointFrom, pointTo, width, height)
- self.drawPoints(pointFrom, pointTo, width, height)
- self.tabWidget.setCurrentWidget(self.tab_2)
- def drawGrid(self, width, height):
- p = QPen()
- p.setWidth(1)
- p.setBrush(Qt.black)
- self.scene.setSceneRect(0, 0, width * self.k, height * self.k)
- for i in range(0, width + 1):
- self.scene.addLine(i * self.k, 0, i * self.k, height * self.k, p)
- for i in range(0, height + 1):
- self.scene.addLine(0, i * self.k, width * self.k, i * self.k, p)
- def drawLine(self, pointFrom, pointTo, width, height):
- p = QPen()
- p.setWidth(3)
- p.setBrush(Qt.black)
- p.setCapStyle(Qt.RoundCap)
- f = pointFrom.transform(self.k, height)
- t = pointTo.transform(self.k, height)
- self.scene.addLine(f.x, f.y, t.x, t.y, p)
- def drawPoints(self, pointFrom, pointTo, width, height):
- if pointFrom.x >= pointTo.x and pointFrom.y < pointTo.y or \
- pointFrom.x > pointTo.x and pointFrom.y >= pointTo.y:
- tmp, pointFrom = pointFrom, pointTo
- pointTo = tmp
- line = LineFunction(pointFrom, pointTo)
- self.textBrowserTrace.append('<b>Lower:</b> {0}; <b>greater:</b> {1}; <b>delta:</b> {2}.'\
- .format(line.ld, line.gd, line.d))
- self.textBrowserTrace.append(str(line))
- incx, incy = None, None
- if pointFrom.y <= pointTo.y:
- if abs(pointFrom.x - pointTo.x) > abs(pointFrom.y - pointTo.y):
- incx = lambda value: 1
- incy = lambda value: 1 if value < 0 else 0
- else:
- incx = lambda value: 1 if value < 0 else 0
- incy = lambda value: 1
- else:
- if abs(pointFrom.x - pointTo.x) > abs(pointFrom.y - pointTo.y):
- incx = lambda value: 1
- incy = lambda value: -1 if value < 0 else 0
- else:
- incx = lambda value: 1 if value < 0 else 0
- incy = lambda value: -1
- self.__drawPoint(pointFrom.transform(self.k, height))
- for i in range(0, line.gd):
- line.calc_next()
- pointFrom.x += incx(line.value)
- pointFrom.y += incy(line.value)
- self.__drawPoint(pointFrom.transform(self.k, height))
- self.textBrowserTrace.append(str(line))
- def __drawPoint(self, point):
- p = QPen()
- p.setWidth(5)
- p.setBrush(Qt.red)
- p.setCapStyle(Qt.RoundCap)
- print point.x, point.y
- self.scene.addLine(point.x, point.y, point.x + 1, point.y, p)
- def clear(self):
- self.scene.clear()
- def main(argv):
- app = QApplication(argv)
- form = Form()
- form.show()
- sys.exit(app.exec_())
- if __name__ == '__main__':
- main(sys.argv)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement