--- /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_())