⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vml.js

📁 寿星万年历 基于天文算法的万年历 javascript 年代范围大 精度高
💻 JS
📖 第 1 页 / 共 2 页
字号:
   ht_b.INSel(this.canvas,el);  //把el加入画布
   el.moveto(x,y);
   return el;
 },
 rect0:function(x,y,sx,sy,na){//创建(画)矩形,na为RoundRect时画圆角矩形
   var el=ht_b.Vel2(na);
   el.setqb(this.qb);   //设置el的铅笔
   if(sx<0) x+=sx,sx=-sx; if(sy<0) y+=sy,sy=-sy; //检查参数
   el.moveto(x,y); el.resize(sx,sy);//设置矩形位及大小
   ht_b.INSel(this.canvas,el); return el;  //把el加入画布
 },
 rect: function(x,y,sx,sy)     { return this.rect0(x,y,sx,sy,"rect"); }, //画矩形
 oval: function(x,y,sx,sy)     { return this.rect0(x,y,sx,sy,"oval"); }, //画圆形
 img:  function(x,y,sx,sy,src) { return this.rect0(x,y,sx,sy,'image src="'+src+'"'); }, //载入图片
 rrect:function(x,y,sx,sy,arc) { return this.rect0(x,y,sx,sy,"roundrect arcsize="+arc); },    //画圆角矩形,arcsize为圆角半径
 arc:  function(x,y,sx,sy,a,b) { return this.rect0(x,y,sx,sy,'arc startAngle="'+a+'" endAngle="'+b+'"'); }, //圆弧
 point:function(x,y,s){ var el=this.oval(x-s/2,y-s/2,s,s); el.fillcolor=this.qb.strokecolor; return el; }//画点
};

/*****************
画布html代码示意
图形软件<br>
<v:group id=can1 coordsize="2000,2000" style="width:300px;height:300px;position:relative"/>
<script language=javascript>
ht.canvas=can1;
pc=ht.rect(1000,1000,100,100); //画一个距形
</script>
*****************/


//====================日食作图物件=====================
var tu1={
 isInit:0, x0:0, y0:0, w:0, h:0, dx:0, dy:0, //坐标参数
 diming:new Array(-116.4,40,'北京',-119,25.4,'莆田',-91,29.7,'拉萨',73,41,'纽约',-151,-34,'悉尼',-37,56,'莫斯科',-30,-20,'非洲南部',56,-33,'乌拉圭'), //几个地标
 init:function(can){ //初始化坐标等
  if(this.isInit) return;
  ht.canvas = can; this.isInit=1; //画笔指向画布,准备作图
  //坐标设置
  this.w=String(can.style.width).replace(/[^0-9]/g,'');
  this.h=String(can.style.height).replace(/[^0-9]/g,'');
  can.coordsize=this.w + ',' + this.h;
  var x0,y0,dx,dy,vs,vx,vy,us;
  dx = this.dx = int2( (this.w - this.x0)/8.5 );
  dy = this.dy = int2( (this.h - this.y0)/6.5 );
  x0 = this.x0 = int2( (this.w - this.dx*8)/2 );
  y0 = this.y0 = this.h - int2( (this.h - this.dy*6)/2 );
  vs=this.vs=this.dx,  vx=this.vx=x0+4*dx,  vy=this.vy=y0-3*dy, us=this.us=vs/2; //vs对应32角分(放大区参数)


  var ditu= //大小图像大小2009*970点对应360度*180度
   'm 2,212 l 58,180,121,180,128,143,150,129,130,129,99,147,92,171,74,170,42,150,122,104,175,102,230,118,223,124,192,125,215,138,405,92,413,99,411,126,445,117,422,100,590,65,639,76,606,88,724,88,741,101,818,93,942,111,1010,111,1064,126,1045,134,1003,130,1003,146,918,159,896,189,881,189,879,170,926,146,922,142,861,159,793,160,767,176,776,181,793,180,793,213,758,253,740,255,720,270,731,299,714,297,713,282,702,273,689,273,688,263,667,274,673,283,689,283,676,296,689,325,678,353,642,373,604,373,596,387,619,422,598,435,569,417,564,440,594,475,586,479,551,441,554,415,531,400,519,371,459,401,453,433,437,441,390,359,335,353,278,328,273,336,299,361,317,354,340,375,259,420,206,339,187,334,240,427,291,431,269,470,220,511,228,566,163,663,108,672,72,575,85,524,41,453,2,454,2,290,65,286,67,308,193,320,208,292,163,291,158,273,203,260,231,267,234,253,208,229,175,229,161,260,129,282,86,232,74,238,99,265,94,275,54,246,2,272,2,212 ' //亚欧非大陆
  +'m 67,54 l 115,46,154,50,155,54,119,58,100,71,67,54 m 300,96 l 321,77,385,68,388,71,315,91,327,101,317,105,300,96 m 522,45 l 547,44,592,58,573,62,550,60,522,45 m 775,75 l 780,82,808,83,818,74,806,72,775,75 ' //欧洲上面几块
  +'m 809,180 l 799,188,800,232,811,230,809,180 m 802,238 l 790,256,788,284,748,295,738,310,744,317,754,302,791,301,797,269,816,244,802,238 ' //日本
  +'m 686,354 l 681,357,677,365,683,371,686,354 m 544,460 l 583,487,602,515,640,527,597,528,544,460 m 662,452 l 619,482,638,507,646,507,672,484,665,469,673,460,662,452 m 680,480 l 671,513,684,514,703,479,680,480 m 747,492 l 750,504,808,532,846,537,820,507,776,494,747,492 ' //台湾及菲律滨几块
  +'m 771,548 l 708,560,641,604,659,675,746,653,790,690,842,689,865,666,868,628,802,541,796,576,767,564,771,548 m 973,672 l 981,693,941,736,952,742,1003,693,973,672 m 282,550 l 257,571,254,619,268,619,289,564,282,550 ' //大洋洲两块及马达加斯加
  +'m 1092,112 l 1117,120,1119,126,1091,124,1082,130,1118,134,1091,146,1135,163,1105,176,1107,178,1140,169,1172,151,1255,160,1316,204,1322,278,1425,388,1517,419,1550,449,1579,450,1560,516,1587,566,1620,582,1593,744,1614,786,1644,785,1621,773,1643,745,1634,739,1771,605,1815,536,1815,519,1629,429,1557,442,1543,405,1522,404,1526,377,1486,392,1464,371,1477,332,1546,326,1559,351,1559,320,1618,256,1672,238,1639,204,1685,203,1699,192,1657,162,1582,146,1574,200,1502,169,1483,153,1573,108,1607,115,1607,126,1582,134,1644,145,1667,119,1559,96,1558,75,1666,31,1593,27,1334,68,1329,109,1259,112,1142,101,1092,112 ' //美洲
  +'m 1680,39 l 1617,62,1634,77,1684,75,1734,110,1721,121,1744,151,1774,156,1788,131,1890,101,1864,88,1897,88,1906,54,1947,36,1927,36,1862,49,1892,37,1831,41,1836,33,1900,28,1833,22,1750,39,1680,39 m 1889,122 l 1884,136,1914,138,1933,130,1889,122 ' //格林兰岛及冰岛
  +'m 1969,175 l 1959,182,1958,198,1979,192,1980,179,1969,175 m 1987,162 l 1980,172,1995,182,1976,203,2010,201,2010,180,1996,173,2002,166,1987,162 m 2010,208 l 1989,215,2001,222,2001,247,1961,249,1962,287,1999,285,2010,273,2010,208 m 2010,297 l 1980,297,1918,361,1916,415,1943,452,1970,466,2010,456,2010,297 e';//非洲东部几块

  var p = ht.shape('');
  p.path=ditu; p.stroked=false; p.fillcolor='#D0D0D0';
  p.setzbx('2009,970',this.dx*8,this.dy*6);
  p.moveto(this.x0,this.h-this.y0);



  p = ht.shape('');
  //创建坐标
  for(i=0;i<=6;i++){ //画水平网格线(y刻度)
   c=y0-i*dy;
   p.p_moveto(x0,c);
   p.p_lineto(x0+dx*8,c);
   if(i) { p2 = ht.textbox(x0+2,c,45,15,'<b>'+15*i+'</b>('+(i>3?'+':'')+30*(i-3)+')');  p2.filled=false;  p2.stroked=false; }
  }
  for(i=0;i<=8;i++){ //画竖直网格线(x刻度)
   c=x0+i*dx;
   p.p_moveto(c,y0);
   p.p_lineto(c,y0-dy*6);
   if(i>0&&i<8) { p2 = ht.textbox(c-10,y0,60,35,'<b>'+30*(i-4)+'</b><br>('+(i<4?-45*i:-45*i+360)+')');  p2.filled=false;  p2.stroked=false; }
  }
  p.p_save();
  //创建太阳和月亮及地影
  this.Sun =ht.oval(0,0, vs,vs); this.Sun.moveto2(vx,vy);  this.Sun.stroked=false;
  this.Moon=ht.oval(0,0, vs,vs); this.Moon.moveto2(vx,vy); this.Moon.stroked=false; this.Moon.fillcolor='#a0a000';
  this.Eys =ht.oval(0,0, vs,vs); this.Eys.moveto2(vx,vy);  this.Eys.stroked=false;  this.Eys.fillcolor='#000000'; this.Eys.setopa(0.2); //地球半影
  this.eys =ht.oval(0,0, vs,vs); this.eys.moveto2(vx,vy);  this.eys.stroked=false;  this.eys.fillcolor='#000000'; this.eys.setopa(0.4); //地球本影
  this.sun =ht.oval(0,0, 7,7);   this.sun.moveto2(vx,vy);  this.sun.stroked=false;
  this.moon=ht.oval(0,0, 7,7);   this.moon.moveto2(vx,vy); this.moon.stroked=false; this.moon.fillcolor='#B0A070';
  //创建地标
  for(i=0;i<this.diming.length;i+=3){
   var J = -this.diming[i]; if(J<0) J+=360;
   var W = this.diming[i+1];
   J = J/45, W = W/30+3;
   J = this.x0+this.dx*J-5;
   W = this.y0-this.dy*W-8;
   p = ht.textbox(J,W,60,16,'<font color=red>·</font>'+this.diming[i+2]); p.filled=false; p.stroked=false;
  }
  this.mark=ht.shape(''); this.mark.filled=false; this.mark.strokecolor='#FF00FF';//三角形标记
 },
 move:function(el,J,W,bei){ //地平坐标移动日月。bei为真时,表示坐标图中的0度为正北,否则为正南
  //经纬度转为格数
  W =W*180/Math.PI/15;
  J = rad2rrad(J); if(bei) J=rad2rrad(J-Math.PI);
  J =J*180/Math.PI/30+4;
  if(J>8||J<0) { el.style.display = 'none'; return; }
  //移动位置
  el.style.display = 'block';
  el.moveto2(this.x0+J*this.dx, this.y0-W*this.dy);
 },
 ecShow:function(m,s,e,E){
  if(m) m='block'; else m='none'; this.Moon.style.display=m;
  if(s) s='block'; else s='none'; this.Sun.style.display=s;
  if(e) e='block'; else e='none'; this.eys.style.display=e;
  if(E) E='block'; else E='none'; this.Eys.style.display=E;
 },
 move2a:function(J1,W1,J2,W2, mr,sr){ //取得日食得放大图,转入月、太阳坐标及视半径(前者为月),半径单位是角秒。未做大气折射修正。
  var dJ=-rad2rrad(J1-J2), dW=W1-W2, v=this.vs;
  //默认向右为东,月亮东行所以向右运动,经度取反,月亮向左运动(左边变为东)
  dJ *= Math.cos((W1+W2)/2)*rad, dW *= rad; //转为平面
  dJ = v/32*dJ/60,   dW = v/32*dW/60;   //坐标转为点数
  sr = v/32*2*sr/60, mr = v/32*2*mr/60; //日月面大小转为点数
  if(Math.abs(dJ)>3.5*this.dx || Math.abs(dW)>2.5*this.dy){ this.ecShow(0,0,0,0); return; } //出界
  //重置日月的大小及位置,以便精准观测日月食
  this.ecShow(1,1,0,0);
  this.Sun.resize(sr,sr);  this.Sun.moveto2( this.vx, this.vy );
  this.Moon.resize(mr,mr); this.Moon.moveto2( this.vx+dJ, this.vy-dW );
 },
 move2b:function(J1,W1,J2,W2, mr,er,Er){ //取得得月食放大图,转入月、地影坐标及视半径(前者为月),半径单位是角秒。未做大气折射的修正。
  var dJ=-rad2rrad(J1-J2), dW=W1-W2, v=this.us;
  dJ *= Math.cos((W1+W2)/2)*rad, dW *= rad; //转为平面
  dJ = v/32*dJ/60,   dW = v/32*dW/60;   //坐标转为点数
  er = v/32*2*er/60, Er = v/32*2*Er/60, mr = v/32*2*mr/60; //日月面大小转为点数
  if(Math.abs(dJ)>3.5*this.dx || Math.abs(dW)>2.5*this.dy){ this.ecShow(0,0,0,0); return; } //出界
  this.ecShow(1,0,1,1);
  this.eys.resize(er,er);  this.eys.moveto2( this.vx, this.vy );
  this.Eys.resize(Er,Er);  this.Eys.moveto2( this.vx, this.vy );
  this.Moon.resize(mr,mr); this.Moon.moveto2( this.vx+dJ, this.vy-dW );
 },
 move3:function(J,W,bl){ //画出日食同心线,J,W为某中心点的地标,bl表示是否保留路径
  if(!bl) { this.mark.p_cls(); this.mark.p_save(); }
  if( Math.abs(J)>Math.PI*2 || Math.abs(W)>Math.PI ) return;
  J = rad2mrad(-J)/Math.PI*180/45; W = W/Math.PI*180/30+3;
  J = this.x0+this.dx*J-3; W = this.y0-this.dy*W;
  this.mark.p_moveto(J,W);
  this.mark.p_lineto(J-3,W+8);
  this.mark.p_lineto(J+3,W+8);
  this.mark.p_lineto(J,W);
  this.mark.p_save();
 },
 move4:function(el,J,W,gst){ //时角坐标中移动日月,输入:日月对象,赤经,赤纬,恒星时
  //经纬度转为格数
  W =W*180/Math.PI/30+3;
  J = rad2mrad(J-gst)*180/Math.PI/45;
  if(J>8||J<0) { el.style.display = 'none'; return; }
  //移动位置
  el.style.display = 'block';
  el.moveto2(this.x0+J*this.dx, this.y0-W*this.dy);
 }

};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -