Compare commits

..

3 Commits

Author SHA1 Message Date
tafit0902
73f4a1d470 komentarze i zmiany Bartka 2024-10-27 17:13:32 +01:00
tafit0902
646da5f1a9 n to stopien krzywej, nie ilosc punktow kontrolnych 2024-10-27 17:00:18 +01:00
d4b3304105 n jako parametr 2024-10-26 23:41:41 +02:00
7 changed files with 25 additions and 76 deletions

3
.idea/.gitignore vendored
View File

@ -1,3 +0,0 @@
# Default ignored files
/shelf/
/workspace.xml

View File

@ -1,6 +0,0 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>

View File

@ -1,4 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.10" project-jdk-type="Python SDK" />
</project>

View File

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/zadanie1Analiza.iml" filepath="$PROJECT_DIR$/.idea/zadanie1Analiza.iml" />
</modules>
</component>
</project>

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

View File

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

58
main.py
View File

@ -1,43 +1,34 @@
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
import numpy as np import numpy as np
import sys
class Plot: class Plot:
def __init__(self): def __init__(self, n):
self.fig, self.ax = plt.subplots() self.fig, self.ax = plt.subplots()
# Obsługa kliknięć myszą # Obsługa kliknięć myszą
self.cid_click = self.fig.canvas.mpl_connect('button_press_event', self.onclick) self.cid_click = self.fig.canvas.mpl_connect('button_press_event', self.onclick)
self.cid_motion = self.fig.canvas.mpl_connect('motion_notify_event', self.on_mouse_move) self.cid_motion = self.fig.canvas.mpl_connect('motion_notify_event', self.on_mouse_move)
self.cid_release = self.fig.canvas.mpl_connect('button_release_event', self.on_release) self.cid_release = self.fig.canvas.mpl_connect('button_release_event', self.on_release)
self.cid_key = self.fig.canvas.mpl_connect('key_press_event', self.on_key_press) # Obsługa klawiatury
# Ustawienia wykresu # Ustawienia wykresu
plt.xlim(0, 800) plt.xlim(0, 800)
plt.ylim(0, 600) plt.ylim(0, 600)
plt.grid() plt.grid()
self.line = [] # Linia rysowana przez użytkownika self.line = [] # linia rysowana przez użytkownika
self.controlPoints = [] # Punkty kontrolne krzywej Béziera self.controlPoints = [] # Punkty kontrolne krzywej Béziera
self.approximation_points = [] # Punkty aproksymacji krzywej self.curvePoints = []
self.isDrawing = False # Flaga rysowania self.isDrawing = False # Flaga rysowania
self.inputMode = 0 # Tryb wejścia: 0 - rysowanie linii, 1 - dodawanie punktów kontrolnych self.inputMode = 0 # Tryb wejścia: 0 - rysowanie linii, 1 - dodawanie punktów kontrolnych
self.n = n
def on_key_press(self, event):
"""Przełączanie trybu rysowania i dodawania punktów kontrolnych przy użyciu klawisza 'm'."""
if event.key == 'm':
self.inputMode = (self.inputMode + 1) % 2
mode = "Rysowanie linii" if self.inputMode == 0 else "Dodawanie punktów kontrolnych"
print(f"Tryb zmieniony na: {mode}")
def onclick(self, event): def onclick(self, event):
# Tryb rysowania linii # Tryb rysowania linii
if self.inputMode == 0: if self.inputMode == 0:
self.isDrawing = True self.isDrawing = True
# Tryb dodawania punktów kontrolnych # Tryb dodawania punktów kontrolnych
elif self.inputMode == 1 and len(self.controlPoints) < 15: elif self.inputMode == 1 and len(self.controlPoints) < self.n:
self.controlPoints.append((event.xdata, event.ydata)) self.controlPoints.append((event.xdata, event.ydata))
# Automatyczna generacja segmentów krzywej Béziera po dodaniu nowych punktów
if len(self.controlPoints) >= 4:
self.generate_bezier_segments()
self.drawPlot() self.drawPlot()
def on_mouse_move(self, event): def on_mouse_move(self, event):
@ -49,35 +40,24 @@ class Plot:
# Zakończ rysowanie linii # Zakończ rysowanie linii
if self.inputMode == 0: if self.inputMode == 0:
self.isDrawing = False self.isDrawing = False
self.inputMode = 1
def generate_bezier_segments(self):
"""Tworzy segmenty krzywej Béziera na podstawie punktów kontrolnych."""
self.approximation_points = []
# Dzielenie punktów kontrolnych na segmenty długości 4 (dla krzywej Béziera stopnia 3)
for i in range(0, len(self.controlPoints) - 3, 3):
segment = self.controlPoints[i:i + 4]
t_values = np.linspace(0, 1, num=100)
bezier_points = np.array([self.de_casteljau(segment, t) for t in t_values])
self.approximation_points.append(bezier_points)
def drawPlot(self): def drawPlot(self):
self.ax.clear() self.ax.clear()
# Rysowanie linii narysowanej przez użytkownika # Rysowanie linii narysowanej przez użytkownika
if len(self.line) > 1: if len(self.line) > 1:
self.ax.plot(*zip(*self.line), color='red', label='Linia narysowana') self.ax.plot(*zip(*self.line), color='red', label='linia')
# Rysowanie punktów kontrolnych # Rysowanie punktów kontrolnych
if len(self.controlPoints) > 0: if len(self.controlPoints) > 0:
self.ax.scatter(*zip(*self.controlPoints), color='black', label='Punkty kontrolne') self.ax.scatter(*zip(*self.controlPoints), color='black', label='Punkty kontrolne')
# Rysowanie segmentów krzywej Béziera (dodanie etykiety tylko raz) # Rysowanie krzywej Béziera
first_segment = True if len(self.controlPoints) >= self.n:
for segment in self.approximation_points: t_values = np.linspace(0, 1, num=100)
if first_segment: bezier_points = np.array([self.de_casteljau(t) for t in t_values])
self.ax.plot(segment[:, 0], segment[:, 1], color='blue', label='Krzywa Béziera') self.ax.plot(bezier_points[:, 0], bezier_points[:, 1], color='blue', label='Krzywa Béziera')
first_segment = False
else:
self.ax.plot(segment[:, 0], segment[:, 1], color='blue')
self.ax.legend() self.ax.legend()
self.ax.set_xlim(0, 800) self.ax.set_xlim(0, 800)
@ -85,9 +65,9 @@ class Plot:
self.ax.grid() self.ax.grid()
plt.draw() plt.draw()
def de_casteljau(self, points, t): def de_casteljau(self, t):
"""Oblicza punkt na krzywej Béziera za pomocą algorytmu de Casteljau dla danego t.""" """Oblicza punkt na krzywej Béziera za pomocą algorytmu de Casteljau dla danego t."""
points = np.array(points) points = np.array(self.controlPoints)
n = len(points) n = len(points)
for r in range(1, n): for r in range(1, n):
for i in range(n - r): for i in range(n - r):
@ -97,6 +77,10 @@ class Plot:
def run(self): def run(self):
plt.show() plt.show()
n = 10
if len(sys.argv) > 1:
n = int(sys.argv[1])
if __name__ == "__main__": if __name__ == "__main__":
plot = Plot() plot = Plot(n + 1)
plot.run() plot.run()