{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "#szükséges könyvtárak meghívása\n",
    "from tkinter import *\n",
    "import time\n",
    "import math\n",
    "\n",
    "#bemeneti fájl meghatározása\n",
    "logfilenum = '_meres1_K_jo'\n",
    "\n",
    "#környezeti változók inicializálása\n",
    "XX = 800\n",
    "YY = 800\n",
    "xflexibility = 1\n",
    "yflexibility = 1\n",
    "floordampening = 0.3\n",
    "floorstickyness = 10\n",
    "dampening = 0.7\n",
    "G = 0.001\n",
    "flor = 50\n",
    "\n",
    "#grafikus környezet meghatározása\n",
    "tk = Tk()\n",
    "canvas = Canvas(tk, width=XX, height=YY, bg=\"deepskyblue\")\n",
    "canvas.pack()\n",
    "canvas.create_rectangle(0,YY-flor,XX+1,YY,fill=\"forestgreen\")\n",
    "    \n",
    "#a szimulációs környezet modelljének (másik mellékelt kód) imitálása, a megfelelő belső állapot felírásához, rajzoló függvények meghatározása\n",
    "def dist(j1, j2):\n",
    "\n",
    "    x1 = j1.getx()\n",
    "    x2 = j2.getx()\n",
    "    y1 = j1.gety()\n",
    "    y2 = j2.gety()\n",
    "    return math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1))\n",
    "\n",
    "\n",
    "class Joint:\n",
    "    def __init__(self, x, y, vx, vy, m):\n",
    "        self.x = x\n",
    "        self.y = y\n",
    "        self.vx = vx\n",
    "        self.vy = vy\n",
    "        self.ax = 0\n",
    "        self.ay = 0\n",
    "        self.m = m\n",
    "        self.shape=canvas.create_oval(self.x-self.m, self.y-self.m, self.x+self.m, self.y+self.m, fill=\"cornsilk\")\n",
    "        self.energy = 0\n",
    "        self.prev_x = self.x\n",
    "        self.prev_y = self.y\n",
    "    \n",
    "    def getx(self):\n",
    "        return self.x\n",
    "    \n",
    "    def gety(self):\n",
    "        return self.y\n",
    "    \n",
    "    def repos(self,x, y):\n",
    "        self.x = x\n",
    "        self.y = y\n",
    "        \n",
    "    def addacc(self,ax, ay):\n",
    "        self.ax += ax\n",
    "        self.ay += ay\n",
    "        \n",
    "    def step(self):\n",
    "        self.ay += G*self.m\n",
    "           \n",
    "        if self.y<=5 or self.y>=YY-flor-5:\n",
    "            self.vy = -self.vy*yflexibility \n",
    "            if self.y<=5:\n",
    "                self.y = 5\n",
    "            if self.y>=YY-flor-5:\n",
    "                self.y = YY-flor-5\n",
    "                \n",
    "        if self.y>=YY-flor-5:\n",
    "            self.vy = floordampening*self.vy\n",
    "            if abs(self.vy)<floorstickyness:\n",
    "                self.vx=0\n",
    "                self.vy=0\n",
    "            \n",
    "        \n",
    "        self.x += self.vx\n",
    "        self.y += self.vy\n",
    "        self.vx = self.vx*dampening+self.ax\n",
    "        self.vy = self.vy*dampening+self.ay\n",
    "        \n",
    "        self.energy += abs(self.prev_x-self.x) + abs(self.prev_y-self.y)\n",
    "        self.prev_x=self.x\n",
    "        self.prev_y=self.y\n",
    "        \n",
    "    def draw(self):\n",
    "        canvas.delete(self.shape)\n",
    "        self.shape=canvas.create_oval(self.x-self.m, self.y-self.m, self.x+self.m, self.y+self.m, fill=\"cornsilk\")\n",
    "        \n",
    "        \n",
    "        \n",
    "class Bone:\n",
    "    def __init__(self, j1, j2):\n",
    "        self.j1 = j1\n",
    "        self.j2 = j2\n",
    "        self.l = dist(self.j1, self.j2)\n",
    "        self.shape=canvas.create_line(self.j1.getx(),self.j1.gety(),self.j2.getx(),self.j2.gety(), fill=\"ivory\")\n",
    "        \n",
    "    def repair(self):\n",
    "        d = dist(self.j1, self.j2)\n",
    "        ex = (self.j2.getx()-self.j1.getx())/d;\n",
    "        ey = (self.j2.gety()-self.j1.gety())/d;\n",
    "        px = self.j1.getx()+self.l*ex;\n",
    "        py = self.j1.gety()+self.l*ey;\n",
    "        self.j2.repos(px,py);\n",
    "        \n",
    "    def draw(self):\n",
    "        canvas.delete(self.shape)\n",
    "        self.shape=canvas.create_line(self.j1.getx(),self.j1.gety(),self.j2.getx(),self.j2.gety(), fill=\"ivory\")\n",
    "      \n",
    "    \n",
    "    \n",
    "class Muscle:\n",
    "    def __init__(self, j1, j2, strength):\n",
    "        self.j1 = j1\n",
    "        self.j2 = j2\n",
    "        self.l = dist(j1, j2)\n",
    "        self.strength = strength\n",
    "        self.shape=canvas.create_line(self.j1.getx(),self.j1.gety(),self.j2.getx(),self.j2.gety(), fill=\"indianred\")\n",
    "        \n",
    "    def length_modify(self, l):\n",
    "        self.l = l\n",
    "        \n",
    "    def strength_modify(self, strength):\n",
    "        self.strength = strength\n",
    "        \n",
    "    def movement(self):\n",
    "        d = dist(self.j1, self.j2)\n",
    "        ex1 = (self.j2.getx()-self.j1.getx())/d\n",
    "        ey1 = (self.j2.gety()-self.j1.gety())/d\n",
    "        px1 = (ex1*(d-self.l)/10000*self.strength)\n",
    "        py1 = (ey1*(d-self.l)/10000*self.strength)\n",
    "\n",
    "        self.j1.addacc(px1,py1)\n",
    "\n",
    "        ex2 = (self.j1.getx()-self.j2.getx())/d\n",
    "        ey2 = (self.j1.gety()-self.j2.gety())/d\n",
    "        px2 = (ex2*(d-self.l)/10000*self.strength)\n",
    "        py2 = (ey2*(d-self.l)/10000*self.strength)\n",
    "\n",
    "        self.j2.addacc(px2,py2)\n",
    "        \n",
    "    def draw(self):\n",
    "        canvas.delete(self.shape)\n",
    "        self.shape=canvas.create_line(self.j1.getx(),self.j1.gety(),self.j2.getx(),self.j2.gety(), fill=\"indianred\")\n",
    "        \n",
    "    \n",
    "    \n",
    "class Simulation:\n",
    "    \n",
    "    def __init__(self):\n",
    "        self.joint1 = Joint(150,YY-100,0,0,5)\n",
    "        self.joint2 = Joint(150,YY-200,0,0,5)\n",
    "        self.joint3 = Joint(200,YY-300,0,0,15)\n",
    "        self.joint4 = Joint(250,YY-200,0,0,5)\n",
    "        self.joint5 = Joint(250,YY-100,0,0,5)\n",
    "        \n",
    "        self.bone1 = Bone(self.joint1, self.joint2)\n",
    "        self.bone2 = Bone(self.joint2, self.joint3)\n",
    "        self.bone3 = Bone(self.joint3, self.joint4)\n",
    "        self.bone4 = Bone(self.joint4, self.joint5)\n",
    "        \n",
    "        self.muscle1 = Muscle(self.joint1, self.joint3, 50)\n",
    "        self.muscle2 = Muscle(self.joint2, self.joint4, 30)\n",
    "        self.muscle3 = Muscle(self.joint3, self.joint5, 50)\n",
    "        \n",
    "        self.sum_energy = 0\n",
    "        \n",
    "        self.readlogfile = self.open_log_read(logfilenum)\n",
    "    \n",
    "    #bemeneti fájl meghatározása\n",
    "    def open_log_read(self, num):\n",
    "        fname = \"./logs/log\"\n",
    "        fname += str(num)\n",
    "        fname += \".txt\"\n",
    "        file = open(fname, \"r\")\n",
    "        return file\n",
    "    \n",
    "    #bemeneti fájl olvasásának meghatározása\n",
    "    def read_log(self, file):\n",
    "        line = file.readline().split(\"\\t\")\n",
    "        self.joint1.x = float(line[0])\n",
    "        self.joint1.y = float(line[1])\n",
    "        self.joint2.x = float(line[2])\n",
    "        self.joint2.y = float(line[3])\n",
    "        self.joint3.x = float(line[4])\n",
    "        self.joint3.y = float(line[5])\n",
    "        self.joint4.x = float(line[6])\n",
    "        self.joint4.y = float(line[7])\n",
    "        self.joint5.x = float(line[8])\n",
    "        self.joint5.y = float(line[9])\n",
    "        \n",
    "    #Belső szimulációs környezet alapján a bábu kirajzolása, 20ms-os késleltetéssel iterációs lépésenként\n",
    "    def move_active(self):\n",
    "        \n",
    "        #bemeneti fájl olvasása (minden iterációban egy sor olvasása)\n",
    "        self.read_log(self.readlogfile)\n",
    "\n",
    "        self.bone1.draw()\n",
    "        self.bone2.draw()\n",
    "        self.bone3.draw()\n",
    "        self.bone4.draw()\n",
    "    \n",
    "        self.muscle1.draw()\n",
    "        self.muscle2.draw()\n",
    "        self.muscle3.draw()\n",
    "        \n",
    "        self.joint1.draw()\n",
    "        self.joint2.draw()\n",
    "        self.joint3.draw()\n",
    "        self.joint4.draw()\n",
    "        self.joint5.draw()\n",
    "        \n",
    "        tk.after(20, self.move_active)\n",
    "        \n",
    "#Kirajzolás futtatása, bemeneti fájl bezárása\n",
    "simulation = Simulation()\n",
    "simulation.move_active()\n",
    "tk.mainloop()\n",
    "simulation.readlogfile.close()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
