Python :: Aufgabe #232

3 Lösungen Lösungen öffentlich

Muster im Polarkoordinatensystem

Anfänger - Python von Exception - 10.11.2019 um 09:24 Uhr
Hallo zusammen,

heute sollt ihr ein kleines Zeichenprogramm schreiben.

1. Polarkoordinatensystem

Zuerst geht es darum ein Polarkoordinatensystem (auch als Kreiskoordinatensystem bekannt) zu zeichnen.
Der Ursprung des Koordinatensystems befindet sich im Zentrum der Zeichenfläche.

- Die X-Achse verläuft horizontal durch den Ursprung, die Y-Achse vertikal.
- Jede Längeneinheit soll von einem Kreis geschnitten werden, also jeweils bei X(n) und Y(n). Der Kreismittelpunkt befindet sich dementsprechend im Ursprung des Koordinatensystems.
- Des Weiteren soll alle 22,5° eine Linie vom Ursprung aus gezogen werden (dies sind insg. 16 Linien, damit sind auch die X- als auch die Y-Achse abgedeckt!).

Wenn ihr das geschafft habt, sollte das ca. so aussehen Beispiel Polarkoordinatensystem (Hier allerdings mit 30°-Schritten anstatt mit 22,5°)
Auf die Gradangaben kann verzichtet werden.
Zudem solltet ihr dezente Farben für das Koordinatensystem wählen.

2. Muster

Für das Muster sollt ihr nun Punkte in diesem Koordinatensystem einzeichnen.
Diese ergeben das Muster je nach Punktanzahl und Zoom.

Ein jeder dieser Punkte hat folgende Eigenschaften:
- Die X-Koordinate ist die Entfernung vom Koordinatenursprung (= der Radius)
- Die Y-Koordinate ist das Bogenmaß.

Jeder Punkt soll die gleiche Zahl für X und Y eingesetzt bekommen.
D.h. Punkt p: pX(n) und pY(n)
Hier ergibt sich jedoch eine Schwierigkeit für Y.
Der Wert der Y-Koordinate n ist das Bogenmaß und muss dementsprechend noch in eine Gradzahl konvertiert werden.
Ein Beispiel:
X = 3
Y = 3 (bzw. ~172°)

Ihr sollt das nun Punkte für 0 < n <= 100 auf diesem Koordinatensystem einzeichnen.

Im Anhang befinden sich noch drei Abbildungen, die das ganze Vorhaben verdeutlichen sollen.
Es heißt ja immer ein Bild sagt mehr als tausend Worte...

Viel Spaß
euer Exception :)

Lösungen:

vote_ok
von AlexGroeg (2010 Punkte) - 14.11.2019 um 20:00 Uhr
Quellcode ausblenden Python-Code
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import tkinter as tk
from math import pi, cos, sin, radians, degrees
 
x = 800; y = 600   # Fenstergröße
    
# create window, set canvas to window
window = tk.Tk()
window.resizable(False, False)
window.title(' ')
c = tk.Canvas(window, width=x, height=y, bg='gray15', highlightthickness=0)
c.pack()

AB = 10            # Abstand
n = 20             # Anzahl Kreise
length = AB * n    # Abstand * Anzahl Kreise
T = 16             # Teilung
a = 360 / T        # Winkel  22.5

# Kreise zeichnen:
s = 0
for i in range(0, n):  # Anzahl Kreise
    s += AB
    c.create_oval(x/2 -s, y/2 -s, x/2 +s, y/2 +s)

# Polarlinien zeichnen:
angle  = 0
x1 = x/2
y1 = y/2
for i in range(0, T):
    x2 = x1 +  length * cos(angle * pi/180)
    y2 = y1 +  length * sin(angle * pi/180)
    c.create_line(x1, y1, x2, y2, fill='black')
    angle += a  

# Achsen zeichnen:
c.create_line(0, y/2, x, y/2, fill='black')
c.create_line(x/2, 0, x/2, y, fill='black')

