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-SNAPSHOT