1
0
This commit is contained in:
2024-04-22 05:38:36 +03:00
parent b4d255e19b
commit 7513fe88cf

View File

@@ -52,7 +52,7 @@ class ParamsField(widgets.InputWidget):
val = str(self.value.get(field)) val = str(self.value.get(field))
self.fields[field] = widgets.InputField( 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( self.fields[field].set_callback(
widgets.make_callback_chain( widgets.make_callback_chain(
@@ -123,7 +123,7 @@ class PointsField(widgets.InputWidget):
self.points.append( self.points.append(
widgets.InputSlider( widgets.InputSlider(
self, self,
label_text=f" {i + start}: ", label_text=f"{i + start:>4}: ",
value=value, value=value,
min_value=0, min_value=0,
max_value=self.DIVISIONS, max_value=self.DIVISIONS,
@@ -184,6 +184,11 @@ class PlotWidget(QWidget):
self.figure = plt.figure() self.figure = plt.figure()
self.axes = self.figure.add_subplot(111) 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.canvas = FigureCanvasQTAgg(self.figure)
self._layout.addWidget(self.canvas) self._layout.addWidget(self.canvas)
@@ -220,10 +225,13 @@ class MainWindow(QMainWindow):
x_0_field: widgets.InputField x_0_field: widgets.InputField
x_n_field: widgets.InputField x_n_field: widgets.InputField
n_display: widgets.DisplayField
n_slider: widgets.InputSlider n_slider: widgets.InputSlider
points_field: PointsField points_field: PointsField
margin_display: widgets.DisplayField
margin_slider: widgets.InputSlider margin_slider: widgets.InputSlider
function_plot: PlotWidget function_plot: PlotWidget
@@ -265,7 +273,7 @@ class MainWindow(QMainWindow):
self.central_widget = QWidget(self) self.central_widget = QWidget(self)
self.setCentralWidget(self.central_widget) self.setCentralWidget(self.central_widget)
layout = QHBoxLayout(self) layout = QHBoxLayout(self.central_widget)
left_row = QWidget(self.central_widget) left_row = QWidget(self.central_widget)
left_row_layout = QFormLayout(left_row) left_row_layout = QFormLayout(left_row)
@@ -300,7 +308,10 @@ class MainWindow(QMainWindow):
) )
left_row_layout.addWidget(self.x_n_field) 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) self.n_slider.set_callback(self._n_slider_changed)
left_row_layout.addWidget(self.n_slider) left_row_layout.addWidget(self.n_slider)
@@ -308,7 +319,10 @@ class MainWindow(QMainWindow):
self.points_field.set_callback(self._points_field_changed) self.points_field.set_callback(self._points_field_changed)
left_row_layout.addWidget(self.points_field) 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) self.margin_slider.set_callback(self._margin_slider_changed)
left_row_layout.addWidget(self.margin_slider) left_row_layout.addWidget(self.margin_slider)
@@ -346,14 +360,14 @@ class MainWindow(QMainWindow):
axes.grid(True) axes.grid(True)
def function_plot_post_style(self, axes: Axes): def function_plot_post_style(self, axes: Axes):
axes.legend() axes.legend(loc="upper left")
def reset(self): def reset(self):
self.function_field.set_value(task.f_str()) self.function_field.set_value(task.f_str())
self.x_0_field.set_value(0.0) self.x_0_field.set_value(0.0)
self.x_n_field.set_value(1.0) self.x_n_field.set_value(1.0)
self.n_slider.set_value(5) self.n_slider.set_value(5)
self.margin_slider.set_value(5) self.margin_slider.set_value(300)
QtWidgets.QApplication.processEvents() QtWidgets.QApplication.processEvents()
@@ -368,19 +382,25 @@ class MainWindow(QMainWindow):
def redraw_plots(self): def redraw_plots(self):
length = abs(self.x_n - self.x_0) 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 visible_length = abs(x_max - x_min)
x_max = self.x_n + margin 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_values = self.function(x_values)
y_interpolated = self.interpolated_function(x_values) y_interpolated = self.interpolated_function(x_values)
self.function_plot.clear_plots() self.function_plot.clear_plots()
self.function_plot.add_plot( 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( self.function_plot.add_plot(
@@ -400,7 +420,6 @@ class MainWindow(QMainWindow):
points[1:1] = self.points points[1:1] = self.points
points = np.array(points) points = np.array(points)
# points = np.linspace(self.x_0, self.x_n, self.n + 1)
self.function_plot.add_plot( self.function_plot.add_plot(
lambda axes: axes.scatter( lambda axes: axes.scatter(
points, self.function(points), color="green", zorder=10 points, self.function(points), color="green", zorder=10
@@ -423,7 +442,7 @@ class MainWindow(QMainWindow):
self.error_plot.clear_plots() self.error_plot.clear_plots()
self.error_plot.add_plot( 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( self.error_plot.add_plot(
@@ -548,6 +567,7 @@ class MainWindow(QMainWindow):
def _n_slider_changed(self, w: widgets.InputWidget) -> bool: def _n_slider_changed(self, w: widgets.InputWidget) -> bool:
self.n = int(w.get_value()) self.n = int(w.get_value())
self.n_display.set_text(str(self.n))
self.recreate_points_field() self.recreate_points_field()
@@ -561,7 +581,8 @@ class MainWindow(QMainWindow):
return True return True
def _margin_slider_changed(self, w: widgets.InputWidget) -> bool: 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() self.redraw_plots()
return True return True