函數:每一個變量都有對應的值稱之為函數


Math.pow(a,b) 表示ab</sup


Math.sqrt(a),表示a的開方,無法開多次方


a2+b2=c2


iMac底部菜單


See the Pen PPENEj by elmok (@elmok) on CodePen.


<script async src="//assets.codepen.io/assets/embed/ei.js"></script>



三角函数:Math.sin(弧度)、Math.cos(弧度)、Math.tan(弧度),即三角函数括号里以弧度为单位;


360o == 2π弧度; 所以,1弧度 = 180/π角度,1角度 = π/180弧度,记忆:弧度 > 角度


角度转弧度: π/180 × 角度


弧度变角度: 180/π × 弧度


sin = a/c;cos = b/c; tan = a/b


圆的周长:l = 2π*r


弧长等于半径的弧,其所对的圆心角为1弧度,所以: 弧长=nπr/180,在这里n就是角度数,即圆心角n所对应的弧长


一周的弧度数为2πr/r=2π,360°角=2π弧度,因此,1弧度约为57.3°,即57°17'44.806'',1°为π/180弧度,近似值为0.01745弧度,周角为2π弧度,平角(即180°角)为π弧度,直角为π/2弧度。

//角度转弧度,30度角转弧度,30*π/180
Math.sin(30 * Math.PI/180)

//上下比,角度对应π,弧度对应180


圓周運動,右水平線開始運動;