# Muster zeichnen:
r = 3   # Radius Punkt
m = AB  # Abstand vom Centrum
angle = 0
color = ['yellow','orange','red','purple','blue', 'green', 'white']
u = 0   # Startwert Farbe

for i in range(0, 80):
    px = x1 +  m * cos(radians(angle))  #px = x1 +  m * cos(angle * pi/180)  
    py = y1 -  m * sin(radians(angle))  #py = y1 -  m * sin(angle * pi/180)   
    c.create_oval(px -r, py -r, px +r, py +r, fill=color[u])
    m += AB
    if m > length:
        m = AB
        u += 1  # Farbe wechseln
        if u > 6:
            u = 0
    angle += a



# keep window open until user closes it
tk.mainloop() 

vote_ok
von ZRX88 (2770 Punkte) - 19.12.2019 um 09:29 Uhr
Quellcode ausblenden Python-Code

'''
Created on 19.12.2019

@author: robert
'''
import math
import matplotlib.pyplot as plt


def calc_coordinates(x):
    return [x*math.cos(x), x*math.sin(x)]


x,y = [],[]
for i in range(101):
    x.append(calc_coordinates(i)[0])
    y.append(calc_coordinates(i)[1])


plt.plot(x,y, 'r.')

plt.show()
vote_ok
von Klaus (1960 Punkte) - 25.02.2020 um 12:46 Uhr
Zur Darstellung des Koordinatensystems habe ich PySimpleGUI genutzt. Basierend auf tkinter ist PySimpleGUI aus meiner Sicht eine einfache und pragmatische Lösung, um schnell eine grafische Benutzeroberfläche mit wenig Code zu kreieren. Besonderheit bei PySimpleGUI ist unter anderem, dass man beim Graph-Element den (0/0)-Ursprung frei definieren kann.

Installation über
pip install pysimplegui
oder
conda install pysimplegui.

Alles weitere unter https://pysimplegui.readthedocs.io/en/latest/

Quellcode ausblenden Python-Code
import PySimpleGUI as sg
from math import pi, sin, cos, radians

ZOOM_FACTOR = 4
COLOR_COORDINATES = '#e8e8e8'

def return_coordinates(angle, length):
    angle_rad = pi/2 - radians(angle)
    x_value = (cos(angle_rad)*length)
    y_value = (sin(angle_rad)*length)
    return x_value, y_value

def return_angle_degree(length):
    return (length * 180 / pi) % 360

layout = [[sg.Graph(canvas_size=(220 * ZOOM_FACTOR, 220 * ZOOM_FACTOR),
                    graph_bottom_left=(-110 * ZOOM_FACTOR, -110 * ZOOM_FACTOR),
                    graph_top_right=(110 * ZOOM_FACTOR, 110 * ZOOM_FACTOR),
                    background_color='white', key='_graph_')]]

window = sg.Window('Polarkoordinatensystem', layout, finalize=True, background_color='white')

graph = window['_graph_']

for index in range (0, 101, 10):
    graph.draw_circle((0,0), index * ZOOM_FACTOR, line_color = COLOR_COORDINATES, line_width=1)
    graph.draw_point((0,0), size=2 * ZOOM_FACTOR, color= COLOR_COORDINATES)

for index in range (0, 16):
    x, y = return_coordinates(index * 22.5, 100)
    graph.draw_line((0,0), (x * ZOOM_FACTOR, y * ZOOM_FACTOR), color=COLOR_COORDINATES)

for index in range(0, 101):
    x, y = return_coordinates(return_angle_degree(index), index)
    graph.draw_point((x * ZOOM_FACTOR, y * ZOOM_FACTOR), color = 'red', size = 1 * ZOOM_FACTOR)


while True:
    event, values = window.read()
    if event is None:
        break

window.close()
2101620

Du scheinst einen AdBlocker zu nutzen. Ich würde mich freuen, wenn du ihn auf dieser Seite deaktivierst und dich davon überzeugst, dass die Werbung hier nicht störend ist.