diff -r 000000000000 -r 16509f98f301 python/michelson.py --- /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_())