From 7513fe88cfca66639a2fedaa8881e97f928eb473 Mon Sep 17 00:00:00 2001 From: lionarius Date: Mon, 22 Apr 2024 05:38:36 +0300 Subject: [PATCH] lab4 qol --- Л4-В6/Программа/src/window.py | 51 ++++++++++++++++++++++++----------- 1 file changed, 36 insertions(+), 15 deletions(-) diff --git a/Л4-В6/Программа/src/window.py b/Л4-В6/Программа/src/window.py index 7d4da79..2b5fe3b 100644 --- a/Л4-В6/Программа/src/window.py +++ b/Л4-В6/Программа/src/window.py @@ -52,7 +52,7 @@ class ParamsField(widgets.InputWidget): val = str(self.value.get(field)) self.fields[field] = widgets.InputField( - self, label_text=f" {field}: ", lineedit_text=val + self, label_text=f"{field:>4}: ", lineedit_text=val ) self.fields[field].set_callback( widgets.make_callback_chain( @@ -123,7 +123,7 @@ class PointsField(widgets.InputWidget): self.points.append( widgets.InputSlider( self, - label_text=f" {i + start}: ", + label_text=f"{i + start:>4}: ", value=value, min_value=0, max_value=self.DIVISIONS, @@ -184,6 +184,11 @@ class PlotWidget(QWidget): self.figure = plt.figure() self.axes = self.figure.add_subplot(111) + + self.figure.tight_layout(pad=3) + self.figure.subplots_adjust(left=0.15, right=0.975, top=0.95) + self.figure.patch.set_facecolor("#f0f0f0") + self.canvas = FigureCanvasQTAgg(self.figure) self._layout.addWidget(self.canvas) @@ -220,10 +225,13 @@ class MainWindow(QMainWindow): x_0_field: widgets.InputField x_n_field: widgets.InputField + + n_display: widgets.DisplayField n_slider: widgets.InputSlider points_field: PointsField + margin_display: widgets.DisplayField margin_slider: widgets.InputSlider function_plot: PlotWidget @@ -265,7 +273,7 @@ class MainWindow(QMainWindow): self.central_widget = QWidget(self) self.setCentralWidget(self.central_widget) - layout = QHBoxLayout(self) + layout = QHBoxLayout(self.central_widget) left_row = QWidget(self.central_widget) left_row_layout = QFormLayout(left_row) @@ -300,7 +308,10 @@ class MainWindow(QMainWindow): ) left_row_layout.addWidget(self.x_n_field) - self.n_slider = widgets.InputSlider(self, "n: ", 1, 1, 20, 1, True) + self.n_display = widgets.DisplayField(self, "n: ", "") + left_row_layout.addWidget(self.n_display) + + self.n_slider = widgets.InputSlider(self, "", 1, 1, 20, 1, True) self.n_slider.set_callback(self._n_slider_changed) left_row_layout.addWidget(self.n_slider) @@ -308,7 +319,10 @@ class MainWindow(QMainWindow): self.points_field.set_callback(self._points_field_changed) left_row_layout.addWidget(self.points_field) - self.margin_slider = widgets.InputSlider(self, "отсутп (%): ", 5, 0, 100, 1) + self.margin_display = widgets.DisplayField(self, "отступ (%): ", "") + left_row_layout.addWidget(self.margin_display) + + self.margin_slider = widgets.InputSlider(self, "", 5, 1, 500, 1) self.margin_slider.set_callback(self._margin_slider_changed) left_row_layout.addWidget(self.margin_slider) @@ -346,14 +360,14 @@ class MainWindow(QMainWindow): axes.grid(True) def function_plot_post_style(self, axes: Axes): - axes.legend() + axes.legend(loc="upper left") def reset(self): self.function_field.set_value(task.f_str()) self.x_0_field.set_value(0.0) self.x_n_field.set_value(1.0) self.n_slider.set_value(5) - self.margin_slider.set_value(5) + self.margin_slider.set_value(300) QtWidgets.QApplication.processEvents() @@ -368,19 +382,25 @@ class MainWindow(QMainWindow): def redraw_plots(self): length = abs(self.x_n - self.x_0) - margin = length * self.margin / 100.0 + x_margin = length / 2 * self.margin + x_min = self.x_0 - x_margin + x_max = self.x_n + x_margin - x_min = self.x_0 - margin - x_max = self.x_n + margin + visible_length = abs(x_max - x_min) + plot_x_margin = visible_length / 2 * 0.025 - x_values = np.linspace(x_min, x_max, 200) + steps = max( + min(int(500 * 1 / visible_length**1.1), 5000), + min(int(750 * visible_length**1.5), 10000), + ) + x_values = np.linspace(x_min, x_max, steps) y_values = self.function(x_values) y_interpolated = self.interpolated_function(x_values) self.function_plot.clear_plots() self.function_plot.add_plot( - lambda axes: axes.set_xlim(x_min - length * 0.05, x_max + length * 0.05) + lambda axes: axes.set_xlim(x_min - plot_x_margin, x_max + plot_x_margin) ) self.function_plot.add_plot( @@ -400,7 +420,6 @@ class MainWindow(QMainWindow): points[1:1] = self.points points = np.array(points) - # points = np.linspace(self.x_0, self.x_n, self.n + 1) self.function_plot.add_plot( lambda axes: axes.scatter( points, self.function(points), color="green", zorder=10 @@ -423,7 +442,7 @@ class MainWindow(QMainWindow): self.error_plot.clear_plots() self.error_plot.add_plot( - lambda axes: axes.set_xlim(x_min - length * 0.05, x_max + length * 0.05) + lambda axes: axes.set_xlim(x_min - plot_x_margin, x_max + plot_x_margin) ) self.error_plot.add_plot( @@ -548,6 +567,7 @@ class MainWindow(QMainWindow): def _n_slider_changed(self, w: widgets.InputWidget) -> bool: self.n = int(w.get_value()) + self.n_display.set_text(str(self.n)) self.recreate_points_field() @@ -561,7 +581,8 @@ class MainWindow(QMainWindow): return True def _margin_slider_changed(self, w: widgets.InputWidget) -> bool: - self.margin = float(w.get_value()) + self.margin = (float(w.get_value()) - 250) / 250.0 + self.margin_display.set_text(f"{self.margin * 100:.2f}%") self.redraw_plots() return True