python/michelson.py
changeset 0 16509f98f301
equal deleted inserted replaced
-1:000000000000 0:16509f98f301
       
     1 #!/usr/bin/python3
       
     2 # -*- coding: utf-8 -*-
       
     3 
       
     4 import sys, math
       
     5 from PyQt5.QtWidgets import QWidget, QApplication, QSlider, QVBoxLayout, QPushButton
       
     6 from PyQt5.QtGui import QPainter, QPen, QStaticText
       
     7 from PyQt5.QtCore import Qt
       
     8 
       
     9 pos = (300, 300)
       
    10 size = 300
       
    11 margin = 10
       
    12 
       
    13 class Michelson(QWidget):
       
    14 		
       
    15 	def __init__(self):
       
    16 		super().__init__()
       
    17 		
       
    18 		self.setGeometry(pos[0], pos[1], size + 20 * 40 + 0, size)
       
    19 		self.setWindowTitle('Michelson')
       
    20 		
       
    21 		self.s = []
       
    22 		for i in range(0, 20):
       
    23 			self.s.append(SliderK(self, i))
       
    24 			self.s[i].setGeometry(size + i*40, margin, 40, size - 2*margin)
       
    25 		
       
    26 		self.show()
       
    27 		
       
    28 	def paintEvent(self, e):
       
    29 		qp = QPainter()
       
    30 		qp.begin(self)
       
    31 		self.drawGraph(qp)
       
    32 		qp.end()
       
    33 		
       
    34 	def drawGraph(self, qp):
       
    35 		vmax, v = self.values()
       
    36 		y0 = (size - 2*margin) / 2 + margin
       
    37 		yk = (y0 - margin) / vmax if vmax > 0 else 0
       
    38 		qp.setPen(QPen(Qt.black, 1, Qt.SolidLine))
       
    39 		qp.drawLine(0, y0, size, y0)
       
    40 		qp.setPen(QPen(Qt.green, 2, Qt.SolidLine))
       
    41 		for i in range(0, len(v) - 1):
       
    42 			qp.drawLine(margin + i, y0 - yk * v[i], margin + i + 1, y0 - yk * v[i+1])
       
    43 		
       
    44 	def values(self):
       
    45 		vmax = 0
       
    46 		v = []
       
    47 		x = 0
       
    48 		dx = 2 * math.pi / (size - 2 * margin)
       
    49 		while x <= 2 * math.pi:
       
    50 			y = 0
       
    51 			for i in range(0, 20):
       
    52 				y = y + self.s[i].v * math.sin((i + 1) * x)
       
    53 # 			y = math.sqrt(math.pi * math.pi - (x-math.pi) * (x-math.pi))
       
    54 			if math.fabs(y) > vmax: vmax = math.fabs(y)
       
    55 			v.append(y)
       
    56 			x = x + dx
       
    57 		return (vmax, v)
       
    58 	
       
    59 	
       
    60 class SliderK(QWidget):
       
    61 		
       
    62 	def __init__(self, w, i):
       
    63 		super().__init__(w)
       
    64 		
       
    65 		self.w = w
       
    66 		self.i = i
       
    67 		self.init = 0
       
    68 		self.v = 0
       
    69 		
       
    70 		label = QPushButton(str(i+1))
       
    71 		
       
    72 		self.val = QPushButton(str(self.init))
       
    73 		self.val.clicked.connect(self.resetK)
       
    74 		
       
    75 		self.sld = QSlider(Qt.Vertical, self.w)
       
    76 		self.sld.setFocusPolicy(Qt.NoFocus)
       
    77 		self.sld.setMaximum(20)
       
    78 		self.sld.setMinimum(-20)		
       
    79 		self.sld.setValue(self.init)
       
    80 		self.sld.valueChanged[int].connect(self.changeK)
       
    81 		
       
    82 		vbox = QVBoxLayout()
       
    83 		
       
    84 		vbox.addWidget(label)
       
    85 		vbox.addWidget(self.val)
       
    86 		vbox.addWidget(self.sld)
       
    87 		
       
    88 		self.setLayout(vbox)
       
    89 	
       
    90 	def changeK(self, v):
       
    91 # 		print("changeK({})={}".format(self.i, v))
       
    92 		self.v = v
       
    93 		self.val.setText(str(v))
       
    94 		self.w.update()
       
    95 		
       
    96 	def resetK(self):
       
    97 		self.sld.setValue(self.init)
       
    98 	
       
    99 			
       
   100 if __name__ == '__main__':	
       
   101 	app = QApplication(sys.argv)
       
   102 	widget = Michelson()
       
   103 	sys.exit(app.exec_())