Advertisement
Guest User

Untitled

a guest
Jan 28th, 2020
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.20 KB | None | 0 0
  1. from OpenGL.GL import *
  2. from OpenGL.GLU import *
  3. from OpenGL.GLUT import *
  4. import time
  5. import math
  6. import numpy as np
  7. from math import sin, cos
  8.  
  9. ## zmienne pomocnicze
  10. pointSize = 10
  11. windowSize = 100
  12. pixelMap = [[0.0 for y in range(windowSize)] for x in range(windowSize)]
  13. tick = 0.0
  14.  
  15.  
  16. ## funkcja rysująca zawartość macierzy pixelMap
  17. def paint():
  18.     glClear(GL_COLOR_BUFFER_BIT)
  19.     glBegin(GL_POINTS)
  20.     glColor3f(1.0, 0.0, 0.0)
  21.     for i in range(windowSize):
  22.         for j in range(windowSize):
  23.             glColor3f(pixelMap[i][j], 1.0, 1.0)
  24.             glVertex2f(0.5 + 1.0 * i, 0.5 + 1.0 * j)
  25.     glEnd()
  26.     glFlush()
  27.  
  28. ## inicjalizacja okna
  29. glutInit()
  30. glutInitWindowSize(windowSize*pointSize, windowSize*pointSize)
  31. glutInitWindowPosition(0, 0)
  32. glutCreateWindow(b"Newlist01")
  33. glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB)
  34.  
  35. ## inicjalizacja wyświetlania
  36. glMatrixMode(GL_PROJECTION)
  37. glLoadIdentity()
  38. gluOrtho2D(0.0, windowSize, 0.0, windowSize)
  39. glMatrixMode(GL_MODELVIEW)
  40. glLoadIdentity()
  41. glutDisplayFunc(paint)
  42. glutIdleFunc(paint)
  43. glClearColor(1.0, 1.0, 1.0, 1.0)
  44. glEnable(GL_PROGRAM_POINT_SIZE)
  45. glPointSize(pointSize)
  46.  
  47.  
  48. def clearMap():
  49.     global pixelMap
  50.     pixelMap = [[0.0 for y in range(windowSize)] for x in range(windowSize)]
  51.  
  52.  
  53. def cupdate(step=0.1):
  54.     global tick
  55.     ltime = time.clock()
  56.     if ltime < tick + step:
  57.         return False
  58.     tick = ltime
  59.     return True
  60.  
  61.  
  62. def odcinek(x1, y1, x2, y2):
  63.     global pixelMap
  64.     try:
  65.         d = (y2 - y1) / (x2 - x1)  # współczynnik kierunkowy
  66.     except ZeroDivisionError:
  67.         d = 0
  68.     if -1 < d < 1:
  69.         if x1 > x2:  # rysujemy od lewej do prawej
  70.             xtmp = x1; x1 = x2; x2 = xtmp
  71.             ytmp = y1; y1 = y2; y2 = ytmp
  72.         y = y1  # początkowa wartość y
  73.         for x in range(round(x1), round(x2)+1):  # przechodzimy przez piksele od x1 do x2
  74.             y = y + d
  75.             dcx = x
  76.             dcy = round(y)
  77.             if 0 <= dcx < windowSize:
  78.                 if 0 <= dcy < windowSize:
  79.                     pixelMap[dcx][dcy] = 1.0
  80.     else:
  81.         try:
  82.             d = (x2 - x1) / (y2 - y1)
  83.         except ZeroDivisionError:
  84.             d = 0
  85.         if y1 > y2:  # rysujemy od lewej do prawej
  86.             xtmp = x1; x1 = x2; x2 = xtmp
  87.             ytmp = y1; y1 = y2; y2 = ytmp
  88.         x = x1
  89.         for y in range(round(y1), round(y2)):
  90.             x += d
  91.             dcx = round(x)
  92.             dcy = round(y)
  93.             if 0 <= dcx < windowSize and 0 <= dcy < windowSize:
  94.                 pixelMap[dcx][dcy] = 1.0
  95.  
  96.  
  97. def prostokat(x, dx, dy, a):
  98.     # Translacja
  99.     x[0] += dx; x[2] += dx; x[4] += dx; x[6] += dx
  100.     x[1] += dy; x[3] += dy; x[5] += dy; x[7] += dy
  101.  
  102.     # Ze stopni na radiany
  103.     a = math.radians(a)
  104.  
  105.     # Wyznaczenie środka prostokąta wokół którego będzie następować obrót
  106.     middlePoint = [(x[0] + x[2] + x[4] + x[6])/4, (x[1] + x[3] + x[5] + x[7])/4]
  107.  
  108.     p1 = obrotPunktu((x[0], x[1]), middlePoint, a)
  109.     p2 = obrotPunktu((x[2], x[3]), middlePoint, a)
  110.     p3 = obrotPunktu((x[4], x[5]), middlePoint, a)
  111.     p4 = obrotPunktu((x[6], x[7]), middlePoint, a)
  112.  
  113.     # Rysowanie odcinków łączących punkty
  114.     odcinek(*p1, *p2)
  115.     odcinek(*p2, *p3)
  116.     odcinek(*p3, *p4)
  117.     odcinek(*p4, *p1)
  118.  
  119.  
  120.  
  121. def obrotPunktu(punkt, punktCentralny, a):
  122.     nowyPunkt = [
  123.         (punkt[0] - punktCentralny[0]) * math.cos(a) - (punkt[1] - punktCentralny[1]) * math.sin(a) + punktCentralny[0],
  124.         (punkt[0] - punktCentralny[0]) * math.sin(a) + (punkt[1] - punktCentralny[1]) * math.cos(a) + punktCentralny[1]
  125.     ]
  126.     return nowyPunkt
  127.  
  128.  
  129. def punkt(x, y, col):
  130.     global pixelMap
  131.     if 0 <= x <= windowSize:
  132.         if 0 <= y <= windowSize:
  133.             pixelMap[x][y] = col
  134.  
  135.  
  136. def ff(x, u):
  137.     # równanie stanu
  138.     r = 5
  139.     T = np.array([
  140.         [math.cos(x[2]), 0],
  141.         [math.sin(x[2]), 0],
  142.         [0, 1]
  143.     ])
  144.     w = np.array([
  145.         1 / 2 * (u[0] + u[1]),
  146.         1 / r * (u[1] - u[0])
  147.     ])
  148.     return np.dot(T, w)
  149.  
  150.  
  151. def gg(x, u):
  152.     # wyjście obiektu
  153.     return np.array([x[0] * 10, x[1] * 10]).transpose()
  154.  
  155.  
  156. def uu(t):
  157.     # wejście obiektu
  158.     return np.array([t])
  159.  
  160.  
  161. def rk4(f, u, x, dt):
  162.     # Runge-Kutta 4
  163.     k1 = dt * f(x, u)
  164.     k2 = dt * f(x + (k1/2)/2, u)
  165.     k3 = dt * f(x + (k2/2)/2, u)
  166.     k4 = dt * f(x + k3, u)
  167.     return x + dt * 1/6 * (k1 + 2*k2 + 3*k3 + k4)
  168.  
  169.  
  170. def rysujRobota(x):
  171.     robotSize = 10
  172.     robotRadius = robotSize/2
  173.     corners = []
  174.     corners.append(int(x[0] + robotRadius))
  175.     corners.append(int(x[1] + robotRadius))
  176.     corners.append(int(x[0] + robotRadius))
  177.     corners.append(int(x[1] - robotRadius))
  178.     corners.append(int(x[0] - robotRadius))
  179.     corners.append(int(x[1] - robotRadius))
  180.     corners.append(int(x[0] - robotRadius))
  181.     corners.append(int(x[1] + robotRadius))
  182.     prostokat(corners, 10, 10, x[2])
  183.  
  184.  
  185. # u = uu(tick)
  186. u = [75, 75, 0]
  187. x = np.array([windowSize/2, windowSize/2, 279]).transpose() #3 parametr, kąt obrotu
  188. y = gg(x, u)
  189.  
  190.  
  191. while True:
  192.     if cupdate() and tick < 100:
  193.         clearMap()
  194.         x = rk4(ff, u, x, 0.05)
  195.         print(x)
  196.         y = gg(x, u)
  197.         rysujRobota(x)
  198.     paint()
  199.     glutMainLoopEvent()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement