From bea4b076b5649c6bc591a6e18713e3809d0c55b7 Mon Sep 17 00:00:00 2001 From: itozyun Date: Wed, 8 May 2013 06:58:14 +0900 Subject: [PATCH] Client is version 0.5.56, working svg circle. --- app/assets/javascripts/peta-common.js | 101 +++++++++++++++++++++++++++++----- 1 file changed, 88 insertions(+), 13 deletions(-) diff --git a/app/assets/javascripts/peta-common.js b/app/assets/javascripts/peta-common.js index c2aaf79f..fee04910 100644 --- a/app/assets/javascripts/peta-common.js +++ b/app/assets/javascripts/peta-common.js @@ -1,6 +1,6 @@ /* * pettanR peta.common.js - * version 0.5.55 + * version 0.5.56 * * author: * itozyun @@ -371,11 +371,12 @@ pettanr.newBalloon = ( function(){ getPath : null, args : null, update : IS_VML === true ? - ( function( /* w, h [, angle, ,,, ] */ ){ + ( function( w, h, a /* w, h [, angle, ,,, ] */ ){ var w = arguments[ 0 ], h = arguments[ 1 ]; var path = this.getPath.apply( this.klass, arguments ); if( !path ) return false; + this.a = a; path = /* SVG2VML */ path; this.path.style.width = w + 'px'; this.path.style.height = h + 'px'; @@ -384,13 +385,14 @@ pettanr.newBalloon = ( function(){ // this.elm.style.marginTop = _tailY < 0 ? floor( ( 60 + _tailY) / 10 ) : 10; // this.elm.style.marginLeft = _tailX < 0 ? floor( ( 60 + _tailX) / 10 ) : 10; }) : - ( function( /* w, h [, angle, ,,, ] */ ){ + ( function( w, h, a /* w, h [, angle, ,,, ] */ ){ var w = arguments[ 0 ], h = arguments[ 1 ], d = this.getPath.apply( this.klass, arguments ); if( !d ) return false; - this.elm.width = w + PADDING_LEFT * 2; - this.elm.height = h + PADDING_TOP * 2; + this.a = a; + this.elm.setAttribute( 'width', w ); + this.elm.setAttribute( 'height', h ); this.path.setAttribute( 'd', d ); }), destroy : function(){ @@ -411,9 +413,10 @@ pettanr.newBalloon = ( function(){ klass : null, getPictureID : null, args : null, - update : function( /* w, h [, angle, ,,, ] */ ){ + update : function( w, h, a /* w, h [, angle, ,,, ] */ ){ var id = this.getPictureID.aplly( this.klass, arguments ); if( id !== 0 && !id ) return false; + this.a = a; this.elm.src = PICTURE_PATH + id + '.gif'; }, destroy : function(){ @@ -537,20 +540,22 @@ pettanr.newBalloon = ( function(){ if( !TEMPLETES[ name ] ){ TEMPLETES[ name ] = templete; TEMPLETES[ id ] = templete; + if( name in window ) templete.classname = name; }; }, create : function( idOrName, w, h, settings ){ var ret, + tmpl = TEMPLETES[ idOrName ], args = settings.split( ',' ), - i = args.length, - v; - if( Type.isString( idOrName ) === true && idOrName in window ){ - ret = new BalloonClass( window[ idOrName ] ); + l = args.length, + i = 0, v; + if( tmpl.classname ){ + ret = new BalloonClass( window[ tmpl.classname ] ); } else { - ret = new NonVectorBalloonClass( TEMPLETES[ idOrName ] ); + ret = new NonVectorBalloonClass( tmpl ); }; - for( ; i; ){ - v = args[ --i ]; + for( ; i < l; ++i ){ + v = args[ i ]; args[ i ] = parseInt( v ); }; args.unshift( h ); @@ -567,6 +572,76 @@ pettanr.newBalloon = ( function(){ } })(); + +/** + * Balloon + */ +var Circle = { + getPath : function( w, h, a ){ + var TAIL_WIDTH = 6, + TAIL_HEIGHT = 10, + PADDING_TOP = TAIL_HEIGHT, + PADDING_LEFT = TAIL_HEIGHT, + TARGET = TAIL_WIDTH * TAIL_WIDTH, + ACCURACY = 1, // 有効少数桁 ; + MATH = Math, + DEG_TO_RAD = MATH.PI / 180, + cos = MATH.cos, + sin = MATH.sin, + pow = MATH.pow, + round = MATH.round, + cround = function( v, r ){ + r = r || ACCURACY; + return round( v * pow( 10.0, r )) / pow( 10.0, r ); + }, + rx = ( w - PADDING_LEFT * 2 ) / 2, + ry = ( h - PADDING_TOP * 2 ) / 2, + _ = ',', + tailRad = a * DEG_TO_RAD, + tailX = rx + ( rx + TAIL_HEIGHT ) * sin( tailRad ), + tailY = ry - ( ry + TAIL_HEIGHT ) * cos( tailRad ), + tailDeg = 0, + d, startRad, endRad, + startX, startY, endX, endY, + _startX, _startY, _endX, _endY; + /* + * tailの太さをTAIL_WIDTHに一致させるため、角度を絞りつつ計算 + */ + for( var i = 45; i > 0.01; i /= 2 ){ + d = ( tailDeg + i ) / 2; + startRad = ( a + d ) * DEG_TO_RAD; + endRad = ( a - d ) * DEG_TO_RAD; + + _startX = rx + sin( startRad ) * rx; + _startY = ry - cos( startRad ) * ry; + _endX = rx + sin( endRad ) * rx; + _endY = ry - cos( endRad ) * ry; //円弧上のY位置=円中心Y+sin(角度×PI÷180)×円半径 + + if( pow( ( _startX - _endX ), 2 ) + pow( ( _startY - _endY ), 2 ) < TARGET ){ + tailDeg += i; + startX = _startX; + startY = _startY; + endX = _endX; + endY = _endY; + }; + }; + + return [ + 'M', cround( tailX + PADDING_LEFT ), _, cround( tailY + PADDING_TOP ), + 'L', cround( startX + PADDING_LEFT ), _, cround( startY + PADDING_TOP ), + 'A', rx, _, ry, + '0 1 1', // flag + cround( endX + PADDING_LEFT ), _, cround( endY + PADDING_TOP ), + 'z' + ].join( ' ' ); + }, + getPictureID : function( w, h, a ){ + + } +}; + + + /* ---------------------------------------- * pettanr.image * -- 2.11.0