python/michelson.py
changeset 0 16509f98f301
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/python/michelson.py	Fri Nov 22 09:40:16 2019 +0100
@@ -0,0 +1,103 @@
+#!/usr/bin/python3
+# -*- coding: utf-8 -*-
+
+import sys, math
+from PyQt5.QtWidgets import QWidget, QApplication, QSlider, QVBoxLayout, QPushButton
+from PyQt5.QtGui import QPainter, QPen, QStaticText
+from PyQt5.QtCore import Qt
+
+pos = (300, 300)
+size = 300
+margin = 10
+
+class Michelson(QWidget):
+		
+	def __init__(self):
+		super().__init__()
+		
+		self.setGeometry(pos[0], pos[1], size + 20 * 40 + 0, size)
+		self.setWindowTitle('Michelson')
+		
+		self.s = []
+		for i in range(0, 20):
+			self.s.append(SliderK(self, i))
+			self.s[i].setGeometry(size + i*40, margin, 40, size - 2*margin)
+		
+		self.show()
+		
+	def paintEvent(self, e):
+		qp = QPainter()
+		qp.begin(self)
+		self.drawGraph(qp)
+		qp.end()
+		
+	def drawGraph(self, qp):
+		vmax, v = self.values()
+		y0 = (size - 2*margin) / 2 + margin
+		yk = (y0 - margin) / vmax if vmax > 0 else 0
+		qp.setPen(QPen(Qt.black, 1, Qt.SolidLine))
+		qp.drawLine(0, y0, size, y0)
+		qp.setPen(QPen(Qt.green, 2, Qt.SolidLine))
+		for i in range(0, len(v) - 1):
+			qp.drawLine(margin + i, y0 - yk * v[i], margin + i + 1, y0 - yk * v[i+1])
+		
+	def values(self):
+		vmax = 0
+		v = []
+		x = 0
+		dx = 2 * math.pi / (size - 2 * margin)
+		while x <= 2 * math.pi:
+			y = 0
+			for i in range(0, 20):
+				y = y + self.s[i].v * math.sin((i + 1) * x)
+# 			y = math.sqrt(math.pi * math.pi - (x-math.pi) * (x-math.pi))
+			if math.fabs(y) > vmax: vmax = math.fabs(y)
+			v.append(y)
+			x = x + dx
+		return (vmax, v)
+	
+	
+class SliderK(QWidget):
+		
+	def __init__(self, w, i):
+		super().__init__(w)
+		
+		self.w = w
+		self.i = i
+		self.init = 0
+		self.v = 0
+		
+		label = QPushButton(str(i+1))
+		
+		self.val = QPushButton(str(self.init))
+		self.val.clicked.connect(self.resetK)
+		
+		self.sld = QSlider(Qt.Vertical, self.w)
+		self.sld.setFocusPolicy(Qt.NoFocus)
+		self.sld.setMaximum(20)
+		self.sld.setMinimum(-20)		
+		self.sld.setValue(self.init)
+		self.sld.valueChanged[int].connect(self.changeK)
+		
+		vbox = QVBoxLayout()
+		
+		vbox.addWidget(label)
+		vbox.addWidget(self.val)
+		vbox.addWidget(self.sld)
+		
+		self.setLayout(vbox)
+	
+	def changeK(self, v):
+# 		print("changeK({})={}".format(self.i, v))
+		self.v = v
+		self.val.setText(str(v))
+		self.w.update()
+		
+	def resetK(self):
+		self.sld.setValue(self.init)
+	
+			
+if __name__ == '__main__':	
+	app = QApplication(sys.argv)
+	widget = Michelson()
+	sys.exit(app.exec_())