From 3d708d0aa935c6352de84a98592991c8638e7181 Mon Sep 17 00:00:00 2001
From: Hong-Phuc Bui <hong-phuc.bui@htwsaar.de>
Date: Mon, 05 May 2025 08:08:42 +0200
Subject: [PATCH] 4. Vorlesung
---
04-schleife/canvas-bezier/main-canvas.py | 36 ++++++++++++
/dev/null | 10 ---
04-schleife/kleine-ein-mal-eins.py | 0
04-schleife/canvas-bezier/.gitignore | 3 +
04-schleife/canvas-bezier/bezier.py | 43 ++++++++++++++
03-funktion/Inhalt.md | 3 +
04-schleife/README.md | 9 +++
04-schleife/canvas-bezier/main-nicegui.py | 28 +++++++++
8 files changed, 122 insertions(+), 10 deletions(-)
diff --git a/03-funktion/Inhalt.md b/03-funktion/Inhalt.md
index 527ff11..295b1c2 100644
--- a/03-funktion/Inhalt.md
+++ b/03-funktion/Inhalt.md
@@ -2,5 +2,8 @@
# Tupel
+
+
+
# Liste
diff --git a/04-schleife/README.md b/04-schleife/README.md
new file mode 100644
index 0000000..c10646a
--- /dev/null
+++ b/04-schleife/README.md
@@ -0,0 +1,9 @@
+# Schleife in Python
+
+
+
+## While Schleife
+
+## For Schleife
+
+## Anwendungen
diff --git a/04-schleife/canvas-bezier/.gitignore b/04-schleife/canvas-bezier/.gitignore
new file mode 100644
index 0000000..31dc02d
--- /dev/null
+++ b/04-schleife/canvas-bezier/.gitignore
@@ -0,0 +1,3 @@
+.venv/
+.idea/
+__pycache__/
\ No newline at end of file
diff --git a/04-schleife/canvas-bezier/bezier.py b/04-schleife/canvas-bezier/bezier.py
new file mode 100644
index 0000000..b491a1a
--- /dev/null
+++ b/04-schleife/canvas-bezier/bezier.py
@@ -0,0 +1,43 @@
+""""
+Module related to bezier curve
+"""
+def make_cubic_bezier(control_points: [(float, float)], n: int = 10) -> [(float, float)]:
+ """"
+ Interpolate a Bezier-curve by split it into segments of lines (=polyline).
+ A Bezier-Curve is defined by
+
+ \[
+ B(P_0, P_1, P_2, P_3:t) = (1-t)^3*P_0 + 3(1-t)^2*t*P_1 + 3(1-t)*t^2*P_2 + t^3*P_3
+ \]
+
+ for $t \in \[0, 1\]$
+
+ :param control_points
+ :param n number of segments
+ :return a list of points on the Bezier-Curve.
+ """
+
+ p0x = control_points[0][0]
+ p0y = control_points[0][1]
+ p1x = control_points[1][0]
+ p1y = control_points[1][1]
+ p2x = control_points[2][0]
+ p2y = control_points[2][1]
+ p3x = control_points[3][0]
+ p3y = control_points[3][1]
+ points = [(p0x, p0y)]
+ for i in range(1, n):
+ t = i / n
+ u = 1 - t
+ x = p0x * u**3 + 3 * p1x * t* u**2 + 3 * p2x * t**2 * u + p3x * t**3
+ y = p0y * u**3 + 3 * p1y * t* u**2 + 3 * p2y * t**2 * u + p3y * t**3
+ points.append( (x,y) )
+ points.append((p3x, p3y))
+ return points
+
+
+def make_svg_polyline(points) -> str:
+ line = map(lambda p: f"{p[0]},{p[1]}", points)
+ svg = f'<polyline points="{" ".join(line)}" fill="none" stroke="gray" stroke-width="3" />'
+ return svg
+
diff --git a/04-schleife/canvas-bezier/main-canvas.py b/04-schleife/canvas-bezier/main-canvas.py
new file mode 100644
index 0000000..756cfa8
--- /dev/null
+++ b/04-schleife/canvas-bezier/main-canvas.py
@@ -0,0 +1,36 @@
+from tkinter import *
+
+from bezier import make_cubic_bezier
+
+def draw_bezier(canvas, control_points):
+ points = make_cubic_bezier(control_points, n= 400)
+ for i in range(1,len(points)):
+ x1 = points[i-1][0]
+ y1 = points[i-1][1]
+ x2 = points[i][0]
+ y2 = points[i][1]
+ canvas.create_line(x1,y1, x2,y2)
+
+
+def get_point(event):
+ global control_points
+ point = x, y = (event.x, event.y)
+ control_points.append(point)
+ canvas.create_oval(x, y, x+3, y+3)
+ if len(control_points) == 4:
+ draw_bezier(canvas, control_points)
+ control_points = []
+
+
+if __name__ == '__main__':
+
+ control_points = []
+
+ root = Tk()
+
+ canvas = Canvas(root, width=800, height=800)
+ canvas.pack()
+
+ canvas.bind('<Button-1>', get_point)
+
+ root.mainloop()
\ No newline at end of file
diff --git a/04-schleife/canvas-bezier/main-nicegui.py b/04-schleife/canvas-bezier/main-nicegui.py
new file mode 100644
index 0000000..4a055ea
--- /dev/null
+++ b/04-schleife/canvas-bezier/main-nicegui.py
@@ -0,0 +1,28 @@
+from nicegui import ui
+
+from bezier import make_cubic_bezier, make_svg_polyline
+
+control_points = []
+svg = ""
+
+def get_point(event):
+ global control_points
+ global svg
+ x = event.image_x
+ y = event.image_y
+ control_points.append((x,y))
+ svg += f'<circle cx="{x}" cy="{y}" r="1" fill="orange" />'
+ ui.notification(f"(x,y) = ({x},{y})")
+ if len(control_points) == 4:
+ bezier_points = make_cubic_bezier(control_points, n = 50)
+ svg += make_svg_polyline(bezier_points)
+ control_points.clear()
+ event.sender.set_content(svg)
+
+ui.interactive_image(
+ size=(900, 400), cross=True,
+ on_mouse=get_point,
+).classes('w-full bg-blue-50')
+
+ui.run()
+
diff --git a/04-schleife/kleine-ein-mal-eins.py b/04-schleife/kleine-ein-mal-eins.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/04-schleife/kleine-ein-mal-eins.py
diff --git a/canvas-bezier/.idea/canvas-bezier.iml b/canvas-bezier/.idea/canvas-bezier.iml
deleted file mode 100644
index a59dd72..0000000
--- a/canvas-bezier/.idea/canvas-bezier.iml
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="PYTHON_MODULE" version="4">
- <component name="NewModuleRootManager">
- <content url="file://$MODULE_DIR$">
- <excludeFolder url="file://$MODULE_DIR$/.venv" />
- </content>
- <orderEntry type="jdk" jdkName="Python 3.10 (canvas-bezier)" jdkType="Python SDK" />
- <orderEntry type="sourceFolder" forTests="false" />
- </component>
-</module>
\ No newline at end of file
--
Gitblit v1.10.0