From e5d45a4572da9ff0b6f08cf8f2330538cfecb821 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 8 Sep 2014 10:58:33 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0line=20cross?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ticBezier.html => bezierSegmentCross.html} | 11 +- demo/glyfcanvas.html | 4 +- demo/glyfsvg.html | 4 +- demo/js/bezierSegmentCross.js | 103 +++++++++++++ demo/js/quadraticBezier.js | 13 -- demo/js/segmentCross.js | 99 +++++++++++++ demo/lib/esl.js | 1 + demo/lib/jquery.min.js | 3 + demo/math.html | 4 +- demo/quadraticBezierCross.html | 5 +- demo/render.html | 4 +- demo/segmentCross.html | 45 ++++++ demo/ttfparse.html | 9 +- src/graphics/isBezierCross.js | 44 +----- src/graphics/isBezierLineCross.js | 58 +++++++- src/graphics/isBezierSegmentCross.js | 32 ++++- src/graphics/isBoundingBoxCross.js | 35 ++--- src/graphics/isBoundingBoxSegmentCross.js | 28 ++++ src/graphics/isSegmentCross.js | 135 +++++++++++++++++- src/graphics/matrix.js | 59 ++++++++ src/graphics/util.js | 43 ++++++ 21 files changed, 631 insertions(+), 108 deletions(-) rename demo/{quadraticBezier.html => bezierSegmentCross.html} (76%) create mode 100644 demo/js/bezierSegmentCross.js create mode 100644 demo/js/segmentCross.js create mode 100644 demo/lib/esl.js create mode 100644 demo/lib/jquery.min.js create mode 100644 demo/segmentCross.html create mode 100644 src/graphics/isBoundingBoxSegmentCross.js create mode 100644 src/graphics/matrix.js create mode 100644 src/graphics/util.js diff --git a/demo/quadraticBezier.html b/demo/bezierSegmentCross.html similarity index 76% rename from demo/quadraticBezier.html rename to demo/bezierSegmentCross.html index 1bf3f89..b291f9d 100644 --- a/demo/quadraticBezier.html +++ b/demo/bezierSegmentCross.html @@ -3,8 +3,8 @@ 二次贝塞尔曲线绘制 - - + + diff --git a/demo/glyfsvg.html b/demo/glyfsvg.html index af85d06..76af6f0 100644 --- a/demo/glyfsvg.html +++ b/demo/glyfsvg.html @@ -3,8 +3,8 @@ glyf查看 - - + + diff --git a/demo/js/bezierSegmentCross.js b/demo/js/bezierSegmentCross.js new file mode 100644 index 0000000..4d5a13a --- /dev/null +++ b/demo/js/bezierSegmentCross.js @@ -0,0 +1,103 @@ +/** + * @file quadraticBezier.js + * @author mengke01 + * @date + * @description + * 二次贝塞尔直线相交演示 + */ + +define( + function(require) { + + var isBezierSegmentCross = require('graphics/isBezierSegmentCross'); + + var entry = { + + /** + * 初始化 + */ + init: function() { + var canvas = $('#canvas').get(0); + var ctx = canvas.getContext('2d'); + var width = canvas.offsetWidth; + var height = canvas.offsetHeight; + + var points = [ + {"x":163,"y":136}, + {"x":45,"y":54}, + {"x":124,"y":177}, + {"x":222,"y":122}, + {"x":57,"y":122} + ]; + + $('[data-index]').each(function(index, item) { + $(item).css({ + left: points[index].x, + top: points[index].y + }) + }); + + var point; + + $('.point').on('mousedown', function(e) { + point = $(this); + }); + + $(document.body).on('mousemove', onMove); + $(document.body).on('mouseup', function(e) { + onMove.call(this, e); + point = null; + }); + + function onMove(e) { + var px = e.pageX; + var py = e.pageY; + if(point) { + point.css({ + left: px, + top: py + }); + var p = points[+point.attr('data-index')]; + p.x = px; + p.y = py; + draw(); + } + } + + function draw() { + + + ctx.clearRect(0, 0, width, height); + //绘制2次贝塞尔曲线 + ctx.beginPath(); + ctx.strokeStyle='black'; + ctx.moveTo(points[0].x, points[0].y); + ctx.quadraticCurveTo(points[1].x, points[1].y, points[2].x, points[2].y); + ctx.moveTo(points[3].x, points[3].y); + ctx.lineTo(points[4].x, points[4].y); + ctx.lineWidth = 1; + ctx.stroke(); + //console.time('bezier'); + var r = isBezierSegmentCross(points[0], points[1], points[2], points[3], points[4]); + //console.timeEnd('bezier'); + console.log(r.length); + + if(r) { + ctx.beginPath(); + r.forEach(function(item) { + ctx.moveTo(item.x, item.y); + ctx.arc(item.x, item.y, 4, 0, Math.PI * 2, true); + }); + ctx.fill(); + } + } + + draw(); + } + }; + + entry.init(); + + return entry; + } +); \ No newline at end of file diff --git a/demo/js/quadraticBezier.js b/demo/js/quadraticBezier.js index e0b5fac..aedad20 100644 --- a/demo/js/quadraticBezier.js +++ b/demo/js/quadraticBezier.js @@ -24,19 +24,6 @@ define( var width = canvas.offsetWidth; var height = canvas.offsetHeight; - // var points = []; - // [0, 1, 2, 3].forEach(function(i) { - // var p = { - // x: Math.floor(Math.random() * (width - 100) + 50), - // y: Math.floor(Math.random() * (height - 100) + 50) - // } - // points[i] = p; - // $($('.point').get(i)).css({ - // left: p.x, - // top: p.y - // }); - // }); - var points = [ { x: 130, diff --git a/demo/js/segmentCross.js b/demo/js/segmentCross.js new file mode 100644 index 0000000..232d94e --- /dev/null +++ b/demo/js/segmentCross.js @@ -0,0 +1,99 @@ +/** + * @file quadraticBezier.js + * @author mengke01 + * @date + * @description + * 二次贝塞尔直线相交演示 + */ + +define( + function(require) { + + var isSegmentCross = require('graphics/isSegmentCross'); + + var entry = { + + /** + * 初始化 + */ + init: function() { + var canvas = $('#canvas').get(0); + var ctx = canvas.getContext('2d'); + var width = canvas.offsetWidth; + var height = canvas.offsetHeight; + + var points = [{"x":50,"y":200},{"x":97,"y":98},{"x":58,"y":94},{"x":105,"y":201}]; + + $('[data-index]').each(function(index, item) { + $(item).css({ + left: points[index].x, + top: points[index].y + }) + }); + + var point; + + $('.point').on('mousedown', function(e) { + point = $(this); + }); + + $(document.body).on('mousemove', onMove); + $(document.body).on('mouseup', function(e) { + onMove.call(this, e); + point = null; + }); + + function onMove(e) { + var px = e.pageX; + var py = e.pageY; + if(point) { + point.css({ + left: px, + top: py + }); + var p = points[+point.attr('data-index')]; + p.x = px; + p.y = py; + draw(); + } + } + + function draw() { + + + ctx.clearRect(0, 0, width, height); + //绘制2次贝塞尔曲线 + ctx.beginPath(); + ctx.strokeStyle='black'; + ctx.moveTo(points[0].x, points[0].y); + ctx.lineTo(points[1].x, points[1].y); + + ctx.moveTo(points[2].x, points[2].y); + ctx.lineTo(points[3].x, points[3].y); + + ctx.lineWidth = 1; + ctx.stroke(); + //console.time('bezier'); + var r = isSegmentCross(points[0], points[1], points[2], points[3]); + //console.timeEnd('bezier'); + console.log(r); + + if(r) { + ctx.beginPath(); + r.forEach(function(item) { + ctx.moveTo(item.x, item.y); + ctx.arc(item.x, item.y, 4, 0, Math.PI * 2, true); + }); + ctx.fill(); + } + } + + draw(); + } + }; + + entry.init(); + + return entry; + } +); \ No newline at end of file diff --git a/demo/lib/esl.js b/demo/lib/esl.js new file mode 100644 index 0000000..36e7042 --- /dev/null +++ b/demo/lib/esl.js @@ -0,0 +1 @@ +var define,require;!function(n){function e(n,e){function r(n){0===n.indexOf(".")&&i.push(n)}var i=[];if("string"==typeof n?r(n):$(n,function(n){r(n)}),i.length>0)throw new Error("[REQUIRE_FATAL]Relative ID is not allowed in global require: "+i.join(", "));var o=K.waitSeconds;return o&&n instanceof Array&&(j&&clearTimeout(j),j=setTimeout(t,1e3*o)),P(n,e)}function t(){function n(a,u){if(!o[a]&&!s(a,N)){o[a]=1,s(a,L)||r[a]||(r[a]=1,e.push(a));var f=D[a];f?u&&(r[a]||(r[a]=1,e.push(a)),$(f.depMs,function(e){n(e.absId,e.hard)})):i[a]||(i[a]=1,t.push(a))}}var e=[],t=[],r={},i={},o={};for(var a in F)n(a,1);if(e.length||t.length)throw new Error("[MODULE_TIMEOUT]Hang( "+(e.join(", ")||"none")+" ) Miss( "+(t.join(", ")||"none")+" )")}function r(){var n=arguments.length;if(n){for(var e,t,r=arguments[--n];n--;){var i=arguments[n];"string"==typeof i?e=i:i instanceof Array&&(t=i)}var u=window.opera;if(!e&&document.attachEvent&&(!u||"[object Opera]"!==u.toString())){var f=S();e=f&&f.getAttribute("data-require-id")}e?(o(e,t,r),C&&clearTimeout(C),C=setTimeout(a,1)):G[0]={deps:t,factory:r}}}function i(){var n=K.config[this.id];return n&&"object"==typeof n?n:{}}function o(n,e,t){if(!D[n]){var r={id:n,depsDec:e,deps:e||["require","exports","module"],factoryDeps:[],factory:t,exports:{},config:i,state:_,require:w(n),depMs:[],depMkv:{},depRs:[],depPMs:[]};D[n]=r,z.push(r)}}function a(){function n(n){D[n]||t[n]||(e.push(n),t[n]=1)}var e=[],t={};$(z,function(e){if(!(e.state>_)){var t=e.deps,r=0,i=e.factory;"function"==typeof i&&(r=Math.min(i.length,t.length),!e.depsDec&&i.toString().replace(/(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/gm,"").replace(/require\(\s*(['"'])([^'"]+)\1\s*\)/g,function(n,e,r){t.push(r)})),$(t,function(t,i){var o,a,u=A(t),f=I(u.module,e.id);f&&!Q[f]?(u.resource&&(a={id:t,module:f,resource:u.resource},F[f]=1,e.depPMs.push(f),e.depRs.push(a)),o=e.depMkv[f],o||(o={id:u.module,absId:f,hard:r>i},e.depMs.push(o),e.depMkv[f]=o,n(f))):o={absId:f},r>i&&e.factoryDeps.push(a||o)}),e.state=B,c(e.id)}}),u(),m(e)}function u(){for(var n in F)f(n),l(n)}function f(n){function e(n){if(!s(n,B))return!1;if(s(n,L)||t[n])return!0;t[n]=1;var r=D[n],i=!0;return $(r.depMs,function(n){return i=e(n.absId)}),i&&$(r.depRs,function(n){return i=!(!n.absId||!s(n.absId,N))}),i&&(r.state=L),i}var t={};e(n)}function c(e){function t(){if(!r&&i.state===L){r=1;var t=1,o=[];if($(i.factoryDeps,function(n){var e=n.absId;return Q[e]||(l(e),s(e,N))?(o.push(e),void 0):(t=0,!1)}),t){try{var a=d(o,{require:i.require,exports:i.exports,module:i}),u=i.factory,f="function"==typeof u?u.apply(n,a):u;null!=f&&(i.exports=f),i.invokeFactory=null}catch(c){if(r=0,/^\[MODULE_MISS\]"([^"]+)/.test(c.message)){var p=i.depMkv[RegExp.$1];return p&&(p.hard=1),void 0}throw c}v(e)}}}var r,i=D[e];i.invokeFactory=t,$(i.depPMs,function(n){p(n,function(){$(i.depRs,function(t){t.absId||t.module!==n||(t.absId=I(t.id,e),m([t.absId],u))})})})}function s(n,e){return D[n]&&D[n].state>=e}function l(n){var e=D[n];e&&e.invokeFactory&&e.invokeFactory()}function d(n,e){var t=[];return $(n,function(n,r){t[r]=e[n]||g(n)}),t}function p(n,e){if(s(n,N))return e(),void 0;var t=H[n];t||(t=H[n]=[]),t.push(e)}function v(n){var e=H[n]||[],t=D[n];t.state=N;for(var r=e.length;r--;)e[r]();e.length=0,delete H[n]}function g(n){return s(n,N)?D[n].exports:null}function h(n){$(G,function(e){o(n,e.deps,e.factory)}),G.length=0,a()}function m(e,t,r,i){function o(){if(!a){var r=1;$(e,function(n){return Q[n]?void 0:r=!!s(n,N)}),r&&(a=1,"function"==typeof t&&t.apply(n,d(e,Q)))}}if("string"==typeof e){if(l(e),!s(e,N))throw new Error('[MODULE_MISS]"'+e+'" is not exists!');return g(e)}i=i||{};var a=0;e instanceof Array&&(u(),o(),a||$(e,function(n){Q[n]||s(n,N)||(p(n,o),i[n]||(n.indexOf("!")>0?b:y)(n,r))}))}function y(n){function e(){var e=t.readyState;("undefined"==typeof e||/^(loaded|complete)$/.test(e))&&(t.onload=t.onreadystatechange=null,t=null,h(n))}if(!J[n]&&!D[n]){J[n]=1;var t=document.createElement("script");t.setAttribute("data-require-id",n),t.src=E(n+".js"),t.async=!0,t.readyState?t.onreadystatechange=e:t.onload=e,U(t)}}function b(n,e){function t(e){a.exports=e||!0,v(n)}function r(r){var a=e?D[e].require:P;r.load(o.resource,a,t,i.call({id:n}))}if(!D[n]){var o=A(n),a={id:n,state:B};D[n]=a,t.fromText=function(n,e){F[n]=1,new Function(e)(),h(n)},r(g(o.module))}}function M(n,e){var t=R(n,1,e);return t.sort(O),t}function k(){K.baseUrl=K.baseUrl.replace(/\/$/,"")+"/",V=M(K.paths),X=M(K.map,1),$(X,function(n){n.v=M(n.v)}),W=[],$(K.packages,function(n){var e=n;"string"==typeof n&&(e={name:n.split("/")[0],location:n,main:"main"}),e.location=e.location||e.name,e.main=(e.main||"main").replace(/\.js$/i,""),e.reg=T(e.name),W.push(e)}),W.sort(O),Z=M(K.urlArgs),ne=M(K.noRequests),$(ne,function(n){var e=n.v,t={};n.v=t,e instanceof Array||(e=[e]),$(e,function(n){t[n]=1})})}function x(n,e,t){$(e,function(e){return e.reg.test(n)?(t(e.v,e.k,e),!1):void 0})}function E(n){function e(n){c||(f+=(f.indexOf("?")>0?"&":"?")+n,c=1)}var t=/(\.[a-z0-9]+)$/i,r=/(\?[^#]*)$/,i="",o=n,a="";r.test(n)&&(a=RegExp.$1,n=n.replace(r,"")),t.test(n)&&(i=RegExp.$1,o=n.replace(t,""));var u,f=o;x(o,V,function(n,e){f=f.replace(e,n),u=1}),u||x(o,W,function(n,e,t){f=f.replace(t.name,t.location)}),/^([a-z]{2,10}:\/)?\//i.test(f)||(f=K.baseUrl+f),f+=i+a;var c;return x(o,Z,function(n){e(n)}),Y&&e(Y),f}function w(n){function e(e,r){if("string"==typeof e)return t[e]||(t[e]=m(I(e,n))),t[e];if(e instanceof Array){var i=[],o=[],a=[];$(e,function(e,t){var r=A(e),u=I(r.module,n);o.push(u),F[u]=1,r.resource?(i.push(u),a[t]=null):a[t]=u});var u={};$(o,function(n){var e;x(n,ne,function(n){e=n}),e&&(e["*"]?u[n]=1:$(o,function(t){return e[t]?(u[n]=1,!1):void 0}))}),m(o,function(){$(a,function(t,r){null==t&&(a[r]=I(e[r],n))}),m(a,r,n)},n,u)}}var t={};return e.toUrl=function(e){return E(I(e,n))},e}function I(n,e){if(!n)return"";e=e||"";var t=A(n);if(!t)return n;var r=t.resource,i=q(t.module,e);if($(W,function(n){var e=n.name;return e===i?(i=e+"/"+n.main,!1):void 0}),x(e,X,function(n){x(i,n,function(n,e){i=i.replace(e,n)})}),r){var o=g(i);r=o.normalize?o.normalize(r,function(n){return I(n,e)}):I(r,e),i+="!"+r}return i}function q(n,e){if(0===n.indexOf(".")){var t=e.split("/"),r=n.split("/"),i=t.length-1,o=r.length,a=0,u=0;n:for(var f=0;o>f;f++){var c=r[f];switch(c){case"..":if(!(i>a))break n;a++,u++;break;case".":u++;break;default:break n}}return t.length=i-a,r=r.slice(u),t.concat(r).join("/")}return n}function A(n){var e=n.split("!");return/^[-_a-z0-9\.]+(\/[-_a-z0-9\.]+)*$/i.test(e[0])?{module:e[0],resource:e[1]}:null}function R(n,e,t){var r=[];for(var i in n)if(n.hasOwnProperty(i)){var o={k:i,v:n[i]};r.push(o),e&&(o.reg="*"===i&&t?/^/:T(i))}return r}function S(){if(ee)return ee;if(te&&"interactive"===te.readyState)return te;for(var n=document.getElementsByTagName("script"),e=n.length;e--;){var t=n[e];if("interactive"===t.readyState)return te=t,t}}function U(n){ee=n,ie?re.insertBefore(n,ie):re.appendChild(n),ee=null}function T(n){return new RegExp("^"+n+"(/|$)")}function $(n,e){if(n instanceof Array)for(var t=0,r=n.length;r>t&&e(n[t],t)!==!1;t++);}function O(n,e){var t=n.k||n.name,r=e.k||e.name;return"*"===r?-1:"*"===t?1:r.length-t.length}var j,D={},z=[],F={},_=1,B=2,L=3,N=4,P=w();e.toUrl=P.toUrl;var C;r.amd={};var H={},Q={require:e,exports:1,module:1},G=[],J={},K={baseUrl:"./",paths:{},config:{},map:{},packages:[],waitSeconds:0,noRequests:{},urlArgs:{}};e.config=function(n){function e(n){i.push(n)}for(var t in K){var r=n[t],i=K[t];if(r)if("urlArgs"===t&&"string"==typeof r)Y=r;else if("object"==typeof i)if(i instanceof Array)$(r,e);else for(var t in r)i[t]=r[t];else K[t]=r}k()},k();var V,W,X,Y,Z,ne,ee,te,re=document.getElementsByTagName("head")[0],ie=document.getElementsByTagName("base")[0];ie&&(re=ie.parentNode),n.define=r,n.require=e}(this); \ No newline at end of file diff --git a/demo/lib/jquery.min.js b/demo/lib/jquery.min.js new file mode 100644 index 0000000..141f7b0 --- /dev/null +++ b/demo/lib/jquery.min.js @@ -0,0 +1,3 @@ +/*! jQuery v1.9.0 | (c) 2005, 2012 jQuery Foundation, Inc. | jquery.org/license */(function(e,t){"use strict";function n(e){var t=e.length,n=st.type(e);return st.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}function r(e){var t=Tt[e]={};return st.each(e.match(lt)||[],function(e,n){t[n]=!0}),t}function i(e,n,r,i){if(st.acceptData(e)){var o,a,s=st.expando,u="string"==typeof n,l=e.nodeType,c=l?st.cache:e,f=l?e[s]:e[s]&&s;if(f&&c[f]&&(i||c[f].data)||!u||r!==t)return f||(l?e[s]=f=K.pop()||st.guid++:f=s),c[f]||(c[f]={},l||(c[f].toJSON=st.noop)),("object"==typeof n||"function"==typeof n)&&(i?c[f]=st.extend(c[f],n):c[f].data=st.extend(c[f].data,n)),o=c[f],i||(o.data||(o.data={}),o=o.data),r!==t&&(o[st.camelCase(n)]=r),u?(a=o[n],null==a&&(a=o[st.camelCase(n)])):a=o,a}}function o(e,t,n){if(st.acceptData(e)){var r,i,o,a=e.nodeType,u=a?st.cache:e,l=a?e[st.expando]:st.expando;if(u[l]){if(t&&(r=n?u[l]:u[l].data)){st.isArray(t)?t=t.concat(st.map(t,st.camelCase)):t in r?t=[t]:(t=st.camelCase(t),t=t in r?[t]:t.split(" "));for(i=0,o=t.length;o>i;i++)delete r[t[i]];if(!(n?s:st.isEmptyObject)(r))return}(n||(delete u[l].data,s(u[l])))&&(a?st.cleanData([e],!0):st.support.deleteExpando||u!=u.window?delete u[l]:u[l]=null)}}}function a(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(Nt,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:wt.test(r)?st.parseJSON(r):r}catch(o){}st.data(e,n,r)}else r=t}return r}function s(e){var t;for(t in e)if(("data"!==t||!st.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}function u(){return!0}function l(){return!1}function c(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}function f(e,t,n){if(t=t||0,st.isFunction(t))return st.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return st.grep(e,function(e){return e===t===n});if("string"==typeof t){var r=st.grep(e,function(e){return 1===e.nodeType});if(Wt.test(t))return st.filter(t,r,!n);t=st.filter(t,r)}return st.grep(e,function(e){return st.inArray(e,t)>=0===n})}function p(e){var t=zt.split("|"),n=e.createDocumentFragment();if(n.createElement)for(;t.length;)n.createElement(t.pop());return n}function d(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function h(e){var t=e.getAttributeNode("type");return e.type=(t&&t.specified)+"/"+e.type,e}function g(e){var t=nn.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function m(e,t){for(var n,r=0;null!=(n=e[r]);r++)st._data(n,"globalEval",!t||st._data(t[r],"globalEval"))}function y(e,t){if(1===t.nodeType&&st.hasData(e)){var n,r,i,o=st._data(e),a=st._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)st.event.add(t,n,s[n][r])}a.data&&(a.data=st.extend({},a.data))}}function v(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!st.support.noCloneEvent&&t[st.expando]){r=st._data(t);for(i in r.events)st.removeEvent(t,i,r.handle);t.removeAttribute(st.expando)}"script"===n&&t.text!==e.text?(h(t).text=e.text,g(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),st.support.html5Clone&&e.innerHTML&&!st.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Zt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}function b(e,n){var r,i,o=0,a=e.getElementsByTagName!==t?e.getElementsByTagName(n||"*"):e.querySelectorAll!==t?e.querySelectorAll(n||"*"):t;if(!a)for(a=[],r=e.childNodes||e;null!=(i=r[o]);o++)!n||st.nodeName(i,n)?a.push(i):st.merge(a,b(i,n));return n===t||n&&st.nodeName(e,n)?st.merge([e],a):a}function x(e){Zt.test(e.type)&&(e.defaultChecked=e.checked)}function T(e,t){if(t in e)return t;for(var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=Nn.length;i--;)if(t=Nn[i]+n,t in e)return t;return r}function w(e,t){return e=t||e,"none"===st.css(e,"display")||!st.contains(e.ownerDocument,e)}function N(e,t){for(var n,r=[],i=0,o=e.length;o>i;i++)n=e[i],n.style&&(r[i]=st._data(n,"olddisplay"),t?(r[i]||"none"!==n.style.display||(n.style.display=""),""===n.style.display&&w(n)&&(r[i]=st._data(n,"olddisplay",S(n.nodeName)))):r[i]||w(n)||st._data(n,"olddisplay",st.css(n,"display")));for(i=0;o>i;i++)n=e[i],n.style&&(t&&"none"!==n.style.display&&""!==n.style.display||(n.style.display=t?r[i]||"":"none"));return e}function C(e,t,n){var r=mn.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function k(e,t,n,r,i){for(var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;4>o;o+=2)"margin"===n&&(a+=st.css(e,n+wn[o],!0,i)),r?("content"===n&&(a-=st.css(e,"padding"+wn[o],!0,i)),"margin"!==n&&(a-=st.css(e,"border"+wn[o]+"Width",!0,i))):(a+=st.css(e,"padding"+wn[o],!0,i),"padding"!==n&&(a+=st.css(e,"border"+wn[o]+"Width",!0,i)));return a}function E(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=ln(e),a=st.support.boxSizing&&"border-box"===st.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=un(e,t,o),(0>i||null==i)&&(i=e.style[t]),yn.test(i))return i;r=a&&(st.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+k(e,t,n||(a?"border":"content"),r,o)+"px"}function S(e){var t=V,n=bn[e];return n||(n=A(e,t),"none"!==n&&n||(cn=(cn||st("