Advertisement
Guest User

Untitled

a guest
Jan 28th, 2020
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 10.30 KB | None | 0 0
  1. from OpenGL.GL import *
  2. from OpenGL.GLU import *
  3. from OpenGL.GLUT import *
  4. import numpy as np
  5. import time
  6. import math
  7.  
  8. # zmienne pomocnicze
  9. pointSize = 10
  10. windowSize = 100
  11. pixelMap = [[0.0 for y in range(windowSize)] for x in range(windowSize)]
  12. tick = 0.0
  13.  
  14.  
  15. # funkcja rysująca zawartość macierzy pixelMap
  16. def paint():
  17.     glClear(GL_COLOR_BUFFER_BIT)
  18.     glBegin(GL_POINTS)
  19.     glColor3f(1.0, 0.0, 0.0)
  20.     for i in range(windowSize):
  21.         for j in range(windowSize):
  22.             glColor3f(pixelMap[i][j], 1.0, 1.0)
  23.             glVertex2f(0.5 + 1.0 * i, 0.5 + 1.0 * j)
  24.     glEnd()
  25.     glFlush()
  26.  
  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 cupdate(step=0.1):
  49.     global tick
  50.     ltime = time.clock()
  51.     if ltime < tick + step:
  52.         return False
  53.     tick = ltime
  54.     return True
  55.  
  56.  
  57. def odcinek(x1, y1, x2, y2):
  58.     global pixelMap
  59.     try:
  60.         d = (y2 - y1) / (x2 - x1)  # współczynnik kierunkowy
  61.     except ZeroDivisionError:
  62.         d = 0
  63.  
  64.     if -1 < d < 1:
  65.         if x1 > x2:  # rysujemy od lewej do prawej
  66.             xtmp = x1; x1 = x2; x2 = xtmp
  67.             ytmp = y1; y1 = y2; y2 = ytmp
  68.         y = y1  # początkowa wartość y
  69.         for x in range(round(x1), round(x2)+1):  # przechodzimy przez piksele od x1 do x2
  70.             y = y + d
  71.             dcx = x
  72.             dcy = round(y)
  73.             if 0 <= dcx < windowSize:
  74.                 if 0 <= dcy < windowSize:
  75.                     pixelMap[dcx][dcy] = 1.0
  76.     else:
  77.         try:
  78.             d = (x2 - x1) / (y2 - y1)
  79.         except ZeroDivisionError:
  80.             d = 0
  81.         if y1 > y2:  # rysujemy od lewej do prawej
  82.             xtmp = x1; x1 = x2; x2 = xtmp
  83.             ytmp = y1; y1 = y2; y2 = ytmp
  84.         x = x1
  85.         for y in range(round(y1), round(y2)):
  86.             x += d
  87.             dcx = round(x)
  88.             dcy = round(y)
  89.             if 0 <= dcx < windowSize and 0 <= dcy < windowSize:
  90.                 pixelMap[dcx][dcy] = 1.0
  91.  
  92.  
  93. def prostokat(x, dx, dy, a):
  94.     # Translacja
  95.     x[0] += dx; x[2] += dx; x[4] += dx; x[6] += dx
  96.     x[1] += dy; x[3] += dy; x[5] += dy; x[7] += dy
  97.  
  98.     # Ze stopni na radiany
  99.     a = math.radians(a)
  100.  
  101.     # Wyznaczenie środka prostokąta wokół którego będzie następować obrót
  102.     middlePoint = [(x[0] + x[2] + x[4] + x[6])/4, (x[1] + x[3] + x[5] + x[7])/4]
  103.  
  104.     x[0] = (x[0] - middlePoint[0]) * math.cos(a) - (x[1] - middlePoint[1]) * math.sin(a) + middlePoint[0]
  105.     x[2] = (x[2] - middlePoint[0]) * math.cos(a) - (x[3] - middlePoint[1]) * math.sin(a) + middlePoint[0]
  106.     x[4] = (x[4] - middlePoint[0]) * math.cos(a) - (x[5] - middlePoint[1]) * math.sin(a) + middlePoint[0]
  107.     x[6] = (x[6] - middlePoint[0]) * math.cos(a) - (x[7] - middlePoint[1]) * math.sin(a) + middlePoint[0]
  108.  
  109.     x[1] = (x[0] - middlePoint[0]) * math.sin(a) + (x[1] - middlePoint[1]) * math.cos(a) + middlePoint[1]
  110.     x[3] = (x[2] - middlePoint[0]) * math.sin(a) + (x[3] - middlePoint[1]) * math.cos(a) + middlePoint[1]
  111.     x[5] = (x[4] - middlePoint[0]) * math.sin(a) + (x[5] - middlePoint[1]) * math.cos(a) + middlePoint[1]
  112.     x[7] = (x[6] - middlePoint[0]) * math.sin(a) + (x[7] - middlePoint[1]) * math.cos(a) + middlePoint[1]
  113.  
  114.     # Rysowanie odcinków łączących punkty
  115.     odcinek(x[0], x[1], x[2], x[3])
  116.     odcinek(x[2], x[3], x[4], x[5])
  117.     odcinek(x[4], x[5], x[6], x[7])
  118.     odcinek(x[6], x[7], x[0], x[1])
  119.  
  120.  
  121. def punkt(x, y, col):
  122.     global pixelMap
  123.     if 0 <= x <= windowSize:
  124.         if 0 <= y <= windowSize:
  125.             pixelMap[x][y] = col
  126.  
  127.  
  128. def ff(x, u):  # równanie stanu
  129.     # return np.array([math.cos(u[0]), math.sin(u[0])]).transpose()
  130.     r = 2
  131.     T = np.array([
  132.         [math.cos(x[2]), 0],
  133.         [math.sin(x[2]), 0],
  134.         [0, 1]
  135.     ])
  136.     w = np.array([
  137.         1 / 2 * (u[0] + u[1]),
  138.         1 / r * (u[1] - u[0])
  139.     ])
  140.     return np.dot(T, w)
  141.  
  142.  
  143. def gg(x, u):  # wyjście obiektu
  144.     return np.array([x[0] * 10, x[1] * 10]).transpose()
  145.  
  146.  
  147. def uu(t):  # wejście obiektu
  148.     return np.array([t])
  149.  
  150.  
  151. def rk4(f, u, x, dt):
  152.     # Runge-Kutta 4
  153.     k1 = dt * f(x, u)
  154.     k2 = dt * f(x + dt/2, u + k1/2)
  155.     k3 = dt * f(x + dt/2, u + k2/2)
  156.     k4 = dt * f(x + dt, u + k3)
  157.     return x + dt * 1/6 * (k1 + 2*k2 + 3*k3 + k4)
  158.  
  159.  
  160. u = [2, 5, 0]
  161. x = np.array([0, 0, 0]).transpose()
  162. y = gg(x, uu(tick))
  163.  
  164. while True:
  165.     if cupdate() and tick < 100:
  166.         punkt(int(windowSize / 2 + round(y[0])), int(windowSize / 2 + round(y[1])), 0.0)
  167.         x = rk4(ff, u, x, 0.1)
  168.         print(x)
  169.         y = gg(x, uu(tick))
  170.         punkt(int(windowSize / 2 + round(y[0])), int(windowSize / 2 + round(y[1])), 1.0)
  171.     paint()
  172.     glutMainLoopEvent()
  173.  
  174.  
  175.  
  176. # zad 2
  177.  
  178.  
  179.  
  180. from OpenGL.GL import *
  181. from OpenGL.GLU import *
  182. from OpenGL.GLUT import *
  183. import time
  184. import math
  185. import numpy as np
  186. from math import sin, cos
  187.  
  188. ## zmienne pomocnicze
  189. pointSize = 10
  190. windowSize = 100
  191. pixelMap = [[0.0 for y in range(windowSize)] for x in range(windowSize)]
  192. tick = 0.0
  193.  
  194.  
  195. ## funkcja rysująca zawartość macierzy pixelMap
  196. def paint():
  197.     glClear(GL_COLOR_BUFFER_BIT)
  198.     glBegin(GL_POINTS)
  199.     glColor3f(1.0, 0.0, 0.0)
  200.     for i in range(windowSize):
  201.         for j in range(windowSize):
  202.             glColor3f(pixelMap[i][j], 1.0, 1.0)
  203.             glVertex2f(0.5 + 1.0 * i, 0.5 + 1.0 * j)
  204.     glEnd()
  205.     glFlush()
  206.  
  207. ## inicjalizacja okna
  208. glutInit()
  209. glutInitWindowSize(windowSize*pointSize, windowSize*pointSize)
  210. glutInitWindowPosition(0, 0)
  211. glutCreateWindow(b"Newlist01")
  212. glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB)
  213.  
  214. ## inicjalizacja wyświetlania
  215. glMatrixMode(GL_PROJECTION)
  216. glLoadIdentity()
  217. gluOrtho2D(0.0, windowSize, 0.0, windowSize)
  218. glMatrixMode(GL_MODELVIEW)
  219. glLoadIdentity()
  220. glutDisplayFunc(paint)
  221. glutIdleFunc(paint)
  222. glClearColor(1.0, 1.0, 1.0, 1.0)
  223. glEnable(GL_PROGRAM_POINT_SIZE)
  224. glPointSize(pointSize)
  225.  
  226.  
  227. def clearMap():
  228.     global pixelMap
  229.     pixelMap = [[0.0 for y in range(windowSize)] for x in range(windowSize)]
  230.  
  231.  
  232. def cupdate(step=0.1):
  233.     global tick
  234.     ltime = time.clock()
  235.     if ltime < tick + step:
  236.         return False
  237.     tick = ltime
  238.     return True
  239.  
  240.  
  241. def odcinek(x1, y1, x2, y2):
  242.     global pixelMap
  243.     try:
  244.         d = (y2 - y1) / (x2 - x1)  # współczynnik kierunkowy
  245.     except ZeroDivisionError:
  246.         d = 0
  247.     if -1 < d < 1:
  248.         if x1 > x2:  # rysujemy od lewej do prawej
  249.             xtmp = x1; x1 = x2; x2 = xtmp
  250.             ytmp = y1; y1 = y2; y2 = ytmp
  251.         y = y1  # początkowa wartość y
  252.         for x in range(round(x1), round(x2)+1):  # przechodzimy przez piksele od x1 do x2
  253.             y = y + d
  254.             dcx = x
  255.             dcy = round(y)
  256.             if 0 <= dcx < windowSize:
  257.                 if 0 <= dcy < windowSize:
  258.                     pixelMap[dcx][dcy] = 1.0
  259.     else:
  260.         try:
  261.             d = (x2 - x1) / (y2 - y1)
  262.         except ZeroDivisionError:
  263.             d = 0
  264.         if y1 > y2:  # rysujemy od lewej do prawej
  265.             xtmp = x1; x1 = x2; x2 = xtmp
  266.             ytmp = y1; y1 = y2; y2 = ytmp
  267.         x = x1
  268.         for y in range(round(y1), round(y2)):
  269.             x += d
  270.             dcx = round(x)
  271.             dcy = round(y)
  272.             if 0 <= dcx < windowSize and 0 <= dcy < windowSize:
  273.                 pixelMap[dcx][dcy] = 1.0
  274.  
  275.  
  276. def prostokat(x, dx, dy, a):
  277.     # Translacja
  278.     x[0] += dx; x[2] += dx; x[4] += dx; x[6] += dx
  279.     x[1] += dy; x[3] += dy; x[5] += dy; x[7] += dy
  280.  
  281.     # Ze stopni na radiany
  282.     a = math.radians(a)
  283.  
  284.     # Wyznaczenie środka prostokąta wokół którego będzie następować obrót
  285.     middlePoint = [(x[0] + x[2] + x[4] + x[6])/4, (x[1] + x[3] + x[5] + x[7])/4]
  286.  
  287.     p1 = obrotPunktu((x[0], x[1]), middlePoint, a)
  288.     p2 = obrotPunktu((x[2], x[3]), middlePoint, a)
  289.     p3 = obrotPunktu((x[4], x[5]), middlePoint, a)
  290.     p4 = obrotPunktu((x[6], x[7]), middlePoint, a)
  291.  
  292.     # Rysowanie odcinków łączących punkty
  293.     odcinek(*p1, *p2)
  294.     odcinek(*p2, *p3)
  295.     odcinek(*p3, *p4)
  296.     odcinek(*p4, *p1)
  297.  
  298.  
  299.  
  300. def obrotPunktu(punkt, punktCentralny, a):
  301.     nowyPunkt = [
  302.         (punkt[0] - punktCentralny[0]) * math.cos(a) - (punkt[1] - punktCentralny[1]) * math.sin(a) + punktCentralny[0],
  303.         (punkt[0] - punktCentralny[0]) * math.sin(a) + (punkt[1] - punktCentralny[1]) * math.cos(a) + punktCentralny[1]
  304.     ]
  305.     return nowyPunkt
  306.  
  307.  
  308. def punkt(x, y, col):
  309.     global pixelMap
  310.     if 0 <= x <= windowSize:
  311.         if 0 <= y <= windowSize:
  312.             pixelMap[x][y] = col
  313.  
  314.  
  315. def ff(x, u):
  316.     # równanie stanu
  317.     r = 5
  318.     T = np.array([
  319.         [math.cos(x[2]), 0],
  320.         [math.sin(x[2]), 0],
  321.         [0, 1]
  322.     ])
  323.     w = np.array([
  324.         1 / 2 * (u[0] + u[1]),
  325.         1 / r * (u[1] - u[0])
  326.     ])
  327.     return np.dot(T, w)
  328.  
  329.  
  330. def gg(x, u):
  331.     # wyjście obiektu
  332.     return np.array([x[0] * 10, x[1] * 10]).transpose()
  333.  
  334.  
  335. def uu(t):
  336.     # wejście obiektu
  337.     return np.array([t])
  338.  
  339.  
  340. def rk4(f, u, x, dt):
  341.     # Runge-Kutta 4
  342.     k1 = dt * f(x, u)
  343.     k2 = dt * f(x + (k1/2)/2, u)
  344.     k3 = dt * f(x + (k2/2)/2, u)
  345.     k4 = dt * f(x + k3, u)
  346.     return x + dt * 1/6 * (k1 + 2*k2 + 3*k3 + k4)
  347.  
  348.  
  349. def rysujRobota(x):
  350.     robotSize = 10
  351.     robotRadius = robotSize/2
  352.     corners = []
  353.     corners.append(int(x[0] + robotRadius))
  354.     corners.append(int(x[1] + robotRadius))
  355.     corners.append(int(x[0] + robotRadius))
  356.     corners.append(int(x[1] - robotRadius))
  357.     corners.append(int(x[0] - robotRadius))
  358.     corners.append(int(x[1] - robotRadius))
  359.     corners.append(int(x[0] - robotRadius))
  360.     corners.append(int(x[1] + robotRadius))
  361.     prostokat(corners, 10, 10, x[2])
  362.  
  363.  
  364. # u = uu(tick)
  365. u = [75, 75, 0]
  366. x = np.array([windowSize/2, windowSize/2, 279]).transpose() #3 parametr, kąt obrotu
  367. y = gg(x, u)
  368.  
  369.  
  370. while True:
  371.     if cupdate() and tick < 100:
  372.         clearMap()
  373.         x = rk4(ff, u, x, 0.05)
  374.         print(x)
  375.         y = gg(x, u)
  376.         rysujRobota(x)
  377.     paint()
  378.     glutMainLoopEvent()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement