来源:未知 时间:2023-01-29 17:56 作者:小飞侠 阅读:次
[导读] 今天带来JS基于数学公式求一个点绕另一个点旋转,并贴上动画效果: 根据数学三角函数推导公式:(具体推导过程都是基于两角和,两角差公式演变, 感可自查 ) 变量说明: [newX,n...
|
今天带来JS基于数学公式求一个点绕另一个点旋转,并贴上动画效果: 效果预览:思路讲解:根据数学三角函数推导公式:(具体推导过程都是基于两角和,两角差公式演变,感可自查) 变量说明: [newX,newY = 旋转后的坐标 ] [origin=起始点坐标] [center=参照哪个点旋转坐标] newY = origin.x * cos(r) - origin.y * sin(r) + center.x; newX = origin.x * sin(r) + origin.y * cos(r) + center.y; 话不多说上代码:<canvas id="cvs" width="500" height="500"></canvas>
<script type="text/javascript">
window.onload = function(){
var deg = 10;
var cvs = document.querySelector("#cvs");
var ctx = cvs.getContext("2d")
console.dir(ctx)
var start = {x:130, y:130};
var center = {x:cvs.width/2, y:cvs.height/2};
var end = {};
setInterval(function(){
deg += 5; // 每次加5度
end = rotatePoint(start, deg, center);
console.log(end, deg)
draw();
}, 30);
function draw() {
// 清理画布
ctx.clearRect(0,0,cvs.width, cvs.height)
// 起始点
ctx.save();
ctx.fillStyle="red"
ctx.fillRect(start.x, start.y, 5, 5);
ctx.fillStyle="green"
// 绘制中心点
ctx.fillRect(center.x, center.y, 5, 5);
ctx.restore();
// 每次旋转后的点坐标
ctx.fillRect(end.x, end.y, 5, 5);
}
}
/**
* 计算某个点旋转后的坐标
*
* @param point 旋转的点 {x,y}
* @param angle 旋转的角度
* @param originPoint 基于哪个点旋转,默认值左上角原点{x: 0, y: 0}
* @returns {{x: number, y: number}}
*/
function rotatePoint(point, angle, originPoint = {x: 0, y: 0}) {
const cosA = Math.cos(angle * Math.PI / 180);
const sinA = Math.sin(angle * Math.PI / 180);
const rx = originPoint.x + (point.x - originPoint.x) * cosA - (point.y - originPoint.y) * sinA;
const ry = originPoint.y + (point.x - originPoint.x) * sinA + (point.y - originPoint.y) * cosA;
return { x: rx,y: ry };
}
</script>代码主要看最后一个方法 fn rotatePoint, 其中 rx = 中心点坐标x + 半径(起点-中心点) * cos(r) 同理其他都对应上,自己带入到代码里面试一试吧。 |
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com