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