Маятник с открытым резюме - PullRequest
0 голосов
/ 21 апреля 2020
 # importing
import cv2
import numpy as np
import math

# defining
length1 = 100
length2 = 100

mass1 = 10
mass2 = 10

angle1 = math.pi / 2
angle2 = math.pi / 4

angularv1 = 0
angularv2 = 0

g = 1

preview = []


def mainframe(angle1, angle2, angularv1, angularv2):
    windowmain = np.ones([600,600,3], dtype=np.uint8)*255

    x1 = int(length1 * math.sin(angle1))
    y1 = int(length1 * math.cos(angle1))

    x2 = int(x1 + length2 * math.sin(angle2))
    y2 = int(y1 + length2 * math.cos(angle2))

    preview.append((x2, y2))

    # all the visualization stuff below

    cv2.line(windowmain, (300, 250), (300 + x1, 250 + y1), (0, 0, 0), 2)
    cv2.ellipse(windowmain, (300 + x1, 250 + y1), (mass1, mass1), 0, 0, 360, 0, -1)

    cv2.line(windowmain, (300 + x1, 250 + y1), (300 + x2, 250 + y2), (0, 0, 0), 2)
    cv2.ellipse(windowmain, (300 + x2, 250 + y2), (mass2, mass2), 0, 0, 360, 0. - 1)

    if len(preview) > 1:
        for i in range(1, len(preview)):
            cv2.line(windowmain, (300 + preview[i - 1][0], 250 + preview[i - 1][1]),
                     (300 + preview[i][0], 250 + preview[i][1]), (0, 0, 0), 2)

    cv2.imshow("Pendulum", windowmain)


while True:

    num1 = -g * (2 * mass1 + mass2) * math.sin(angle1)
    num2 = -mass2 * g * math.sin(angle1 - 2 * angle2)
    num3 = -2 * math.sin(angle1 - angle2) * mass2
    num4 = angularv2 * angularv2 * length2 + angularv1 * angularv1 * length1 * math.cos(angle1 - angle2)
    value1 = length1 * (2 * mass1 + mass2 - mass2 * math.cos(2 * angle1 - 2 * angle2))
    a_1 = (num1 + num2 + num3 + num4) / value1

    num1 = 2 * math.sin(angle1 - angle2)
    num2 = (angularv1 * angularv1 * length1 * (mass1 + mass2))
    num3 = g * (mass1 + mass2) * math.cos(angle1)
    num4 = angularv2 * angularv2 * length2 * mass2 * math.cos(angle1 - angle2)
    value1 = length1 * (2 * mass1 + mass2 - mass2 * math.cos(2 * angle1 - 2 * angle2))
    a_2 = (num1 * (num2 + num3 + num4)) / value1

    angularv1 += a_1
    angularv2 += a_2

    angle1 += angularv1
    angle2 += angularv2

    mainframe(angle1, angle2, angularv1, angularv2)

    key = cv2.waitKey(1)
    if key == 27:
        break

cv2.destroyAllWindows()

Вот код моего маятника, который я сделал с помощью open cv, но он выглядит неправильно, любая помощь будет оценена. Мне нужна помощь в следующем: а) очищать экран каждые кадры; б) заставлять следы исчезать через некоторое время c) делать его реалистичным. Ниже приведена ссылка на видео, показывающее его работу https://cdn.discordapp.com/attachments/267624335836053506/702070161947099206/20200421_111406.mp4

...