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