Punktkoordinaten zum Zeichnen berechnen

Alles, was nicht direkt mit Python-Problemen zu tun hat. Dies ist auch der perfekte Platz für Jobangebote.
Antworten
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Atalanttore: Ich weiss ist hier allgemein gestellt, ohne Bezug zu irgend einem Rahmenwerk, aber falls es etwas mit Qt zu tun hat, könnte man da auch Klassen von Qt zur Hilfe nehmen:

Code: Alles auswählen

#!/usr/bin/env python3
from PyQt5.QtCore import QLineF


def main():
    line = QLineF(1920, 504, 371, 1080)
    line.setLength(100)
    print(line.p2())


if __name__ == '__main__':
    main()
Und in der Standardbibliothek gäbe es mit `turtle.Vec2D` eine fertige Vektor-Klasse mit der sich die Formel von Sirius 1:1 in Code übersetzen liesse:

Code: Alles auswählen

In [508]: a = turtle.Vec2D(1920, 504); b = turtle.Vec2D(371, 1080)

In [509]: a + (b-a) * (100/abs(b-a))
Out[509]: (1826.27,538.85)
Mit `QtGui.QVector2D` funtkioniert es fast genau so, nur das die nicht mit der `abs()`-Funktion verwendet werden können, aber eine `length()`-Methode haben. Aaaaber damit geht es noch ein bisschen einfacher, weil es eine `normalized()`-Methode gibt:

Code: Alles auswählen

In [518]: a = QVector2D(1920, 504); b = QVector2D(371, 1080)

In [519]: a + (b-a).normalized() * 100
Out[519]: PyQt5.QtGui.QVector2D(1826.2705078125, 538.8535766601562)
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

@__blackjack__: Danke für den Beispielcode. Der bringt mich gut weiter.
Qt wird in dem Code, für den diese Berechnung gedacht ist, bereits an anderen Stellen verwendet. Außerdem ist natürlich alles willkommen, was dabei hilft, mathematische Berechnungen nicht selbst machen zu müssen. :P

Gruß
Atalanttore
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

Ich habe ein kleines Beispielprogramm gebastelt, wo durch zwei zufällig auf einem Rechteck (= Größe eines HD-Monitors) liegende Punkte eine Route erstellt wird. Der Start- und Endpunkt einer Linie, mit einer zufällig festgelegten Länge, soll so nach und nach über die Route durch des Rechteck wandern. Momentan hakt es mindestens noch an der Berechnung der passenden Start- und Endpunkte der Linie. Mathematisch komme ich da nicht mehr weiter. Wie macht man so etwas?

Code: Alles auswählen

#!/usr/bin/python3

from random import randint, choice
from time import monotonic, sleep
from PyQt5.QtGui import QVector2D

WIDTH = 1920
HEIGHT = 1080
SIDES = ["left", "right", "top", "bottom"]
start = monotonic()
line_length = randint(100, 500)


def calculate_random_point(exclude=None):

    remaining = [x for x in SIDES if x is not exclude]

    side = choice(remaining)

    if side == "left":
        x = 0
        y = randint(0, HEIGHT)
    elif side == "right":
        x = WIDTH
        y = randint(0, HEIGHT)
    elif side == "bottom":
        x = randint(0, WIDTH)
        y = HEIGHT
    elif side == "top":
        x = randint(0, WIDTH)
        y = 0
    return x, y, side


def main():

    start_point_x, start_point_y, position = calculate_random_point()
    end_point_x, end_point_y, _ = calculate_random_point(position)

    start_point = QVector2D(start_point_x, start_point_y)
    end_point = QVector2D(end_point_x, end_point_y)

    while True:

        elapsed = monotonic() - start

        line_start_point = start_point + (end_point - start_point).normalized() * elapsed
        line_end_point = start_point + (end_point - start_point).normalized() * line_length * elapsed


        print(f"Startpunkt ({start_point_x} / {start_point_y}), Endpunkt ({end_point_x} / {end_point_y}), Linienlänge: {line_length}"
              f"\nAnfang Linie ({line_start_point.x()} / {line_start_point.y()}),"
              f"\nEnde Linie ({line_end_point.x()} / {line_end_point.y()})"
              "\n================================================================")
        sleep(0.5)


if __name__ == '__main__':
    main()
Gruß
Atalanttore
Antworten