<html> <head> <script src="../../static/jquery.min.js" type="text/javascript"></script> <link href="../../static/bootstrap/css/bootstrap.css" rel="stylesheet" type="text/css"> <link href="../../static/bootstrap/css/bootstrap-responsive.css" rel="stylesheet" type="text/css"> <link href="../../static/shoofle.css" rel="stylesheet" type="text/css"> </head> <body> <style type="text/css"> svg circle, svg path { fill: none; } svg .glyph { stroke: #600; fill: none; } svg .vowel { stroke: #044; } svg .radical { stroke: #004; } svg circle.radical { fill: black; } svg circle { stroke: #044; } .highlit { fill: red; } .veryhighlit { fill: green; } .clicked { fill: darkgreen; } svg .enclosure { stroke: #000; } </style> <div class="row-fluid"> <div class="span6 offset3"> <svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100%" height="400px" preserveAspectRatio="xMidYMax" id="arena" viewBox="-105 -105 210 210"> <defs> <path id="mound" d="M-10,0 H-8 A9,8 0,0,1 8,0 H10" class="glyph"></path> <g id="mound2"> <path d="M-10,0 H-8 A9,8 0 0,1 8,0 H10" class="glyph"></path> <path d="M-6,0 A7,6 0,0,1 6,0" class="glyph"></path> </g> <path id="omega" d="M-10,0 H-4 A7,7 0,1,1 4,0 H10" class="glyph"></path> <g id="omega2"> <path d="M-10,0 H-4 A7,7 0,1,1 4,0 H10" class="glyph"></path> <path d="M-1,-1 A4.5,4.5 0,1,1 1,-1" class="glyph"></path> </g> <path id="angle" d="M-10,0 H-6 L0,-8 L6,0 H10" class="glyph"></path> <g id="angle2"> <path d="M-10,0 H-6 L0,-8 L6,0 H10" class="glyph"></path> <path d="M-4,0 L0,-5.3333 L4,0" class="glyph"></path> </g> <path id="chalice" d="M-10,0 H-6 A15,15 0,0,1 -10,-6 A15,10 0,0,0 10,-6 A15,15 0,0,1 6,0 H10" class="glyph"></path> <g id="chalice2"> <path d="M-10,0 H-6 A15,15 0,0,1 -10,-6 A15,10 0,0,0 10,-6 A15,15 0,0,1 6,0 H10" class="glyph"></path> <path d="M-8.5,-3 A 14,9 0,0,0 8.5,-3" class="glyph"></path> </g> <path id="loop" d="M-10,0 H-8 C6,0 6,-10 0,-10 C-6,-10 -6,0 6,0 H10" class="glyph"></path> <g id="loop2"> <path d="M-10,0 H-8 C6,0 6,-10 0,-10 C-6,-10 -6,0 6,0 H10" class="glyph"></path> <circle r="2" cx="0" cy="-6" class="glyph"></circle> </g> <path id="weird_up" d="M -4,-4 A 4,6 0,0,0 0,-8 A 4,6 0,0,0 4,-4" class="vowel"></path> <path id="weird_down" d="M -4,-8 A 4,6 0,0,0 0,-4 A 4,6 0,0,0 4,-8" class="vowel"></path> </defs> </svg> </div> </div> <hr> <input type="text" value="shoof~l ihs ~ bihg dohrk" /> <h3>Available Sounds:</h3> <p id="sounds_list"></p> <script type="text/javascript"> function ns_elem () { if (typeof arguments[0] === "undefined") { console.log('There was an error in the element assist function. Called with no valid tag name!');} var elem; if (typeof arguments[1] === "string") { elem = document.createElementNS(arguments[1], arguments[0]); for (var i=2; i<arguments.length; i+=2) { if (typeof arguments[i+1] === "undefined") { for (var key in arguments[i]) { elem.setAttribute(key, arguments[i][key]); } break; } else { for (var key in arguments[i]) { elem.setAttributeNS(arguments[i+1], key, arguments[i][key]); } } } } else { elem = document.createElement(arguments[0]); for (var i=1; i<arguments.length; i+=2) { if (typeof arguments[i+1] === "undefined") { for (var key in arguments[i]) { elem.setAttribute(key, arguments[i][key]); } break; } else { for (var key in arguments[i]) { elem.setAttributeNS(arguments[i+1], key, arguments[i][key]); } } } } return elem;} function svg_from_dom(point, svg) { const pt = svg.createSVGPoint(); pt.x = point.x; pt.y = point.y; return pt.matrixTransform(svg.getScreenCTM().inverse()); } function point_from_circle(circle) { return {x:parseFloat(circle.attr('cx')), y:parseFloat(circle.attr('cy'))}; } </script> <script type="text/javascript"> var svg_ns = "http://www.w3.org/2000/svg"; var xlink_ns = "http://www.w3.org/1999/xlink"; var svg; var current_selection = null; $(document).ready(function() { svg = $('svg')[0]; }); function norm (vector) { var norm = Math.sqrt(vector.x*vector.x + vector.y*vector.y); return {x: vector.x / norm, y: vector.y / norm}; } function len (vector) { return Math.sqrt(vector.x*vector.x + vector.y*vector.y); } function sub (a, b) { return {x: a.x-b.x, y: a.y-b.y}; } function add (a, b) { return {x: a.x+b.x, y: a.y+b.y}; } function mul (a, b) { if ("x" in a) { return {x: a.x*b, y: a.y*b}; } return a*b; } const selection_thresh = 10; const major_radius = 60; var angles = [0, 1.5, 4]; var points = $.map(angles, function(elem, index) { return {x:major_radius * Math.cos(elem), y:major_radius * Math.sin(elem)}; }); console.log('points!', points); const circles = $.map(points, function(point, index) { return $(ns_elem('circle', svg_ns)).attr('cx', point.x).attr('cy', point.y).attr('r', 10); }); $(document).ready(function() { $.each(circles, function(idx, circ) { $(svg).append(circ); }) }); function highlight_nearest(mouse) { var testmag = 900000000; var closest_idx = 0; $.each(circles, function(idx, circ) { const mag = len(sub(point_from_circle(circ), mouse)); if (mag < testmag) { testmag = mag; closest_idx = idx; } }); $.each(circles, function(idx, circle) { $(circle).removeClass('highlit').removeClass('veryhighlit'); }); current_selection = null; if (testmag < selection_thresh) { $(circles[closest_idx]).attr('class', 'veryhighlit'); current_selection = circles[closest_idx]; } else { $(circles[closest_idx]).attr('class', 'highlit'); } } $(document).mousemove(function(event) { const mouse_position = {x:event.clientX, y:event.clientY}; var s_position = svg_from_dom(mouse_position, svg); // get the position inside the svg tag for the mouse highlight_nearest(s_position); }); $(document).on('mousedown', function(event) { if (current_selection) { $(current_selection).attr('class', 'clicked'); } }); $(document).on('dragstop', function(event) { }); </script> </body> </html>