123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333 |
- o2.widget = o2.widget || {};
- o2.widget.MWFRaphael = MWFRaphael = {
- load: function(callback){
- if (window.Raphael){
- if (callback) callback();
- }else{
- if(!window.Raphael && typeof require === 'function' && define.amd){
- require(["../o2_lib/raphael/raphael.js"], function(r){
- window.Raphael = r;
- this.expandRaphael();
- if (callback) callback();
- }.bind(this));
- }else{
- COMMON.AjaxModule.load("raphael", function(){
- this.expandRaphael();
- if (callback) callback();
- }.bind(this), true, true);
- }
- }
- },
- expandRaphael: function(){
- Raphael.fn.diamond = function(x, y, width, height, r1, r2){
- return MWFRaphael.diamond.call(this, x, y, width, height, r1, r2);
- };
- Raphael.fn.rectPath = function(x, y, width, height, r){
- return MWFRaphael.rectPath.call(this, x, y, width, height, r);
- };
- Raphael.fn.circlePath = function(x, y, r){
- return MWFRaphael.circlePath.call(this, x, y, r);
- };
- Raphael.fn.arrow = function(beginPoint, endPoint, l1, l2, aj){
- return MWFRaphael.arrow.call(this, beginPoint, endPoint, l1, l2, aj);
- };
- },
- rectPath: function(x, y, width, height, r){
- var path = MWFRaphael.getRectPath(x, y, width, height, r);
- return this.path(path);
- },
- getRectPath: function(x, y, width, height, r){
- x = x.toFloat();
- y = y.toFloat();
- width = width.toFloat();
- height = height.toFloat();
- r = r.toFloat();
-
-
- var beginPoint = {
- x: x+width-r,
- y: y+height-r
- };
- var arc_t_h = height-r-r;
- var arc_t_w = width-r-r;
-
- //先得到圆角path------------------------------------------------------
- // |
- //---------- 这个位置的圆角
- // | *
- var arcPath1 = Raphael.parsePathString(MWFRaphael.getArcPath(beginPoint.x, beginPoint.y, r));
-
- var r_c_p_x = beginPoint.x;
- var r_c_p_y = beginPoint.y;
-
- // | *
- //---------- 这个位置的圆角
- // |
- var arcPath2 = Raphael.transformPath(arcPath1, "r-90,"+r_c_p_x+","+r_c_p_y+"T0,-"+arc_t_h);
- //var arcPath2 = Raphael.transformPath(arcPath1, "r-90,"+r_c_p_x+","+r_c_p_y);
-
-
- // * |
- //---------- 这个位置的圆角
- // |
- r_c_p_y = r_c_p_y - arc_t_h;
- var arcPath3 = Raphael.transformPath(arcPath2, "r-90,"+r_c_p_x+","+r_c_p_y+"T-"+arc_t_w+",0");
-
- // |
- //---------- 这个位置的圆角
- // * |
- r_c_p_x = r_c_p_x - arc_t_w;
- var arcPath4 = Raphael.transformPath(arcPath3, "r-90,"+r_c_p_x+","+r_c_p_y+"T0,"+arc_t_h);
- //先得到圆角path------------------------------------------------------
-
- //得到四个边的path----------------------------------------------------
- // | |
- //----------|---- 右边
- // | |
- var h_l_f_x = x+width;
- var h_l_f_y = y+height-r;
- var h_l_t_x = x+width;
- var h_l_t_y = y+r;
- var hLine1 = Raphael.parsePathString("M"+h_l_f_x+","+h_l_f_y+"L"+h_l_t_x+","+h_l_t_y);
-
- // ————|————
- //-------------- 上边
- // |
- var w_l_f_x = x+width-r;
- var w_l_f_y = y;
- var w_l_t_x = x+r;
- var w_l_t_y = y;
- var wLine1 = Raphael.parsePathString("M"+w_l_f_x+","+w_l_f_y+"L"+w_l_t_x+","+w_l_t_y);
-
- // | |
- //--|----------- 左边
- // | |
- var hLine2 = Raphael.transformPath(hLine1, "t-"+width+",0"+"R180");
-
- // |
- //-------------- 下边
- // ————|————
- var wLine2 = Raphael.transformPath(wLine1, "t0,"+height+"R180");
- //得到四个边的path----------------------------------------------------
-
- //return ""+arcPath1+hLine1+arcPath2+wLine1+arcPath3+hLine2+arcPath4+wLine2+"Z";
-
- //return ""+arcPath1+hLine1+arcPath2+wLine1+arcPath3+hLine2+arcPath4+wLine2+"Z";
- return ""+arcPath1+hLine1[1]+arcPath2[1]+wLine1[1]+arcPath3[1]+hLine2[1]+arcPath4[1]+wLine2[1]+"Z";
- },
- circlePath: function(x, y, r){
- var path = MWFRaphael.getCirclePath(x, y, r);
- return this.path(path);
- },
- getArcPath: function(x, y, r){
- x = x.toFloat();
- y = y.toFloat();
- r = r.toFloat();
- var x0 = x;
- var y0 = y+r;
-
- var x1;
- var y1 = y0;
-
- var x2 = x+r;
- var y2;
-
- var x3 = x+r;
- var y3 = y;
-
- //三次贝塞尔曲线公式
- //B(t)=P0(1-t)*(1-t)*(1-t)+3P1t(1-t)*(1-t)+3P2t*t(1-t)+P3t*t*t; t属于[0,1]
- //假设t=0.5
- var b = Math.sqrt((r*r)/2);
- var Bx = x0+b;
- var By = y3+b;
- x1 = (Bx-0.125*x0-0.375*x2-0.125*x3)/0.375;
- y2 = (By-0.125*y0-0.375*y1-0.125*y3)/0.375;
-
- return "M"+x0+","+y0+"C"+x1+","+y1+" "+x2+","+y2+" "+x3+","+y3;
- },
- getCirclePath: function(x, y, r){
- var path1 = MWFRaphael.getArcPath(x, y, r);
- var path2 = Raphael.transformPath(path1, "R-90,"+x+","+y);
- var path3 = Raphael.transformPath(path2, "R-90,"+x+","+y);
- var path4 = Raphael.transformPath(path3, "R-90,"+x+","+y);
- var path = path1+path2[1]+path3[1]+path4[1]+"z";
- return path;
- },
- diamond: function(x, y, width, height, r1, r2){
- var path = MWFRaphael.getDiamondPath(x, y, width, height, r1, r2);
- return this.path(path);
- },
- getDiamondPath: function(x, y, width, height, r1, r2){
- var leftPoint = {
- "x": x,
- "y": y+height/2
- };
- var topPoint = {
- "x": x+width/2,
- "y": y
- };
- var rightPoint = {
- "x": x+width,
- "y": y+height/2
- };
- var bottomPoint = {
- "x": x+width/2,
- "y": y+height
- };
- var leftRightMinus = MWFRaphael.getMinus(width/2, height/2, r1);
- var topBottomMinus = MWFRaphael.getMinus(width/2, height/2, r2);
-
- var line1StartPoint = {
- "x": leftPoint.x+(leftRightMinus.x),
- "y": leftPoint.y+(leftRightMinus.y)
- };
- var line1Point = {
- "x": bottomPoint.x-(topBottomMinus.x),
- "y": bottomPoint.y-(topBottomMinus.y)
- };
- var line2StartPoint = {
- "x": bottomPoint.x+(topBottomMinus.x),
- "y": bottomPoint.y-(topBottomMinus.y)
- };
- var line2Point = {
- "x": rightPoint.x-(leftRightMinus.x),
- "y": rightPoint.y+(leftRightMinus.y)
- };
- var line3StartPoint = {
- "x": rightPoint.x-(leftRightMinus.x),
- "y": rightPoint.y-(leftRightMinus.y)
- };
- var line3Point = {
- "x": topPoint.x+(topBottomMinus.x),
- "y": topPoint.y+(topBottomMinus.y)
- };
- var line4StartPoint = {
- "x": topPoint.x-(topBottomMinus.x),
- "y": topPoint.y+(topBottomMinus.y)
- };
- var line4Point = {
- "x": leftPoint.x+(leftRightMinus.x),
- "y": leftPoint.y-(leftRightMinus.y)
- };
- path = "M"+line4Point.x+","+line4Point.y;
- path += "Q"+leftPoint.x+","+leftPoint.y+","+line1StartPoint.x+","+line1StartPoint.y;
- path += "L"+line1Point.x+","+line1Point.y;
- path += "Q"+bottomPoint.x+","+bottomPoint.y+","+line2StartPoint.x+","+line2StartPoint.y;
- path += "L"+line2Point.x+","+line2Point.y;
- path += "Q"+rightPoint.x+","+rightPoint.y+","+line3StartPoint.x+","+line3StartPoint.y;
- path += "L"+line3Point.x+","+line3Point.y;
- path += "Q"+topPoint.x+","+topPoint.y+","+line4StartPoint.x+","+line4StartPoint.y;
- path += "Z";
-
- return path;
- },
- getMinus: function(w,h,r){
- var c = Math.sqrt(w*w + h*h);
- var angle = h/(c/90);
- var y = (r/90)*angle;
- var x = Math.sqrt(r*r-y*y);
- return {x:x, y:y};
- },
- getPointDistance: function(a,b){
- var tmp1 = Math.abs(a.x-b.x);
- var tmp2 = Math.abs(a.y-b.y);
-
- return Math.sqrt((tmp1*tmp1)+(tmp2*tmp2));
- },
- getAngles: function(a,b,c){
- var cosA=(b*b+c*c-a*a)/(2*b*c);
- var cosB=(a*a+c*c-b*b)/(2*a*c);
- var cosC=(a*a+b*b-c*c)/(2*a*b);
- var A = Math.acos(cosA);
- var B = Math.acos(cosB);
- var C = Math.acos(cosC);
- return {A:A, B:B, C:C};
- },
- getMinDistance: function(p1, p2, p3){
- var lineA = this.getPointDistance(p1,p2);
- var lineB = this.getPointDistance(p1,p3);
- var lineC = this.getPointDistance(p2,p3);
-
- var angle = this.getAngles(lineA,lineB,lineC);
- var angleA = angle.A;
- var angleB = angle.B;
- var angleC = angle.C;
-
- var h = lineA*Math.sin(angleB);
-
- var pointLineC = Math.sqrt(lineA*lineA-h*h);
-
- var x = p3.x-p2.x;
- var y = p3.y-p2.y;
- var sinY = y*(1/lineC);
- var offy = sinY*pointLineC;
- var sinX = x*(1/lineC);
- var offx = sinX*pointLineC;
- // var offx = Math.sqrt(pointLineC*pointLineC-offy*offy);
- return {"h": h, "p": {"x": p2.x+offx, "y": p2.y+offy}};
- },
- arrow: function(beginPoint, endPoint, l1, l2, aj){
- var path = MWFRaphael.getArrowPath(beginPoint, endPoint, l1, l2, aj);
- return this.path(path);
- },
- getArrowPath: function(beginPoint, endPoint, l1, l2, aj){
- var endX = endPoint.x;
- var endY = endPoint.y;
- var beginX = beginPoint.x;
- var beginY = beginPoint.y;
- // var l1 = l1;
- // var l2 = l2;
- // var aj = aj;
-
- var p1 = endX - beginX;
- var p2 = endY - beginY;
- if (p1==0 && p2==0){
- return "";
- }
-
- var y = (p2/Math.sqrt((p1*p1)+(p2*p2)))*l1;
- var x = (p1/Math.sqrt((p1*p1)+(p2*p2)))*l1;
-
- var ag = (Math.asin(p2/Math.sqrt((p1*p1)+(p2*p2)))/Math.PI)*180;
- var ag1 = (Math.asin(p1/Math.sqrt((p1*p1)+(p2*p2)))/Math.PI)*180;
- if ((p1<=0) & (p2<=0)) {
- var x1 = Math.sin((270-(ag-aj))*(Math.PI/180))*l2;
- var y1 = Math.sin((ag-aj)*(Math.PI/180))*l2;
- var y2 = Math.sin((270-(ag1-aj))*(Math.PI/180))*l2;
- var x2 = Math.sin((ag1-aj)*(Math.PI/180))*l2;
- }else if((p1>0) & (p2<0)){
- var x1 = Math.sin((90-(ag+aj))*(Math.PI/180))*l2;
- var y1 = Math.sin((ag+aj)*(Math.PI/180))*l2;
- var y2 = Math.sin((ag-aj)*(Math.PI/180))*l2;
- var x2 = Math.sin((ag1-aj)*(Math.PI/180))*l2;
- }else if((p1<0) & (p2>0)){
- var x1 = Math.sin(((ag1+aj))*(Math.PI/180))*l2;
- var y1 = Math.sin((ag+aj)*(Math.PI/180))*l2;
- var y2 = Math.sin((90-(ag1-aj))*(Math.PI/180))*l2;
- var x2 = Math.sin((ag1-aj)*(Math.PI/180))*l2;
- }else{
- var x1 = Math.sin((90-(ag-aj))*(Math.PI/180))*l2;
- var y1 = Math.sin((ag-aj)*(Math.PI/180))*l2;
- var y2 = Math.sin((90-(ag1-aj))*(Math.PI/180))*l2;
- var x2 = Math.sin((ag1-aj)*(Math.PI/180))*l2;
- }
-
- x = (p1-x) + beginX;
- y = (p2-y) + beginY;
- x1 = (p1-x1) + beginX;
- y1 = (p2-y1) + beginY;
- x2 = (p1-x2) + beginX;
- y2 = (p2-y2) + beginY;
-
- return "M"+x+","+y+"L"+x1+","+y1+"L"+endX+","+endY+"L"+x2+","+y2+"Z";
- }
- };
|