window.onload = function(){
    var oDiv = document.getElementById('div1');
    var r = 100;
    var x = 700;
    var y = 300;
    var num = 0;
    setInterval(function(){
        num++
        //Math.sin( num*Math.PI/180 ) = a/r;
        //Math.cos( num*Math.PI/180 ) = b/r;
        
        var a = Math.sin( num*Math.PI/180 ) * r; //顺时针时,距离中心点的top值越来越远
        var b = Math.cos( num*Math.PI/180 ) * r; //顺时针时,距离中心点的left值越来越近;

        oDiv.style.left = x + b + 'px';
        oDiv.style.top = y + a + 'px';
        
        var oBox = document.createElement('div');
        oBox.className = 'box';
        document.body.appendChild( oBox );
        
        oBox.style.left = oDiv.offsetLeft + 'px';
        oBox.style.top = oDiv.offsetTop + 'px';
    },300);
};
#div1{ width:20px; height:20px; background:red; position:absolute; left:800px; top:300px;}
.box{ border:1px #000 solid; position:absolute;}

围绕y轴,在x轴平面上做运动,并且有z轴半径r;所以top值不变,改变的是left值与宽高,形成视觉差,近大远小运动

window.onload = function(){
    var oDiv = document.getElementById('div1');
    var r = 100;
    var x = 700;
    var y = 300;
    var num = 0;
    setInterval(function(){
        num++
        //Math.sin( num*Math.PI/180 ) = a/r;
        //Math.cos( num*Math.PI/180 ) = b/r;

        //围绕y轴,在x轴平面上做运动,并且有z轴半径r;所以top值不变,改变的是left值与宽高,形成视觉差,近大远小运动
        
        var a = Math.sin( num*Math.PI/180 ) * r;
        var b = Math.cos( num*Math.PI/180 ) * r;

        oDiv.style.left = x + b + 'px';
        //oDiv.style.top = y + a + 'px';
        
        oDiv.style.width = a/100*30 + 50 + 'px'; //a最大100,起点50,注意理解
        oDiv.style.height = a/100*30 + 50 + 'px';

    },8);
};

圆心随鼠标移动方向移动;

var box = document.querySelector('.box')
var ege = document.querySelector('.ege')
var r = 50;
var L = 400
var T = 400
/*     -
     *     \
           \
    - ------------  +
           \
           \
    *      +
    * */
document.onmousemove = function (e) {
  var e = e || event;
  var x = e.clientX;
  var y = e.clientY;
  var a = Math.abs(x - (L + ege.parentNode.offsetLeft)) //为算角度
  var b = Math.abs(y - (T + ege.parentNode.offsetTop)) //大角与小角 角度一样
  var changeX = 0;
  var changeY = 0;
  if (x > L + ege.parentNode.offsetLeft && y < T + ege.parentNode.offsetTop) {
    changeX = Math.sin(Math.atan(b / a)) * r
    changeY = Math.cos(Math.atan(b / a)) * - r
  } 
  else if (x > L + ege.parentNode.offsetLeft && y > T + ege.parentNode.offsetTop) {
    changeX = Math.sin(Math.atan(b / a)) * r
    changeY = Math.cos(Math.atan(b / a)) * r
  } 
  else if (x < L + ege.parentNode.offsetLeft && y > T + ege.parentNode.offsetTop) {
    changeX = Math.sin(Math.atan(b / a)) * - r
    changeY = Math.cos(Math.atan(b / a)) * r
  } 
  else if (x < L + ege.parentNode.offsetLeft && y < T + ege.parentNode.offsetTop) {
    changeX = Math.sin(Math.atan(b / a)) * - r
    changeY = Math.cos(Math.atan(b / a)) * - r
  }
  ege.style.left = changeX + 'px'
  ege.style.top = changeY + 'px'
}

使用Math.atan2(y,x),以原点为基础,任意一点到原点x轴的夹角;值范围为-PI - PI,换角度即:-180 - 180



一图了然,所以改写为

var ev = ev || window.event;
change(oDiv2, ev.clientX, ev.clientY, L2, T2);
change(oDiv3, ev.clientX, ev.clientY, L3, T3);
function change(obj, x, y, l, t) {
  var changeX = 0;
  var changeY = 0;

  var a = x - (obj.offsetLeft + obj.parentNode.offsetLeft)    //方向 右+ 左- 上 + 下-
  var b = - (y - (obj.offsetTop + obj.parentNode.offsetTop))

  var ifm = Math.atan2(b, a) * 180 / Math.PI

  if (0 < ifm < 90) {
    changeX = Math.sin(Math.atan2(b, a)) * r
    changeY = Math.cos(Math.atan2(b, a)) * r
  } 
  else if (90 < ifm < 180) {
    changeX = Math.sin(Math.atan2(b, - a)) * r
    changeY = Math.cos(Math.atan2(b, - a)) * r
  } 
  else if (0 > ifm > - 90) {
    changeX = Math.sin(Math.atan2( - b, a)) * r
    changeY = Math.cos(Math.atan2( - b, a)) * r
  } 
  else if ( - 90 > ifm > - 180) {
    changeX = Math.sin(Math.atan2( - b, - a)) * r
    changeY = Math.cos(Math.atan2( - b, - a)) * r
  }

  obj.style.left = l + changeX + 'px';
  obj.style.top = t + changeY + 'px';
}


反正弦,反余弦 Math.asin(x); Math.acos(x) 求度数函数


正常sin30度=1/2 arcsin2/1=30度

cos60度=1/2 arccos1/2=30度



<style>

table{border-collapse: collapse;width:95%}
table td{border:1px solid #ddd;padding:5px 10px}
table th{border:1px solid #ddd;padding:5px 10px}

</style>

Math 对象属性

属性 描述
E 返回算术常量 e,即自然对数的底数(约等于2.718)。
LN2 返回 2 的自然对数(约等于0.693)。
LN10 返回 10 的自然对数(约等于2.302)。
LOG2E 返回以 2 为底的 e 的对数(约等于 1.414)。
LOG10E 返回以 10 为底的 e 的对数(约等于0.434)。
PI 返回圆周率(约等于3.14159)。
SQRT1_2 返回返回 2 的平方根的倒数(约等于 0.707)。
SQRT2 返回 2 的平方根(约等于 1.414)。

Math 对象方法

方法 描述
abs(x) 返回数的绝对值。
acos(x) 返回数的反余弦值。
asin(x) 返回数的反正弦值。
atan(x) 以介于 -PI/2 与 PI/2 弧度之间的数值来返回 x 的反正切值。
atan2(y,x) 返回从 x 轴到点 (x,y) 的角度(介于 -PI/2 与 PI/2 弧度之间)。
ceil(x) 对数进行上舍入。
cos(x) 返回数的余弦。
exp(x) 返回 e 的指数。
floor(x) 对数进行下舍入。
log(x) 返回数的自然对数(底为e)。
max(x,y) 返回 x 和 y 中的最高值。
min(x,y) 返回 x 和 y 中的最低值。
pow(x,y) 返回 x 的 y 次幂。
random() 返回 0 ~ 1 之间的随机数。
round(x) 把数四舍五入为最接近的整数。
sin(x) 返回数的正弦。
sqrt(x) 返回数的平方根。
tan(x) 返回角的正切。
toSource() 返回该对象的源代码。
valueOf() 返回 Math 对象的原始值。