lab4 qol
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user