Skip to content

Instantly share code, notes, and snippets.

@mirrornerror
Last active March 28, 2021 06:11
Show Gist options
  • Save mirrornerror/f3fb2eacd5618bac4696cbd47e755df0 to your computer and use it in GitHub Desktop.
Save mirrornerror/f3fb2eacd5618bac4696cbd47e755df0 to your computer and use it in GitHub Desktop.
IK_Backward_Shift.ipynb
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"metadata": {},
"cell_type": "markdown",
"source": "## Inverse Kinematics: Backward Shift"
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-03-28T06:04:12.943341Z",
"end_time": "2021-03-28T06:04:13.645864Z"
},
"execution": {
"iopub.execute_input": "2021-03-09T19:28:06.847Z",
"iopub.status.busy": "2021-03-09T19:28:06.829Z",
"iopub.status.idle": "2021-03-09T19:28:06.867Z",
"shell.execute_reply": "2021-03-09T19:28:07.034Z"
},
"trusted": true
},
"cell_type": "code",
"source": "%matplotlib notebook\nimport numpy as np\nimport matplotlib.pyplot as plt",
"execution_count": 2,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-03-28T06:04:13.648783Z",
"end_time": "2021-03-28T06:04:13.694047Z"
},
"execution": {
"iopub.execute_input": "2021-03-09T19:28:06.922Z",
"iopub.status.busy": "2021-03-09T19:28:06.898Z",
"iopub.status.idle": "2021-03-09T19:28:06.936Z",
"shell.execute_reply": "2021-03-09T19:28:07.040Z"
},
"trusted": true
},
"cell_type": "code",
"source": "class Arm:\n def __init__(self, _ax, _ay, _length, _angle):\n self.ax = _ax\n self.ay = _ay\n self.length = _length\n self.angle = _angle\n self.bx = self.ax + self.length * np.cos(self.angle)\n self.by = self.ay + self.length * np.sin(self.angle)\n\n def backward(self, tx, ty):\n theta = np.arctan2(ty - self.ay, tx - self.ax)\n self.ax = tx - self.length * np.cos(theta)\n self.ay = ty - self.length * np.sin(theta)\n self.bx = tx\n self.by = ty\n \n def shift(self, dx, dy):\n self.ax += dx\n self.ay += dy\n self.bx += dx\n self.by += dy",
"execution_count": 3,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-03-28T06:04:13.698488Z",
"end_time": "2021-03-28T06:04:13.797698Z"
},
"trusted": true
},
"cell_type": "code",
"source": "# Forward Kinematics\n\nN = 3 # the number of link\nOX = 0 # offset x: Base coordinates\nOY = 0 # offset y: Base coordinates\n\nbws = []\nfor i in range(N):\n linkLength = 1 - i * 0.1\n initTheta = np.pi / 2 # initial angle\n if i == 0:\n bws.append(Arm(OX, OY, linkLength, initTheta))\n else:\n bws.append(Arm(bws[i-1].bx, bws[i-1].by, linkLength, initTheta))\n \nbwsX = []\nbwsY = []\nfor i in range(N):\n bwsX.append([bws[i].ax, bws[i].bx])\n bwsY.append([bws[i].ay, bws[i].by])\n \nfig = plt.figure(figsize=(5,5))\nax = fig.add_subplot(111)\nax.axis([-1,N,-1,N])\nax.grid()\nax.plot(bwsX, bwsY, color='tab:blue')\nax.scatter(bwsX, bwsY)",
"execution_count": 4,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": "<IPython.core.display.Javascript object>",
"application/javascript": "/* Put everything inside the global mpl namespace */\n/* global mpl */\nwindow.mpl = {};\n\nmpl.get_websocket_type = function () {\n if (typeof WebSocket !== 'undefined') {\n return WebSocket;\n } else if (typeof MozWebSocket !== 'undefined') {\n return MozWebSocket;\n } else {\n alert(\n 'Your browser does not have WebSocket support. ' +\n 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n 'Firefox 4 and 5 are also supported but you ' +\n 'have to enable WebSockets in about:config.'\n );\n }\n};\n\nmpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n this.id = figure_id;\n\n this.ws = websocket;\n\n this.supports_binary = this.ws.binaryType !== undefined;\n\n if (!this.supports_binary) {\n var warnings = document.getElementById('mpl-warnings');\n if (warnings) {\n warnings.style.display = 'block';\n warnings.textContent =\n 'This browser does not support binary websocket messages. ' +\n 'Performance may be slow.';\n }\n }\n\n this.imageObj = new Image();\n\n this.context = undefined;\n this.message = undefined;\n this.canvas = undefined;\n this.rubberband_canvas = undefined;\n this.rubberband_context = undefined;\n this.format_dropdown = undefined;\n\n this.image_mode = 'full';\n\n this.root = document.createElement('div');\n this.root.setAttribute('style', 'display: inline-block');\n this._root_extra_style(this.root);\n\n parent_element.appendChild(this.root);\n\n this._init_header(this);\n this._init_canvas(this);\n this._init_toolbar(this);\n\n var fig = this;\n\n this.waiting = false;\n\n this.ws.onopen = function () {\n fig.send_message('supports_binary', { value: fig.supports_binary });\n fig.send_message('send_image_mode', {});\n if (fig.ratio !== 1) {\n fig.send_message('set_dpi_ratio', { dpi_ratio: fig.ratio });\n }\n fig.send_message('refresh', {});\n };\n\n this.imageObj.onload = function () {\n if (fig.image_mode === 'full') {\n // Full images could contain transparency (where diff images\n // almost always do), so we need to clear the canvas so that\n // there is no ghosting.\n fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n }\n fig.context.drawImage(fig.imageObj, 0, 0);\n };\n\n this.imageObj.onunload = function () {\n fig.ws.close();\n };\n\n this.ws.onmessage = this._make_on_message_function(this);\n\n this.ondownload = ondownload;\n};\n\nmpl.figure.prototype._init_header = function () {\n var titlebar = document.createElement('div');\n titlebar.classList =\n 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n var titletext = document.createElement('div');\n titletext.classList = 'ui-dialog-title';\n titletext.setAttribute(\n 'style',\n 'width: 100%; text-align: center; padding: 3px;'\n );\n titlebar.appendChild(titletext);\n this.root.appendChild(titlebar);\n this.header = titletext;\n};\n\nmpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._init_canvas = function () {\n var fig = this;\n\n var canvas_div = (this.canvas_div = document.createElement('div'));\n canvas_div.setAttribute(\n 'style',\n 'border: 1px solid #ddd;' +\n 'box-sizing: content-box;' +\n 'clear: both;' +\n 'min-height: 1px;' +\n 'min-width: 1px;' +\n 'outline: 0;' +\n 'overflow: hidden;' +\n 'position: relative;' +\n 'resize: both;'\n );\n\n function on_keyboard_event_closure(name) {\n return function (event) {\n return fig.key_event(event, name);\n };\n }\n\n canvas_div.addEventListener(\n 'keydown',\n on_keyboard_event_closure('key_press')\n );\n canvas_div.addEventListener(\n 'keyup',\n on_keyboard_event_closure('key_release')\n );\n\n this._canvas_extra_style(canvas_div);\n this.root.appendChild(canvas_div);\n\n var canvas = (this.canvas = document.createElement('canvas'));\n canvas.classList.add('mpl-canvas');\n canvas.setAttribute('style', 'box-sizing: content-box;');\n\n this.context = canvas.getContext('2d');\n\n var backingStore =\n this.context.backingStorePixelRatio ||\n this.context.webkitBackingStorePixelRatio ||\n this.context.mozBackingStorePixelRatio ||\n this.context.msBackingStorePixelRatio ||\n this.context.oBackingStorePixelRatio ||\n this.context.backingStorePixelRatio ||\n 1;\n\n this.ratio = (window.devicePixelRatio || 1) / backingStore;\n if (this.ratio !== 1) {\n fig.send_message('set_dpi_ratio', { dpi_ratio: this.ratio });\n }\n\n var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n 'canvas'\n ));\n rubberband_canvas.setAttribute(\n 'style',\n 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n );\n\n var resizeObserver = new ResizeObserver(function (entries) {\n var nentries = entries.length;\n for (var i = 0; i < nentries; i++) {\n var entry = entries[i];\n var width, height;\n if (entry.contentBoxSize) {\n if (entry.contentBoxSize instanceof Array) {\n // Chrome 84 implements new version of spec.\n width = entry.contentBoxSize[0].inlineSize;\n height = entry.contentBoxSize[0].blockSize;\n } else {\n // Firefox implements old version of spec.\n width = entry.contentBoxSize.inlineSize;\n height = entry.contentBoxSize.blockSize;\n }\n } else {\n // Chrome <84 implements even older version of spec.\n width = entry.contentRect.width;\n height = entry.contentRect.height;\n }\n\n // Keep the size of the canvas and rubber band canvas in sync with\n // the canvas container.\n if (entry.devicePixelContentBoxSize) {\n // Chrome 84 implements new version of spec.\n canvas.setAttribute(\n 'width',\n entry.devicePixelContentBoxSize[0].inlineSize\n );\n canvas.setAttribute(\n 'height',\n entry.devicePixelContentBoxSize[0].blockSize\n );\n } else {\n canvas.setAttribute('width', width * fig.ratio);\n canvas.setAttribute('height', height * fig.ratio);\n }\n canvas.setAttribute(\n 'style',\n 'width: ' + width + 'px; height: ' + height + 'px;'\n );\n\n rubberband_canvas.setAttribute('width', width);\n rubberband_canvas.setAttribute('height', height);\n\n // And update the size in Python. We ignore the initial 0/0 size\n // that occurs as the element is placed into the DOM, which should\n // otherwise not happen due to the minimum size styling.\n if (width != 0 && height != 0) {\n fig.request_resize(width, height);\n }\n }\n });\n resizeObserver.observe(canvas_div);\n\n function on_mouse_event_closure(name) {\n return function (event) {\n return fig.mouse_event(event, name);\n };\n }\n\n rubberband_canvas.addEventListener(\n 'mousedown',\n on_mouse_event_closure('button_press')\n );\n rubberband_canvas.addEventListener(\n 'mouseup',\n on_mouse_event_closure('button_release')\n );\n // Throttle sequential mouse events to 1 every 20ms.\n rubberband_canvas.addEventListener(\n 'mousemove',\n on_mouse_event_closure('motion_notify')\n );\n\n rubberband_canvas.addEventListener(\n 'mouseenter',\n on_mouse_event_closure('figure_enter')\n );\n rubberband_canvas.addEventListener(\n 'mouseleave',\n on_mouse_event_closure('figure_leave')\n );\n\n canvas_div.addEventListener('wheel', function (event) {\n if (event.deltaY < 0) {\n event.step = 1;\n } else {\n event.step = -1;\n }\n on_mouse_event_closure('scroll')(event);\n });\n\n canvas_div.appendChild(canvas);\n canvas_div.appendChild(rubberband_canvas);\n\n this.rubberband_context = rubberband_canvas.getContext('2d');\n this.rubberband_context.strokeStyle = '#000000';\n\n this._resize_canvas = function (width, height, forward) {\n if (forward) {\n canvas_div.style.width = width + 'px';\n canvas_div.style.height = height + 'px';\n }\n };\n\n // Disable right mouse context menu.\n this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n event.preventDefault();\n return false;\n });\n\n function set_focus() {\n canvas.focus();\n canvas_div.focus();\n }\n\n window.setTimeout(set_focus, 100);\n};\n\nmpl.figure.prototype._init_toolbar = function () {\n var fig = this;\n\n var toolbar = document.createElement('div');\n toolbar.classList = 'mpl-toolbar';\n this.root.appendChild(toolbar);\n\n function on_click_closure(name) {\n return function (_event) {\n return fig.toolbar_button_onclick(name);\n };\n }\n\n function on_mouseover_closure(tooltip) {\n return function (event) {\n if (!event.currentTarget.disabled) {\n return fig.toolbar_button_onmouseover(tooltip);\n }\n };\n }\n\n fig.buttons = {};\n var buttonGroup = document.createElement('div');\n buttonGroup.classList = 'mpl-button-group';\n for (var toolbar_ind in mpl.toolbar_items) {\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) {\n /* Instead of a spacer, we start a new button group. */\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n buttonGroup = document.createElement('div');\n buttonGroup.classList = 'mpl-button-group';\n continue;\n }\n\n var button = (fig.buttons[name] = document.createElement('button'));\n button.classList = 'mpl-widget';\n button.setAttribute('role', 'button');\n button.setAttribute('aria-disabled', 'false');\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n\n var icon_img = document.createElement('img');\n icon_img.src = '_images/' + image + '.png';\n icon_img.srcset = '_images/' + image + '_large.png 2x';\n icon_img.alt = tooltip;\n button.appendChild(icon_img);\n\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n var fmt_picker = document.createElement('select');\n fmt_picker.classList = 'mpl-widget';\n toolbar.appendChild(fmt_picker);\n this.format_dropdown = fmt_picker;\n\n for (var ind in mpl.extensions) {\n var fmt = mpl.extensions[ind];\n var option = document.createElement('option');\n option.selected = fmt === mpl.default_extension;\n option.innerHTML = fmt;\n fmt_picker.appendChild(option);\n }\n\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n};\n\nmpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n // which will in turn request a refresh of the image.\n this.send_message('resize', { width: x_pixels, height: y_pixels });\n};\n\nmpl.figure.prototype.send_message = function (type, properties) {\n properties['type'] = type;\n properties['figure_id'] = this.id;\n this.ws.send(JSON.stringify(properties));\n};\n\nmpl.figure.prototype.send_draw_message = function () {\n if (!this.waiting) {\n this.waiting = true;\n this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n }\n};\n\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n var format_dropdown = fig.format_dropdown;\n var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n fig.ondownload(fig, format);\n};\n\nmpl.figure.prototype.handle_resize = function (fig, msg) {\n var size = msg['size'];\n if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n fig._resize_canvas(size[0], size[1], msg['forward']);\n fig.send_message('refresh', {});\n }\n};\n\nmpl.figure.prototype.handle_rubberband = function (fig, msg) {\n var x0 = msg['x0'] / fig.ratio;\n var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n var x1 = msg['x1'] / fig.ratio;\n var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n x0 = Math.floor(x0) + 0.5;\n y0 = Math.floor(y0) + 0.5;\n x1 = Math.floor(x1) + 0.5;\n y1 = Math.floor(y1) + 0.5;\n var min_x = Math.min(x0, x1);\n var min_y = Math.min(y0, y1);\n var width = Math.abs(x1 - x0);\n var height = Math.abs(y1 - y0);\n\n fig.rubberband_context.clearRect(\n 0,\n 0,\n fig.canvas.width / fig.ratio,\n fig.canvas.height / fig.ratio\n );\n\n fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n};\n\nmpl.figure.prototype.handle_figure_label = function (fig, msg) {\n // Updates the figure title.\n fig.header.textContent = msg['label'];\n};\n\nmpl.figure.prototype.handle_cursor = function (fig, msg) {\n var cursor = msg['cursor'];\n switch (cursor) {\n case 0:\n cursor = 'pointer';\n break;\n case 1:\n cursor = 'default';\n break;\n case 2:\n cursor = 'crosshair';\n break;\n case 3:\n cursor = 'move';\n break;\n }\n fig.rubberband_canvas.style.cursor = cursor;\n};\n\nmpl.figure.prototype.handle_message = function (fig, msg) {\n fig.message.textContent = msg['message'];\n};\n\nmpl.figure.prototype.handle_draw = function (fig, _msg) {\n // Request the server to send over a new figure.\n fig.send_draw_message();\n};\n\nmpl.figure.prototype.handle_image_mode = function (fig, msg) {\n fig.image_mode = msg['mode'];\n};\n\nmpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n for (var key in msg) {\n if (!(key in fig.buttons)) {\n continue;\n }\n fig.buttons[key].disabled = !msg[key];\n fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n }\n};\n\nmpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n if (msg['mode'] === 'PAN') {\n fig.buttons['Pan'].classList.add('active');\n fig.buttons['Zoom'].classList.remove('active');\n } else if (msg['mode'] === 'ZOOM') {\n fig.buttons['Pan'].classList.remove('active');\n fig.buttons['Zoom'].classList.add('active');\n } else {\n fig.buttons['Pan'].classList.remove('active');\n fig.buttons['Zoom'].classList.remove('active');\n }\n};\n\nmpl.figure.prototype.updated_canvas_event = function () {\n // Called whenever the canvas gets updated.\n this.send_message('ack', {});\n};\n\n// A function to construct a web socket function for onmessage handling.\n// Called in the figure constructor.\nmpl.figure.prototype._make_on_message_function = function (fig) {\n return function socket_on_message(evt) {\n if (evt.data instanceof Blob) {\n /* FIXME: We get \"Resource interpreted as Image but\n * transferred with MIME type text/plain:\" errors on\n * Chrome. But how to set the MIME type? It doesn't seem\n * to be part of the websocket stream */\n evt.data.type = 'image/png';\n\n /* Free the memory for the previous frames */\n if (fig.imageObj.src) {\n (window.URL || window.webkitURL).revokeObjectURL(\n fig.imageObj.src\n );\n }\n\n fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n evt.data\n );\n fig.updated_canvas_event();\n fig.waiting = false;\n return;\n } else if (\n typeof evt.data === 'string' &&\n evt.data.slice(0, 21) === 'data:image/png;base64'\n ) {\n fig.imageObj.src = evt.data;\n fig.updated_canvas_event();\n fig.waiting = false;\n return;\n }\n\n var msg = JSON.parse(evt.data);\n var msg_type = msg['type'];\n\n // Call the \"handle_{type}\" callback, which takes\n // the figure and JSON message as its only arguments.\n try {\n var callback = fig['handle_' + msg_type];\n } catch (e) {\n console.log(\n \"No handler for the '\" + msg_type + \"' message type: \",\n msg\n );\n return;\n }\n\n if (callback) {\n try {\n // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n callback(fig, msg);\n } catch (e) {\n console.log(\n \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n e,\n e.stack,\n msg\n );\n }\n }\n };\n};\n\n// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\nmpl.findpos = function (e) {\n //this section is from http://www.quirksmode.org/js/events_properties.html\n var targ;\n if (!e) {\n e = window.event;\n }\n if (e.target) {\n targ = e.target;\n } else if (e.srcElement) {\n targ = e.srcElement;\n }\n if (targ.nodeType === 3) {\n // defeat Safari bug\n targ = targ.parentNode;\n }\n\n // pageX,Y are the mouse positions relative to the document\n var boundingRect = targ.getBoundingClientRect();\n var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n\n return { x: x, y: y };\n};\n\n/*\n * return a copy of an object with only non-object keys\n * we need this to avoid circular references\n * http://stackoverflow.com/a/24161582/3208463\n */\nfunction simpleKeys(original) {\n return Object.keys(original).reduce(function (obj, key) {\n if (typeof original[key] !== 'object') {\n obj[key] = original[key];\n }\n return obj;\n }, {});\n}\n\nmpl.figure.prototype.mouse_event = function (event, name) {\n var canvas_pos = mpl.findpos(event);\n\n if (name === 'button_press') {\n this.canvas.focus();\n this.canvas_div.focus();\n }\n\n var x = canvas_pos.x * this.ratio;\n var y = canvas_pos.y * this.ratio;\n\n this.send_message(name, {\n x: x,\n y: y,\n button: event.button,\n step: event.step,\n guiEvent: simpleKeys(event),\n });\n\n /* This prevents the web browser from automatically changing to\n * the text insertion cursor when the button is pressed. We want\n * to control all of the cursor setting manually through the\n * 'cursor' event from matplotlib */\n event.preventDefault();\n return false;\n};\n\nmpl.figure.prototype._key_event_extra = function (_event, _name) {\n // Handle any extra behaviour associated with a key event\n};\n\nmpl.figure.prototype.key_event = function (event, name) {\n // Prevent repeat events\n if (name === 'key_press') {\n if (event.which === this._key) {\n return;\n } else {\n this._key = event.which;\n }\n }\n if (name === 'key_release') {\n this._key = null;\n }\n\n var value = '';\n if (event.ctrlKey && event.which !== 17) {\n value += 'ctrl+';\n }\n if (event.altKey && event.which !== 18) {\n value += 'alt+';\n }\n if (event.shiftKey && event.which !== 16) {\n value += 'shift+';\n }\n\n value += 'k';\n value += event.which.toString();\n\n this._key_event_extra(event, name);\n\n this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n return false;\n};\n\nmpl.figure.prototype.toolbar_button_onclick = function (name) {\n if (name === 'download') {\n this.handle_save(this, null);\n } else {\n this.send_message('toolbar_button', { name: name });\n }\n};\n\nmpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n this.message.textContent = tooltip;\n};\nmpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n\nmpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n\nmpl.default_extension = \"png\";/* global mpl */\n\nvar comm_websocket_adapter = function (comm) {\n // Create a \"websocket\"-like object which calls the given IPython comm\n // object with the appropriate methods. Currently this is a non binary\n // socket, so there is still some room for performance tuning.\n var ws = {};\n\n ws.close = function () {\n comm.close();\n };\n ws.send = function (m) {\n //console.log('sending', m);\n comm.send(m);\n };\n // Register the callback with on_msg.\n comm.on_msg(function (msg) {\n //console.log('receiving', msg['content']['data'], msg);\n // Pass the mpl event to the overridden (by mpl) onmessage function.\n ws.onmessage(msg['content']['data']);\n });\n return ws;\n};\n\nmpl.mpl_figure_comm = function (comm, msg) {\n // This is the function which gets called when the mpl process\n // starts-up an IPython Comm through the \"matplotlib\" channel.\n\n var id = msg.content.data.id;\n // Get hold of the div created by the display call when the Comm\n // socket was opened in Python.\n var element = document.getElementById(id);\n var ws_proxy = comm_websocket_adapter(comm);\n\n function ondownload(figure, _format) {\n window.open(figure.canvas.toDataURL());\n }\n\n var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n\n // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n // web socket which is closed, not our websocket->open comm proxy.\n ws_proxy.onopen();\n\n fig.parent_element = element;\n fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n if (!fig.cell_info) {\n console.error('Failed to find cell for figure', id, fig);\n return;\n }\n fig.cell_info[0].output_area.element.one(\n 'cleared',\n { fig: fig },\n fig._remove_fig_handler\n );\n};\n\nmpl.figure.prototype.handle_close = function (fig, msg) {\n var width = fig.canvas.width / fig.ratio;\n fig.cell_info[0].output_area.element.off(\n 'cleared',\n fig._remove_fig_handler\n );\n\n // Update the output cell to use the data from the current canvas.\n fig.push_to_output();\n var dataURL = fig.canvas.toDataURL();\n // Re-enable the keyboard manager in IPython - without this line, in FF,\n // the notebook keyboard shortcuts fail.\n IPython.keyboard_manager.enable();\n fig.parent_element.innerHTML =\n '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n fig.close_ws(fig, msg);\n};\n\nmpl.figure.prototype.close_ws = function (fig, msg) {\n fig.send_message('closing', msg);\n // fig.ws.close()\n};\n\nmpl.figure.prototype.push_to_output = function (_remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width / this.ratio;\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] =\n '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n};\n\nmpl.figure.prototype.updated_canvas_event = function () {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message('ack', {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () {\n fig.push_to_output();\n }, 1000);\n};\n\nmpl.figure.prototype._init_toolbar = function () {\n var fig = this;\n\n var toolbar = document.createElement('div');\n toolbar.classList = 'btn-toolbar';\n this.root.appendChild(toolbar);\n\n function on_click_closure(name) {\n return function (_event) {\n return fig.toolbar_button_onclick(name);\n };\n }\n\n function on_mouseover_closure(tooltip) {\n return function (event) {\n if (!event.currentTarget.disabled) {\n return fig.toolbar_button_onmouseover(tooltip);\n }\n };\n }\n\n fig.buttons = {};\n var buttonGroup = document.createElement('div');\n buttonGroup.classList = 'btn-group';\n var button;\n for (var toolbar_ind in mpl.toolbar_items) {\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) {\n /* Instead of a spacer, we start a new button group. */\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n buttonGroup = document.createElement('div');\n buttonGroup.classList = 'btn-group';\n continue;\n }\n\n button = fig.buttons[name] = document.createElement('button');\n button.classList = 'btn btn-default';\n button.href = '#';\n button.title = name;\n button.innerHTML = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n // Add the status bar.\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message pull-right';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n\n // Add the close button to the window.\n var buttongrp = document.createElement('div');\n buttongrp.classList = 'btn-group inline pull-right';\n button = document.createElement('button');\n button.classList = 'btn btn-mini btn-primary';\n button.href = '#';\n button.title = 'Stop Interaction';\n button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n button.addEventListener('click', function (_evt) {\n fig.handle_close(fig, {});\n });\n button.addEventListener(\n 'mouseover',\n on_mouseover_closure('Stop Interaction')\n );\n buttongrp.appendChild(button);\n var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n titlebar.insertBefore(buttongrp, titlebar.firstChild);\n};\n\nmpl.figure.prototype._remove_fig_handler = function (event) {\n var fig = event.data.fig;\n fig.close_ws(fig, {});\n};\n\nmpl.figure.prototype._root_extra_style = function (el) {\n el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n};\n\nmpl.figure.prototype._canvas_extra_style = function (el) {\n // this is important to make the div 'focusable\n el.setAttribute('tabindex', 0);\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n } else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n};\n\nmpl.figure.prototype._key_event_extra = function (event, _name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager) {\n manager = IPython.keyboard_manager;\n }\n\n // Check for shift+enter\n if (event.shiftKey && event.which === 13) {\n this.canvas_div.blur();\n // select the cell after this one\n var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n IPython.notebook.select(index + 1);\n }\n};\n\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n fig.ondownload(fig, null);\n};\n\nmpl.find_output_cell = function (html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i = 0; i < ncells; i++) {\n var cell = cells[i];\n if (cell.cell_type === 'code') {\n for (var j = 0; j < cell.output_area.outputs.length; j++) {\n var data = cell.output_area.outputs[j];\n if (data.data) {\n // IPython >= 3 moved mimebundle to data attribute of output\n data = data.data;\n }\n if (data['text/html'] === html_output) {\n return [cell, data, j];\n }\n }\n }\n }\n};\n\n// Register the function which deals with the matplotlib target/channel.\n// The kernel may be null if the page has been refreshed.\nif (IPython.notebook.kernel !== null) {\n IPython.notebook.kernel.comm_manager.register_target(\n 'matplotlib',\n mpl.mpl_figure_comm\n );\n}\n"
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": "<IPython.core.display.HTML object>",
"text/html": "<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA+gAAAPoCAYAAABNo9TkAAAgAElEQVR4Xuy9e7RdVZWvO5JAiAIaBAymQOShBdyKUpeHvAJBUMIbjWhRIEoFGzaCwlEoqePhEG2KSsMr2gQfPKQuSlFKgU15iVwswMgVEJWIIEKgoJACQZCXECC5bUzvokJYyZ59zD7mry/2t1vzj6o9eh8937fGmvPHWmuvCUuXLl2a+IEABCAAAQhAAAIQgAAEIAABCEBASmACAV3Kn80hAAEIQAACEIAABCAAAQhAAAINAQI6DwQIQAACEIAABCAAAQhAAAIQgEAAAgT0ABIYAQIQgAAEIAABCEAAAhCAAAQgQEDnMQABCEAAAhCAAAQgAAEIQAACEAhAgIAeQAIjQAACEIAABCAAAQhAAAIQgAAECOg8BiAAAQhAAAIQgAAEIAABCEAAAgEIENADSGAECEAAAhCAAAQgAAEIQAACEIAAAZ3HAAQgAAEIQAACEIAABCAAAQhAIAABAnoACYwAAQhAAAIQgAAEIAABCEAAAhAgoPMYgAAEIAABCEAAAhCAAAQgAAEIBCBAQA8ggREgAAEIQAACEIAABCAAAQhAAAIEdB4DEIAABCAAAQhAAAIQgAAEIACBAAQI6AEkMAIEIAABCEAAAhCAAAQgAAEIQICAzmMAAhCAAAQgAAEIQAACEIAABCAQgAABPYAERoAABCAAAQhAAAIQgAAEIAABCBDQeQxAAAIQgAAEIAABCEAAAhCAAAQCECCgB5DACBCAAAQgAAEIQAACEIAABCAAAQI6jwEIQAACEIAABCAAAQhAAAIQgEAAAgT0ABIYAQIQgAAEIAABCEAAAhCAAAQgQEDnMQABCEAAAhCAAAQgAAEIQAACEAhAgIAeQAIjQAACEIAABCAAAQhAAAIQgAAECOg8BiAAAQhAAAIQgAAEIAABCEAAAgEIENADSGAECEAAAhCAAAQgAAEIQAACEIAAAZ3HAAQgAAEIQAACEIAABCAAAQhAIAABAnoACYwAAQhAAAIQgAAEIAABCEAAAhAgoPMYgAAEIAABCEAAAhCAAAQgAAEIBCBAQA8ggREgAAEIQAACEIAABCAAAQhAAAIEdB4DEIAABCAAAQhAAAIQgAAEIACBAAQI6AEkMAIEIAABCEAAAhCAAAQgAAEIQICAzmMAAhCAAAQgAAEIQAACEIAABCAQgAABPYAERoAABCAAAQhAAAIQgAAEIAABCBDQeQxAAAIQgAAEIAABCEAAAhCAAAQCECCgB5DACBCAAAQgAAEIQAACEIAABCAAAQI6jwEIQAACEIAABCAAAQhAAAIQgEAAAgT0ABIYAQIQgAAEIAABCEAAAhCAAAQgQEDnMQABCEAAAhCAAAQgAAEIQAACEAhAgIAeQAIjQAACEIAABCAAAQhAAAIQgAAECOg8BiAAAQhAAAIQgAAEIAABCEAAAgEIENADSGAECEAAAhCAAAQgAAEIQAACEIAAAZ3HAAQgAAEIQAACEIAABCAAAQhAIAABAnoACYwAAQhAAAIQgAAEIAABCEAAAhAgoPMYgAAEIAABCEAAAhCAAAQgAAEIBCBAQA8ggREgAAEIQAACEIAABCAAAQhAAAIEdB4DEIAABCAAAQhAAAIQgAAEIACBAAQI6AEkMAIEIAABCEAAAhCAAAQgAAEIQICAzmMAAhCAAAQgAAEIQAACEIAABCAQgAABPYAERoAABCAAAQhAAAIQgAAEIAABCBDQeQxAAAIQgAAEIAABCEAAAhCAAAQCECCgB5DACBCAAAQgAAEIQAACEIAABCAAAQI6jwEIQAACEIAABCAAAQhAAAIQgEAAAgT0ABIYAQIQgAAEIAABCEAAAhCAAAQgQEDnMQABCEAAAhCAAAQgAAEIQAACEAhAgIAeQAIjQAACEIAABCAAAQhAAAIQgAAECOg8BiAAAQhAAAIQgAAEIAABCEAAAgEIENADSGAECEAAAhCAAAQgAAEIQAACEIAAAZ3HAAQgAAEIQAACEIAABCAAAQhAIAABAnoACYwAAQhAAAIQgAAEIAABCEAAAhAgoPMYgAAEIAABCEAAAhCAAAQgAAEIBCBAQA8ggREgAAEIQAACEIAABCAAAQhAAAIEdB4DEIAABCAAAQhAAAIQgAAEIACBAAQI6AEkMAIEIAABCEAAAhCAAAQgAAEIQICAzmMAAhCAAAQgAAEIQAACEIAABCAQgAABPYAERoAABCAAAQhAAAIQgAAEIAABCBDQeQxAAAIQgAAEIAABCEAAAhCAAAQCECCgB5DACBCAAAQgAAEIQAACEIAABCAAAQI6jwEIQAACEIAABCAAAQhAAAIQgEAAAgT0ABIYAQIQgAAEIAABCEAAAhCAAAQgQEDnMQABCEAAAhCAAAQgAAEIQAACEAhAgIAeQAIjQAACEIAABCAAAQhAAAIQgAAECOg8BiAAAQhAAAIQgAAEIAABCEAAAgEIENADSGAECEAAAhCAAAQgAAEIQAACEIAAAZ3HAAQgAAEIQAACEIAABCAAAQhAIAABAnoACYwAAQhAAAIQgAAEIAABCEAAAhAgoPMYgAAEIAABCEAAAhCAAAQgAAEIBCBAQA8ggREgAAEIQAACEIAABCAAAQhAAAIEdB4DEIAABCAAAQhAAAIQgAAEIACBAAQI6AEkMAIEIAABCEAAAhCAAAQgAAEIQICAzmMAAhCAAAQgAAEIQAACEIAABCAQgAABPYAERoAABCAAAQhAAAIQgAAEIAABCBDQeQxAAAIQgAAEIAABCEAAAhCAAAQCECCgB5DACBCAAAQgAAEIQAACEIAABCAAAQI6jwEIQAACEIAABCAAAQhAAAIQgEAAAgT0ABIYAQIQgAAEIAABCEAAAhCAAAQgQEDnMQABCEAAAhCAAAQgAAEIQAACEAhAgIAeQAIjQAACEIAABCAAAQhAAAIQgAAECOg8BiAAAQhAAAIQgAAEIAABCEAAAgEIENADSGAECEAAAhCAAAQgAAEIQAACEIAAAZ3HAAQgAAEIQAACEIAABCAAAQhAIAABAnoACYwAAQhAAAIQgAAEIAABCEAAAhAgoPMYgAAEIAABCEAAAhCAAAQgAAEIBCBAQA8ggREgAAEIQAACEIAABCAAAQhAAAIEdB4DEIAABCAAAQhAAAIQgAAEIACBAAQI6AEkMAIEIAABCEAAAhCAAAQgAAEIQICAzmMAAhCAAAQgAAEIQAACEIAABCAQgAABPYAERoAABCAAAQhAAAIQgAAEIAABCBDQeQxAAAIQgAAEIAABCEAAAhCAAAQCECCgB5DACBCAAAQgAAEIQAACEIAABCAAAQI6jwEIQAACEIAABCAAAQhAAAIQgEAAAgT0ABIYAQIQgAAEIAABCEAAAhCAAAQgQEDnMQABCEAAAhCAAAQgAAEIQAACEAhAgIAeQAIjQAACEIAABCAAAQhAAAIQgAAECOg8BiAAAQhAAAIQgAAEIAABCEAAAgEIENADSGAECEAAAhCAAAQgAAEIQAACEIAAAZ3HAAQgAAEIQAACEIAABCAAAQhAIAABAnoACYwAAQhAAAIQgAAEIAABCEAAAhAgoPMYgAAEIAABCEAAAhCAAAQgAAEIBCBAQA8ggREgAAEIQAACEIAABCAAAQhAAAIEdB4DEIAABCAAAQhAAAIQgAAEIACBAAQI6AEkMAIEIAABCEAAAhCAAAQgAAEIQGDcB/THHnssXXrppemGG25IN954Y7rvvvvSH/7wh/TnP/85TZ06NW2xxRZpr732SnPnzk1rr722yyPm/PPPT9/85jfTzTffnB555JG03nrrpZkzZ6Z58+al7bbbzmUPmkAAAhCAAAQgAAEIQAACEIDAaBEY9wH9yiuvTG9/+9vHtLbOOuukb33rW2mPPfYYc+2KFjz99NPpwAMPTBdffPHQJRMnTkzz589PJ5xwQvEeFEIAAhCAAAQgAAEIQAACEIDAaBIgoF95ZfqHf/iHtOuuu6atttoqbbDBBul1r3tdWrJkSfrP//zPdMEFF6QLL7wwPf/882ny5MnNK+1vfvObi2wffPDB6bzzzmtq835HH310mj59elq4cGE66aST0p133tn87owzzkiHH3540R4UQQACEIAABCAAAQhAAAIQgMBoEhj3AT0H70mTJq3U3ve+9730zne+s1nzrne9K/3bv/2b2fbVV1+dZs2a1dTtu+++6aKLLnrRvg899FDzHwjuueeetNZaa6VFixY1b7HnBwIQgAAEIAABCEAAAhCAAATGB4FxH9Dbat58883TbbfdlvJb3fNn1K0/e++9d/NZ9/wfA+6+++60/vrrv6RF/mz6QQcd1Pz/TznllPSxj33Mug3rIQABCEAAAhCAAAQgAAEIQGBECRDQW4rbeuut089//vO0xhprpMcff7xl1V+WPfHEE02wf+aZZ9Ls2bPTZZddNrR+8eLFad111035D9ftsMMOacGCBaZ9WAwBCEAAAhCAAAQgAAEIQAACo0uAgN7C3a233ppmzJjRfA49B/X8OXTLz1VXXZV22223puSzn/1sOv7441dYnv8I3RVXXJFWWWWV9NRTT6VVV13VshVrIQABCEAAAhCAAAQgAAEIQGBECRDQVyAuh+P8lWs/+MEP0sknn5weeOCBZuW5556bDjnkEJPu0047LR111FFNTf7s+QEHHLDC+vyH47785S83v7/llluar3njBwIQgAAEIAABCEAAAhCAAARe/gQI6Ms4Puecc9Jhhx22QuvHHntsE9YnTJhgemTkV8w///nPNzX51ff8KvyKfvJnz4877rjm15dffrnpa93yX51f2U/+mrf8Ofpp06Y1b6XPr9LzAwEIQAACEIAABCAAAQiMPwLPPffcC39bK79beMqUKeMPQsB/MQG9RUDfcsst09e+9rX01re+tUjhvHnz0umnn97U5rfLb7bZZivs89WvfjUdeeSRze/zV7zNmTOn9Z7W/3DQujELIQABCEAAAhCAAAQgAIGXLYHrr78+bbPNNi/bf98o/cMI6MvYevTRR5vvPs8/f/7zn5vvJf/Od77TvC19k002SaeeemraZ599zH7nzp2bzj777KYu99x4441X2COvy+vzj/Xt9AR0sxoKIAABCEAAAhCAAAQgMO4JENDjPAQI6C1c5KD8/ve/v3lr+1lnnZU+8IEPtKj67yV9vYI+1lvc77333uavw+efH/3oR2nDDTc0/TtY3J1A/kv+P/vZz5pG+R0Zq622WvemdDARwIEJV5XFOKiC1dQUByZc7ovh747U3BAHZmTuBThwR2pu+B//8R/p7W9/e1N31113pTe84Q3mHhT4EyCgt2T63ve+t3k1ffXVV0856K611lotK1PzV9v7+Az6WAPlAL/BBhs0y26//fb0xje+cawSfu9MIL8zI/+V/vzzjne8I73iFa9w3oF2YxHAwViE6v8eB/UZj7UDDsYiVPf38K/Lt013HLShVHcNDurybdP9d7/7XXrTm97ULM35Zv31129TxprKBAjoLQGfd9556eCDD25Wf/vb305///d/37Iypa985Svpwx/+cLNe+VfcCeitlVVbyMWoGtrWjXHQGlW1hTiohrZ1Yxy0RlVlIfyrYDU1xYEJV5XFOKiC1dSUgG7C1dtiAnpL1Pkt4fkVz/xz0kknpX/6p39qWZlS6fegP/nkk2ny5Mmt9xlrIQF9LEL1f8/FqD7jsXbAwViE6v8eB/UZj7UDDsYiVPf38K/Lt013HLShVHcNDurybdOdgN6GUv9rCOgtmS/7FWz5e8oHr4i3KX/88cfTOuuskxYvXpxmz56dLrvssqFl+ff5688ee+yxtP3226ef/vSnbdq3XkNAb42q2kIuRtXQtm6Mg9aoqi3EQTW0rRvjoDWqKgvhXwWrqSkOTLiqLMZBFaympgR0E67eFhPQW6Lee++906WXXtqs/vGPf5xmzZrVsvIvy/baa68mmOfvHs9/hGHYZzzOP//8dNBBBzXr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n302nXbaaenmm2+u/m6PPfZIF198sYngOZuwCc2RqhviQI3MfAEOzJGqG+JAjcx8AQ7Mkaoawl+Fy6UYBy5YVU1xoMLlUowDF6ytmw76gH7BBRekfffdNxukhOixY8c2Cuiy6Ljjjkvf//7306xZs2rPKS9tv/zyy9MiiyySPVNuIZswl5RfHQ782OZ2xkEuKb86HPixze2Mg1xSPnXw9+Gq6YoDDS2fWhz4cNV0xYGGVne1BPSOA7qoveOOO9IZZ5yRbr/99vTCCy+kESNGpFGjRlW/KJBnzzkgAAEIQAACEIAABCAAAQhAYPARGPQBffAp518MAQhAAAIQgAAEIAABCEAAAiUSIKCXaIWZIAABCEAAAhCAAAQgAAEIQGDQESCgDzrl/IMhAAEIQAACEIAABCAAAQhAoEQCBPQSrTATBCAAAQhAAAIQgAAEIAABCAw6AgT0QaecfzAEIAABCEAAAhCAAAQgAAEIlEiAgF6iFWaCAAQgAAEIQAACEIAABCAAgUFHgIA+6JTzD4YABCAAAQhAAAIQgAAEIACBEgkQ0Eu0wkwQgAAEIAABCEAAAhCAAAQgMOgIENAHnXL+wRCAAAQgAAEIQAACEIAABCBQIgECeolWWs40ffr0dO+996Y777yz+s9dd92VnnzyyarrGmusMft/tzzNXMsnT56czjzzzHT77ben559/Pi299NJp1KhRaZ999km777675al6qtdbb72VzjjjjHTZZZelqVOnphkzZqTVVlst7bDDDumb3/xmWn311Vv9e2655ZY0bty4rB7HHXdcOv7447Nqe6Ho6aefTj/60Y/S1VdfneR/L7zwwmnkyJFp1113TQcddFAaPny4yT/jkksuSeeff37605/+lF599dW00korpS233DIdfPDBabPNNjM5Ry828eQvP6cnnHBCFpabb745jR07Nqt2fih68cUX53psl8f3V155pfqnffWrX00XXHCB+T+TPTA30q4csA/6/1GWe5zrrruuuud48MEHkzhZaKGF0iqrrJI233zztN9++1WP05YH+2Buml05YB/U/xS//vrr6Zprrqnu8e++++70t7/9Lb300kvpH//4RxoxYkRaf/3104QJE6q9sOyyy5psBfaACcasJgT0LEy9VSSBTYJb3eER0L/3ve9VN9MzZ86sPednP/vZdOmll6ZFFlmkt0C2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Fxg0VSZAgAABAgQIECBAgACB+gQk6PXFVIsIECBAgAABAgQIECBAoEABCXqBQVNlAgQIECBAgAABAgQIEKhPQIJeX0y1iAABAgQIECBAgAABAgQKFJCgFxg0VSZAgAABAgQIECBAgACB+gQk6PXFVIsIECBAgAABAgQIECBAoEABCXqBQVNlAgQIECBAgAABAgQIEKhPQIJeX0y1iAABAgQIECBAgAABAgQKFJCgFxg0VSZAgAABAgQIECBAgACB+gQk6PXFVIsIECBAgAABAgQIECBAoEABCXqBQVNlAgQIECBAgAABAgQIEKhPQIJeX0y1iAABAgQIECBAgAABAgQKFJCgFxg0VSZAgAABAgQIECBAgACB+gQk6PXFVIsIECBAgAABAgQIECBAoEABCXqBQVNlAgQIECBAgAABAgQIEKhPQIJeX0y1iAABAgQIECBAgAABAgQKFJCgFxg0VSZAgAABAgQIECBAgACB+gQk6PXFVIsIECBAgAABAgQIECBAoEABCXqBQVNlAgQIECBAgAABAgQIEKhPQIJeX0y1iAABAgQIECBAgAABAgQKFJCgFxg0VSZAgAABAgQIECBAgACB+gQk6PXFVIsIECBAgAABAgQIECBAoEABCXqBQVNlAgQIECBAgAABAgQIEKhPQIJeX0y1iAABAgQIECBAgAABAgQKFJCgFxg0VSZAgAABAgQIECBAgACB+gQk6PXFVIsIECBAgAABAgQIECBAoEABCXqBQVNlAgQIECBAgAABAgQIEKhPQIJeX0y1iAABAgQIECBAgAABAgQKFJCgFxg0VSZAgAABAgQIECBAgACB+gQk6PXFVIsIECBAgAABAgQIECBAoEABCXqBQVNlAgQIECBAgAABAgQIEKhPQIJeX0y1iAABAgQIECBAgAABAgQKFJCgFxg0VSZAgAABAgQIECBAgACB+gQk6PXFVIsIECBAgAABAgQIECBAoEABCXqBQVNlAgQIECBAgAABAgQIEKhPQIJeX0y1iAABAgQIECBAgAABAgQKFJCgFxg0VSZAgAABAgQIECBAgACB+gQk6PXFVIsIECBAgAABAgQIECBAoEABCXqBQVNlAgQIECBAgAABAgQIEKhPQIJeX0y1iAABAgQIECBAgAABAgQKFJCgFxg0VSZAgAABAgQIECBAgACB+gQk6PXFVIsIECBAgAABAgQIECBAoEABCXqBQVNlAgQIECBAgAABAgQIEKhPQIJeX0y1iAABAgQIECBAgAABAgQKFJCgFxg0VSZAgAABAgQIECBAgACB+gQk6PXFVIsIECBAgAABAgQIECBAoEABCXqBQVNlAgQIECBAgAABAgQIEKhPQIJeX0y1iAABAgQIECBAgAABAgQKFJCgFxg0VSZAgAABAgQIECBAgACB+gT+B38J1pfYZsz8AAAAAElFTkSuQmCC\" width=\"500\">"
},
"metadata": {}
},
{
"output_type": "execute_result",
"execution_count": 4,
"data": {
"text/plain": "<matplotlib.collections.PathCollection at 0x7f89f9c94f10>"
},
"metadata": {}
}
]
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-03-28T06:04:13.815400Z",
"end_time": "2021-03-28T06:04:13.824725Z"
},
"code_folding": [],
"trusted": true
},
"cell_type": "code",
"source": "# Backward + Zero shift\n\ndef Backward_Shift(arm, _tx, _ty):\n tx = _tx\n ty = _ty\n for i in reversed(range(N)):\n arm[i].backward(tx, ty)\n tx = arm[i].ax\n ty = arm[i].ay\n \n dx = OX - arm[0].ax\n dy = OX - arm[0].ay \n PX = []\n PY = []\n for i in range(N):\n arm[i].shift(dx, dy)\n PX.append(arm[i].ax)\n PY.append(arm[i].ay) \n PX.append(arm[N-1].bx)\n PY.append(arm[N-1].by)\n \n return PX, PY",
"execution_count": 5,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2021-03-28T06:11:21.490315Z",
"end_time": "2021-03-28T06:11:21.704026Z"
},
"code_folding": [],
"trusted": true
},
"cell_type": "code",
"source": "# Inverse Kinematics: End-effector follows Mouse coodinates\n\ndef motion(event):\n mx = event.xdata\n my = event.ydata\n Mouse.set_data(mx, my)\n \n BX, BY = Backward_Shift(bws, mx, my)\n BLine.set_data(BX, BY)\n BDot.set_data(BX, BY)\n \n plt.draw()\n\nfig = plt.figure(figsize=(5,5))\nax = fig.add_subplot(111)\nax.axis([-1,N,-1,N])\nax.grid()\n\nBLine, = ax.plot([],[], linestyle='-', color='blue', alpha=1, label='BackWard Shift')\nBDot, = ax.plot([],[], marker='o', color='tab:blue')\nMouse, = ax.plot([],[], marker='x', ms=20, color='red')\n\nplt.connect('motion_notify_event', motion)\nplt.legend(loc='lower right')\nplt.show()",
"execution_count": 10,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": "<IPython.core.display.Javascript object>",
"application/javascript": "/* Put everything inside the global mpl namespace */\n/* global mpl */\nwindow.mpl = {};\n\nmpl.get_websocket_type = function () {\n if (typeof WebSocket !== 'undefined') {\n return WebSocket;\n } else if (typeof MozWebSocket !== 'undefined') {\n return MozWebSocket;\n } else {\n alert(\n 'Your browser does not have WebSocket support. ' +\n 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n 'Firefox 4 and 5 are also supported but you ' +\n 'have to enable WebSockets in about:config.'\n );\n }\n};\n\nmpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n this.id = figure_id;\n\n this.ws = websocket;\n\n this.supports_binary = this.ws.binaryType !== undefined;\n\n if (!this.supports_binary) {\n var warnings = document.getElementById('mpl-warnings');\n if (warnings) {\n warnings.style.display = 'block';\n warnings.textContent =\n 'This browser does not support binary websocket messages. ' +\n 'Performance may be slow.';\n }\n }\n\n this.imageObj = new Image();\n\n this.context = undefined;\n this.message = undefined;\n this.canvas = undefined;\n this.rubberband_canvas = undefined;\n this.rubberband_context = undefined;\n this.format_dropdown = undefined;\n\n this.image_mode = 'full';\n\n this.root = document.createElement('div');\n this.root.setAttribute('style', 'display: inline-block');\n this._root_extra_style(this.root);\n\n parent_element.appendChild(this.root);\n\n this._init_header(this);\n this._init_canvas(this);\n this._init_toolbar(this);\n\n var fig = this;\n\n this.waiting = false;\n\n this.ws.onopen = function () {\n fig.send_message('supports_binary', { value: fig.supports_binary });\n fig.send_message('send_image_mode', {});\n if (fig.ratio !== 1) {\n fig.send_message('set_dpi_ratio', { dpi_ratio: fig.ratio });\n }\n fig.send_message('refresh', {});\n };\n\n this.imageObj.onload = function () {\n if (fig.image_mode === 'full') {\n // Full images could contain transparency (where diff images\n // almost always do), so we need to clear the canvas so that\n // there is no ghosting.\n fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n }\n fig.context.drawImage(fig.imageObj, 0, 0);\n };\n\n this.imageObj.onunload = function () {\n fig.ws.close();\n };\n\n this.ws.onmessage = this._make_on_message_function(this);\n\n this.ondownload = ondownload;\n};\n\nmpl.figure.prototype._init_header = function () {\n var titlebar = document.createElement('div');\n titlebar.classList =\n 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n var titletext = document.createElement('div');\n titletext.classList = 'ui-dialog-title';\n titletext.setAttribute(\n 'style',\n 'width: 100%; text-align: center; padding: 3px;'\n );\n titlebar.appendChild(titletext);\n this.root.appendChild(titlebar);\n this.header = titletext;\n};\n\nmpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._init_canvas = function () {\n var fig = this;\n\n var canvas_div = (this.canvas_div = document.createElement('div'));\n canvas_div.setAttribute(\n 'style',\n 'border: 1px solid #ddd;' +\n 'box-sizing: content-box;' +\n 'clear: both;' +\n 'min-height: 1px;' +\n 'min-width: 1px;' +\n 'outline: 0;' +\n 'overflow: hidden;' +\n 'position: relative;' +\n 'resize: both;'\n );\n\n function on_keyboard_event_closure(name) {\n return function (event) {\n return fig.key_event(event, name);\n };\n }\n\n canvas_div.addEventListener(\n 'keydown',\n on_keyboard_event_closure('key_press')\n );\n canvas_div.addEventListener(\n 'keyup',\n on_keyboard_event_closure('key_release')\n );\n\n this._canvas_extra_style(canvas_div);\n this.root.appendChild(canvas_div);\n\n var canvas = (this.canvas = document.createElement('canvas'));\n canvas.classList.add('mpl-canvas');\n canvas.setAttribute('style', 'box-sizing: content-box;');\n\n this.context = canvas.getContext('2d');\n\n var backingStore =\n this.context.backingStorePixelRatio ||\n this.context.webkitBackingStorePixelRatio ||\n this.context.mozBackingStorePixelRatio ||\n this.context.msBackingStorePixelRatio ||\n this.context.oBackingStorePixelRatio ||\n this.context.backingStorePixelRatio ||\n 1;\n\n this.ratio = (window.devicePixelRatio || 1) / backingStore;\n if (this.ratio !== 1) {\n fig.send_message('set_dpi_ratio', { dpi_ratio: this.ratio });\n }\n\n var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n 'canvas'\n ));\n rubberband_canvas.setAttribute(\n 'style',\n 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n );\n\n var resizeObserver = new ResizeObserver(function (entries) {\n var nentries = entries.length;\n for (var i = 0; i < nentries; i++) {\n var entry = entries[i];\n var width, height;\n if (entry.contentBoxSize) {\n if (entry.contentBoxSize instanceof Array) {\n // Chrome 84 implements new version of spec.\n width = entry.contentBoxSize[0].inlineSize;\n height = entry.contentBoxSize[0].blockSize;\n } else {\n // Firefox implements old version of spec.\n width = entry.contentBoxSize.inlineSize;\n height = entry.contentBoxSize.blockSize;\n }\n } else {\n // Chrome <84 implements even older version of spec.\n width = entry.contentRect.width;\n height = entry.contentRect.height;\n }\n\n // Keep the size of the canvas and rubber band canvas in sync with\n // the canvas container.\n if (entry.devicePixelContentBoxSize) {\n // Chrome 84 implements new version of spec.\n canvas.setAttribute(\n 'width',\n entry.devicePixelContentBoxSize[0].inlineSize\n );\n canvas.setAttribute(\n 'height',\n entry.devicePixelContentBoxSize[0].blockSize\n );\n } else {\n canvas.setAttribute('width', width * fig.ratio);\n canvas.setAttribute('height', height * fig.ratio);\n }\n canvas.setAttribute(\n 'style',\n 'width: ' + width + 'px; height: ' + height + 'px;'\n );\n\n rubberband_canvas.setAttribute('width', width);\n rubberband_canvas.setAttribute('height', height);\n\n // And update the size in Python. We ignore the initial 0/0 size\n // that occurs as the element is placed into the DOM, which should\n // otherwise not happen due to the minimum size styling.\n if (width != 0 && height != 0) {\n fig.request_resize(width, height);\n }\n }\n });\n resizeObserver.observe(canvas_div);\n\n function on_mouse_event_closure(name) {\n return function (event) {\n return fig.mouse_event(event, name);\n };\n }\n\n rubberband_canvas.addEventListener(\n 'mousedown',\n on_mouse_event_closure('button_press')\n );\n rubberband_canvas.addEventListener(\n 'mouseup',\n on_mouse_event_closure('button_release')\n );\n // Throttle sequential mouse events to 1 every 20ms.\n rubberband_canvas.addEventListener(\n 'mousemove',\n on_mouse_event_closure('motion_notify')\n );\n\n rubberband_canvas.addEventListener(\n 'mouseenter',\n on_mouse_event_closure('figure_enter')\n );\n rubberband_canvas.addEventListener(\n 'mouseleave',\n on_mouse_event_closure('figure_leave')\n );\n\n canvas_div.addEventListener('wheel', function (event) {\n if (event.deltaY < 0) {\n event.step = 1;\n } else {\n event.step = -1;\n }\n on_mouse_event_closure('scroll')(event);\n });\n\n canvas_div.appendChild(canvas);\n canvas_div.appendChild(rubberband_canvas);\n\n this.rubberband_context = rubberband_canvas.getContext('2d');\n this.rubberband_context.strokeStyle = '#000000';\n\n this._resize_canvas = function (width, height, forward) {\n if (forward) {\n canvas_div.style.width = width + 'px';\n canvas_div.style.height = height + 'px';\n }\n };\n\n // Disable right mouse context menu.\n this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n event.preventDefault();\n return false;\n });\n\n function set_focus() {\n canvas.focus();\n canvas_div.focus();\n }\n\n window.setTimeout(set_focus, 100);\n};\n\nmpl.figure.prototype._init_toolbar = function () {\n var fig = this;\n\n var toolbar = document.createElement('div');\n toolbar.classList = 'mpl-toolbar';\n this.root.appendChild(toolbar);\n\n function on_click_closure(name) {\n return function (_event) {\n return fig.toolbar_button_onclick(name);\n };\n }\n\n function on_mouseover_closure(tooltip) {\n return function (event) {\n if (!event.currentTarget.disabled) {\n return fig.toolbar_button_onmouseover(tooltip);\n }\n };\n }\n\n fig.buttons = {};\n var buttonGroup = document.createElement('div');\n buttonGroup.classList = 'mpl-button-group';\n for (var toolbar_ind in mpl.toolbar_items) {\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) {\n /* Instead of a spacer, we start a new button group. */\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n buttonGroup = document.createElement('div');\n buttonGroup.classList = 'mpl-button-group';\n continue;\n }\n\n var button = (fig.buttons[name] = document.createElement('button'));\n button.classList = 'mpl-widget';\n button.setAttribute('role', 'button');\n button.setAttribute('aria-disabled', 'false');\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n\n var icon_img = document.createElement('img');\n icon_img.src = '_images/' + image + '.png';\n icon_img.srcset = '_images/' + image + '_large.png 2x';\n icon_img.alt = tooltip;\n button.appendChild(icon_img);\n\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n var fmt_picker = document.createElement('select');\n fmt_picker.classList = 'mpl-widget';\n toolbar.appendChild(fmt_picker);\n this.format_dropdown = fmt_picker;\n\n for (var ind in mpl.extensions) {\n var fmt = mpl.extensions[ind];\n var option = document.createElement('option');\n option.selected = fmt === mpl.default_extension;\n option.innerHTML = fmt;\n fmt_picker.appendChild(option);\n }\n\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n};\n\nmpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n // which will in turn request a refresh of the image.\n this.send_message('resize', { width: x_pixels, height: y_pixels });\n};\n\nmpl.figure.prototype.send_message = function (type, properties) {\n properties['type'] = type;\n properties['figure_id'] = this.id;\n this.ws.send(JSON.stringify(properties));\n};\n\nmpl.figure.prototype.send_draw_message = function () {\n if (!this.waiting) {\n this.waiting = true;\n this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n }\n};\n\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n var format_dropdown = fig.format_dropdown;\n var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n fig.ondownload(fig, format);\n};\n\nmpl.figure.prototype.handle_resize = function (fig, msg) {\n var size = msg['size'];\n if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n fig._resize_canvas(size[0], size[1], msg['forward']);\n fig.send_message('refresh', {});\n }\n};\n\nmpl.figure.prototype.handle_rubberband = function (fig, msg) {\n var x0 = msg['x0'] / fig.ratio;\n var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n var x1 = msg['x1'] / fig.ratio;\n var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n x0 = Math.floor(x0) + 0.5;\n y0 = Math.floor(y0) + 0.5;\n x1 = Math.floor(x1) + 0.5;\n y1 = Math.floor(y1) + 0.5;\n var min_x = Math.min(x0, x1);\n var min_y = Math.min(y0, y1);\n var width = Math.abs(x1 - x0);\n var height = Math.abs(y1 - y0);\n\n fig.rubberband_context.clearRect(\n 0,\n 0,\n fig.canvas.width / fig.ratio,\n fig.canvas.height / fig.ratio\n );\n\n fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n};\n\nmpl.figure.prototype.handle_figure_label = function (fig, msg) {\n // Updates the figure title.\n fig.header.textContent = msg['label'];\n};\n\nmpl.figure.prototype.handle_cursor = function (fig, msg) {\n var cursor = msg['cursor'];\n switch (cursor) {\n case 0:\n cursor = 'pointer';\n break;\n case 1:\n cursor = 'default';\n break;\n case 2:\n cursor = 'crosshair';\n break;\n case 3:\n cursor = 'move';\n break;\n }\n fig.rubberband_canvas.style.cursor = cursor;\n};\n\nmpl.figure.prototype.handle_message = function (fig, msg) {\n fig.message.textContent = msg['message'];\n};\n\nmpl.figure.prototype.handle_draw = function (fig, _msg) {\n // Request the server to send over a new figure.\n fig.send_draw_message();\n};\n\nmpl.figure.prototype.handle_image_mode = function (fig, msg) {\n fig.image_mode = msg['mode'];\n};\n\nmpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n for (var key in msg) {\n if (!(key in fig.buttons)) {\n continue;\n }\n fig.buttons[key].disabled = !msg[key];\n fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n }\n};\n\nmpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n if (msg['mode'] === 'PAN') {\n fig.buttons['Pan'].classList.add('active');\n fig.buttons['Zoom'].classList.remove('active');\n } else if (msg['mode'] === 'ZOOM') {\n fig.buttons['Pan'].classList.remove('active');\n fig.buttons['Zoom'].classList.add('active');\n } else {\n fig.buttons['Pan'].classList.remove('active');\n fig.buttons['Zoom'].classList.remove('active');\n }\n};\n\nmpl.figure.prototype.updated_canvas_event = function () {\n // Called whenever the canvas gets updated.\n this.send_message('ack', {});\n};\n\n// A function to construct a web socket function for onmessage handling.\n// Called in the figure constructor.\nmpl.figure.prototype._make_on_message_function = function (fig) {\n return function socket_on_message(evt) {\n if (evt.data instanceof Blob) {\n /* FIXME: We get \"Resource interpreted as Image but\n * transferred with MIME type text/plain:\" errors on\n * Chrome. But how to set the MIME type? It doesn't seem\n * to be part of the websocket stream */\n evt.data.type = 'image/png';\n\n /* Free the memory for the previous frames */\n if (fig.imageObj.src) {\n (window.URL || window.webkitURL).revokeObjectURL(\n fig.imageObj.src\n );\n }\n\n fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n evt.data\n );\n fig.updated_canvas_event();\n fig.waiting = false;\n return;\n } else if (\n typeof evt.data === 'string' &&\n evt.data.slice(0, 21) === 'data:image/png;base64'\n ) {\n fig.imageObj.src = evt.data;\n fig.updated_canvas_event();\n fig.waiting = false;\n return;\n }\n\n var msg = JSON.parse(evt.data);\n var msg_type = msg['type'];\n\n // Call the \"handle_{type}\" callback, which takes\n // the figure and JSON message as its only arguments.\n try {\n var callback = fig['handle_' + msg_type];\n } catch (e) {\n console.log(\n \"No handler for the '\" + msg_type + \"' message type: \",\n msg\n );\n return;\n }\n\n if (callback) {\n try {\n // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n callback(fig, msg);\n } catch (e) {\n console.log(\n \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n e,\n e.stack,\n msg\n );\n }\n }\n };\n};\n\n// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\nmpl.findpos = function (e) {\n //this section is from http://www.quirksmode.org/js/events_properties.html\n var targ;\n if (!e) {\n e = window.event;\n }\n if (e.target) {\n targ = e.target;\n } else if (e.srcElement) {\n targ = e.srcElement;\n }\n if (targ.nodeType === 3) {\n // defeat Safari bug\n targ = targ.parentNode;\n }\n\n // pageX,Y are the mouse positions relative to the document\n var boundingRect = targ.getBoundingClientRect();\n var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n\n return { x: x, y: y };\n};\n\n/*\n * return a copy of an object with only non-object keys\n * we need this to avoid circular references\n * http://stackoverflow.com/a/24161582/3208463\n */\nfunction simpleKeys(original) {\n return Object.keys(original).reduce(function (obj, key) {\n if (typeof original[key] !== 'object') {\n obj[key] = original[key];\n }\n return obj;\n }, {});\n}\n\nmpl.figure.prototype.mouse_event = function (event, name) {\n var canvas_pos = mpl.findpos(event);\n\n if (name === 'button_press') {\n this.canvas.focus();\n this.canvas_div.focus();\n }\n\n var x = canvas_pos.x * this.ratio;\n var y = canvas_pos.y * this.ratio;\n\n this.send_message(name, {\n x: x,\n y: y,\n button: event.button,\n step: event.step,\n guiEvent: simpleKeys(event),\n });\n\n /* This prevents the web browser from automatically changing to\n * the text insertion cursor when the button is pressed. We want\n * to control all of the cursor setting manually through the\n * 'cursor' event from matplotlib */\n event.preventDefault();\n return false;\n};\n\nmpl.figure.prototype._key_event_extra = function (_event, _name) {\n // Handle any extra behaviour associated with a key event\n};\n\nmpl.figure.prototype.key_event = function (event, name) {\n // Prevent repeat events\n if (name === 'key_press') {\n if (event.which === this._key) {\n return;\n } else {\n this._key = event.which;\n }\n }\n if (name === 'key_release') {\n this._key = null;\n }\n\n var value = '';\n if (event.ctrlKey && event.which !== 17) {\n value += 'ctrl+';\n }\n if (event.altKey && event.which !== 18) {\n value += 'alt+';\n }\n if (event.shiftKey && event.which !== 16) {\n value += 'shift+';\n }\n\n value += 'k';\n value += event.which.toString();\n\n this._key_event_extra(event, name);\n\n this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n return false;\n};\n\nmpl.figure.prototype.toolbar_button_onclick = function (name) {\n if (name === 'download') {\n this.handle_save(this, null);\n } else {\n this.send_message('toolbar_button', { name: name });\n }\n};\n\nmpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n this.message.textContent = tooltip;\n};\nmpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n\nmpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n\nmpl.default_extension = \"png\";/* global mpl */\n\nvar comm_websocket_adapter = function (comm) {\n // Create a \"websocket\"-like object which calls the given IPython comm\n // object with the appropriate methods. Currently this is a non binary\n // socket, so there is still some room for performance tuning.\n var ws = {};\n\n ws.close = function () {\n comm.close();\n };\n ws.send = function (m) {\n //console.log('sending', m);\n comm.send(m);\n };\n // Register the callback with on_msg.\n comm.on_msg(function (msg) {\n //console.log('receiving', msg['content']['data'], msg);\n // Pass the mpl event to the overridden (by mpl) onmessage function.\n ws.onmessage(msg['content']['data']);\n });\n return ws;\n};\n\nmpl.mpl_figure_comm = function (comm, msg) {\n // This is the function which gets called when the mpl process\n // starts-up an IPython Comm through the \"matplotlib\" channel.\n\n var id = msg.content.data.id;\n // Get hold of the div created by the display call when the Comm\n // socket was opened in Python.\n var element = document.getElementById(id);\n var ws_proxy = comm_websocket_adapter(comm);\n\n function ondownload(figure, _format) {\n window.open(figure.canvas.toDataURL());\n }\n\n var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n\n // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n // web socket which is closed, not our websocket->open comm proxy.\n ws_proxy.onopen();\n\n fig.parent_element = element;\n fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n if (!fig.cell_info) {\n console.error('Failed to find cell for figure', id, fig);\n return;\n }\n fig.cell_info[0].output_area.element.one(\n 'cleared',\n { fig: fig },\n fig._remove_fig_handler\n );\n};\n\nmpl.figure.prototype.handle_close = function (fig, msg) {\n var width = fig.canvas.width / fig.ratio;\n fig.cell_info[0].output_area.element.off(\n 'cleared',\n fig._remove_fig_handler\n );\n\n // Update the output cell to use the data from the current canvas.\n fig.push_to_output();\n var dataURL = fig.canvas.toDataURL();\n // Re-enable the keyboard manager in IPython - without this line, in FF,\n // the notebook keyboard shortcuts fail.\n IPython.keyboard_manager.enable();\n fig.parent_element.innerHTML =\n '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n fig.close_ws(fig, msg);\n};\n\nmpl.figure.prototype.close_ws = function (fig, msg) {\n fig.send_message('closing', msg);\n // fig.ws.close()\n};\n\nmpl.figure.prototype.push_to_output = function (_remove_interactive) {\n // Turn the data on the canvas into data in the output cell.\n var width = this.canvas.width / this.ratio;\n var dataURL = this.canvas.toDataURL();\n this.cell_info[1]['text/html'] =\n '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n};\n\nmpl.figure.prototype.updated_canvas_event = function () {\n // Tell IPython that the notebook contents must change.\n IPython.notebook.set_dirty(true);\n this.send_message('ack', {});\n var fig = this;\n // Wait a second, then push the new image to the DOM so\n // that it is saved nicely (might be nice to debounce this).\n setTimeout(function () {\n fig.push_to_output();\n }, 1000);\n};\n\nmpl.figure.prototype._init_toolbar = function () {\n var fig = this;\n\n var toolbar = document.createElement('div');\n toolbar.classList = 'btn-toolbar';\n this.root.appendChild(toolbar);\n\n function on_click_closure(name) {\n return function (_event) {\n return fig.toolbar_button_onclick(name);\n };\n }\n\n function on_mouseover_closure(tooltip) {\n return function (event) {\n if (!event.currentTarget.disabled) {\n return fig.toolbar_button_onmouseover(tooltip);\n }\n };\n }\n\n fig.buttons = {};\n var buttonGroup = document.createElement('div');\n buttonGroup.classList = 'btn-group';\n var button;\n for (var toolbar_ind in mpl.toolbar_items) {\n var name = mpl.toolbar_items[toolbar_ind][0];\n var tooltip = mpl.toolbar_items[toolbar_ind][1];\n var image = mpl.toolbar_items[toolbar_ind][2];\n var method_name = mpl.toolbar_items[toolbar_ind][3];\n\n if (!name) {\n /* Instead of a spacer, we start a new button group. */\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n buttonGroup = document.createElement('div');\n buttonGroup.classList = 'btn-group';\n continue;\n }\n\n button = fig.buttons[name] = document.createElement('button');\n button.classList = 'btn btn-default';\n button.href = '#';\n button.title = name;\n button.innerHTML = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n // Add the status bar.\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message pull-right';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n\n // Add the close button to the window.\n var buttongrp = document.createElement('div');\n buttongrp.classList = 'btn-group inline pull-right';\n button = document.createElement('button');\n button.classList = 'btn btn-mini btn-primary';\n button.href = '#';\n button.title = 'Stop Interaction';\n button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n button.addEventListener('click', function (_evt) {\n fig.handle_close(fig, {});\n });\n button.addEventListener(\n 'mouseover',\n on_mouseover_closure('Stop Interaction')\n );\n buttongrp.appendChild(button);\n var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n titlebar.insertBefore(buttongrp, titlebar.firstChild);\n};\n\nmpl.figure.prototype._remove_fig_handler = function (event) {\n var fig = event.data.fig;\n fig.close_ws(fig, {});\n};\n\nmpl.figure.prototype._root_extra_style = function (el) {\n el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n};\n\nmpl.figure.prototype._canvas_extra_style = function (el) {\n // this is important to make the div 'focusable\n el.setAttribute('tabindex', 0);\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n } else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n};\n\nmpl.figure.prototype._key_event_extra = function (event, _name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager) {\n manager = IPython.keyboard_manager;\n }\n\n // Check for shift+enter\n if (event.shiftKey && event.which === 13) {\n this.canvas_div.blur();\n // select the cell after this one\n var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n IPython.notebook.select(index + 1);\n }\n};\n\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n fig.ondownload(fig, null);\n};\n\nmpl.find_output_cell = function (html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i = 0; i < ncells; i++) {\n var cell = cells[i];\n if (cell.cell_type === 'code') {\n for (var j = 0; j < cell.output_area.outputs.length; j++) {\n var data = cell.output_area.outputs[j];\n if (data.data) {\n // IPython >= 3 moved mimebundle to data attribute of output\n data = data.data;\n }\n if (data['text/html'] === html_output) {\n return [cell, data, j];\n }\n }\n }\n }\n};\n\n// Register the function which deals with the matplotlib target/channel.\n// The kernel may be null if the page has been refreshed.\nif (IPython.notebook.kernel !== null) {\n IPython.notebook.kernel.comm_manager.register_target(\n 'matplotlib',\n mpl.mpl_figure_comm\n );\n}\n"
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": "<IPython.core.display.HTML object>",
"text/html": "<img src=\"data:,\" width=\"0\">"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "",
"execution_count": null,
"outputs": []
}
],
"metadata": {
"_draft": {
"nbviewer_url": "https://gist.github.com/f3fb2eacd5618bac4696cbd47e755df0"
},
"gist": {
"id": "f3fb2eacd5618bac4696cbd47e755df0",
"data": {
"description": "IK_Backward_Shift.ipynb",
"public": true
}
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3",
"language": "python"
},
"language_info": {
"name": "python",
"version": "3.8.5",
"mimetype": "text/x-python",
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"pygments_lexer": "ipython3",
"nbconvert_exporter": "python",
"file_extension": ".py"
},
"nteract": {
"version": "0.28.0"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment