Advertisement
outoftime

Computer graphics 2

Mar 3rd, 2013
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.96 KB | None | 0 0
  1. import sys
  2. from ui_mainform import Ui_MainWindow
  3. from PySide.QtCore import *
  4. from PySide.QtGui import *
  5.  
  6. class Point(object):
  7.     def __init__(self, x, y):
  8.         self.x, self.y = x, y
  9.  
  10.     def transform(self, k, height):
  11.         return Point(self.x * k, (height - self.y) * k)
  12.  
  13. class LineFunction(object):
  14.     def __init__(self, pointFrom, pointTo):
  15.         self.pointFrom = pointFrom
  16.         self.pointTo = pointTo
  17.         self.ld = min(abs(pointFrom.x - pointTo.x), abs(pointFrom.y - pointTo.y))
  18.         self.gd = max(abs(pointFrom.x - pointTo.x), abs(pointFrom.y - pointTo.y))
  19.         self.value = self.gd >> 1
  20.         self.d = self.gd - self.ld
  21.         self.step = 0
  22.  
  23.     def calc_next(self):
  24.         if self.value < 0: self.value += self.d
  25.         else: self.value -= self.ld
  26.         self.step += 1
  27.  
  28.     def __str__(self):
  29.         s = ''
  30.         if self.step > 0:
  31.             if self.value < 0: s = 'it\'s less then 0; /'
  32.             else: s = 'it\'s >= 0; -'
  33.         return '<font color=blue>Step {0:00}:</font> f({0:0}) = {1} <font color=red>{2}</font>'\
  34.             .format(self.step, self.value, s)
  35.  
  36. class Form(QMainWindow, Ui_MainWindow):
  37.     def __init__(self):
  38.         super(Form, self).__init__()
  39.         self.setupUi(self)
  40.         self.connect_actions()
  41.  
  42.     def setupUi(self, MainWindow):
  43.         super(Form, self).setupUi(MainWindow)
  44.         self.scene = QGraphicsScene()
  45.         self.graphicsView.setScene(self.scene)
  46.         self.k = 40
  47.  
  48.     def connect_actions(self):
  49.         self.pushButtonDraw.clicked.connect(self.draw)
  50.         self.pushButtonClear.clicked.connect(self.clear)
  51.  
  52.     def draw(self):
  53.         pointFrom = Point(self.spinBoxFromX.value(), self.spinBoxFromY.value())
  54.         pointTo = Point(self.spinBoxToX.value(), self.spinBoxToY.value())
  55.         width = self.spinBoxWidth.value()
  56.         height = self.spinBoxHeight.value()
  57.  
  58.         self.textBrowserTrace.append('<font color=green><b>Point from: ({0}; {1}), point to: ({2}; {3}).</b></font>'\
  59.             .format(pointFrom.x, pointFrom.y, pointTo.x, pointTo.y))
  60.         self.drawGrid(width, height)
  61.         self.drawLine(pointFrom, pointTo, width, height)
  62.         self.drawPoints(pointFrom, pointTo, width, height)
  63.  
  64.         self.tabWidget.setCurrentWidget(self.tab_2)
  65.  
  66.     def drawGrid(self, width, height):
  67.         p = QPen()
  68.         p.setWidth(1)
  69.         p.setBrush(Qt.black)
  70.  
  71.         self.scene.setSceneRect(0, 0, width * self.k, height * self.k)
  72.  
  73.         for i in range(0, width + 1):
  74.             self.scene.addLine(i * self.k, 0, i * self.k, height * self.k, p)
  75.  
  76.         for i in range(0, height + 1):
  77.             self.scene.addLine(0, i * self.k, width * self.k, i * self.k, p)
  78.  
  79.     def drawLine(self, pointFrom, pointTo, width, height):
  80.         p = QPen()
  81.         p.setWidth(3)
  82.         p.setBrush(Qt.black)
  83.         p.setCapStyle(Qt.RoundCap)
  84.  
  85.         f = pointFrom.transform(self.k, height)
  86.         t = pointTo.transform(self.k, height)
  87.         self.scene.addLine(f.x, f.y, t.x, t.y, p)
  88.  
  89.     def drawPoints(self, pointFrom, pointTo, width, height):
  90.         if pointFrom.x >= pointTo.x and pointFrom.y < pointTo.y or \
  91.             pointFrom.x > pointTo.x and pointFrom.y >= pointTo.y:
  92.             tmp, pointFrom = pointFrom, pointTo
  93.             pointTo = tmp
  94.  
  95.         line = LineFunction(pointFrom, pointTo)
  96.         self.textBrowserTrace.append('<b>Lower:</b> {0}; <b>greater:</b> {1}; <b>delta:</b> {2}.'\
  97.             .format(line.ld, line.gd, line.d))
  98.         self.textBrowserTrace.append(str(line))
  99.  
  100.         incx, incy = None, None
  101.         if pointFrom.y <= pointTo.y:
  102.             if abs(pointFrom.x - pointTo.x) > abs(pointFrom.y - pointTo.y):
  103.                 incx = lambda value: 1
  104.                 incy = lambda value: 1 if value < 0 else 0
  105.             else:
  106.                 incx = lambda value: 1 if value < 0 else 0
  107.                 incy = lambda value: 1
  108.         else:
  109.             if abs(pointFrom.x - pointTo.x) > abs(pointFrom.y - pointTo.y):
  110.                 incx = lambda value: 1
  111.                 incy = lambda value: -1 if value < 0 else 0
  112.             else:
  113.                 incx = lambda value: 1 if value < 0 else 0
  114.                 incy = lambda value: -1
  115.  
  116.         self.__drawPoint(pointFrom.transform(self.k, height))
  117.         for i in range(0, line.gd):
  118.             line.calc_next()
  119.             pointFrom.x += incx(line.value)
  120.             pointFrom.y += incy(line.value)
  121.             self.__drawPoint(pointFrom.transform(self.k, height))
  122.             self.textBrowserTrace.append(str(line))
  123.  
  124.     def __drawPoint(self, point):
  125.         p = QPen()
  126.         p.setWidth(5)
  127.         p.setBrush(Qt.red)
  128.         p.setCapStyle(Qt.RoundCap)
  129.  
  130.         print point.x, point.y
  131.         self.scene.addLine(point.x, point.y, point.x + 1, point.y, p)
  132.  
  133.     def clear(self):
  134.         self.scene.clear()
  135.  
  136. def main(argv):
  137.     app = QApplication(argv)
  138.     form = Form()
  139.     form.show()
  140.     sys.exit(app.exec_())
  141.  
  142. if __name__ == '__main__':
  143.     main(sys.argv)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement