`
madfroghe
  • 浏览: 123310 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Flash/Flex学习笔记(37):坐标旋转

阅读更多

坐标旋转是个啥概念呢?

如上图,(蓝色)小球 绕某一中心点旋转a角度后,到达(红色)小球的位置,则红色小球相对中心点的坐标为:

x1 = dx * cos(a) - dy * sin(a)

y1 = dy * cos(a) + dx * sin(a)

这个就是坐标旋转公式,如果要反向旋转,则公式要修正一下,有二种方法:

1.将a变成-a,即:

x1 = dx * cos(-a) - dy * sin(-a)

y1 = dy * cos(-a) + dx * sin(-a)

2.将正向旋转公式中的相减号交换

x1 = dx * cos(a) + dy * sin(a);
y1 = dy * cos(a) - dx * sin(a);

先来回顾一个经典的小球圆周运动:


var ball:Ball = new Ball(10);


var centerX:Number = stage.stageWidth/2;

var centerY:Number = stage.stageHeight/2;

var radius:Number = 50;


var angle:Number = 0;


addChild(ball);


addEventListener(Event.ENTER_FRAME,EnterFrameHandler);

 
ball.x = centerX + Math.cos(angle) * radius;

 
ball.y = centerY + Math.sin(angle) * radius;


graphics.lineStyle(1,0x999999);

 
graphics.moveTo(ball.x,ball.y);

 
function EnterFrameHandler(e:Event):void{   

ball.x = centerX + Math.cos(angle) * radius;

 
ball.y = centerY + Math.sin(angle) * radius;

 
angle += 0.02;

 
if (angle<=2*Math.PI+0.02){

 
graphics.lineTo(ball.x,ball.y);

 
}


}

这个没啥特别的,接下来我们用坐标旋转公式换一种做法验证一下是否有效:

 
var ball:Ball = new Ball(10);

 

 
var centerX:Number = stage.stageWidth/2;

 
var centerY:Number = stage.stageHeight/2;


var radius:Number = 50;

 
var angle:Number = 0;

 
ball.vr = 0.02;//旋转角速度

 
ball.x = centerX + radius;


ball.y = centerY;

 
var cos:Number = Math.cos(ball.vr);

 
var sin:Number = Math.sin(ball.vr);

addChild(ball);

 
addEventListener(Event.ENTER_FRAME,EnterFrameHandler);


graphics.lineStyle(1,0x999999);

 
graphics.moveTo(ball.x,ball.y);

 
var i:Number = 0;

 
function EnterFrameHandler(e:Event):void{   

 
var dx:Number = ball.x - centerX; 

 
var dy:Number = ball.y - centerY; 

 
var x2:Number = cos * dx - sin * dy; 

 
var y2:Number = cos * dy + sin * dx; 

 
ball.x = centerX + x2; 

 
ball.y = centerY + y2;

 
i++;

 
if (i<=(2*Math.PI+ball.vr)/ball.vr){


trace(i);


graphics.lineTo(ball.x,ball.y);

 
}

 
}

效果完全相同,说明坐标旋转公式完全是有效的,问题来了:原本一个简单的问题,经过这样复杂的处理后,效果并没有变化,为何要化简为繁呢?

好处1:提高运行效率

下面演示的多个物体旋转的传统做法:

 
var arrBalls:Array = new Array(30);

 
var centerX:Number = stage.stageWidth/2;

 
var centerY:Number = stage.stageHeight/2;

 
for(var i:uint=0,j:uint=arrBalls.length;i<j;i++){

 
arrBalls[i] = new Ball(3 + Math.random()*5,Math.random()*0xffffff);

 
arrBalls[i].x = centerX + 100 * (Math.random()*2-1);


arrBalls[i].y = centerY + 100 * (Math.random()*2-1);

 
addChild(arrBalls[i]);


}

 
graphics.lineStyle(1);

 
graphics.moveTo(centerX,centerY-5);

 
graphics.lineTo(centerX,centerY+5);


graphics.moveTo(centerX-5,centerY);

 
graphics.lineTo(centerX+5,centerY);

 
addEventListener(Event.ENTER_FRAME,EnterFrameHandler);

 
function EnterFrameHandler(e:Event):void{

for(var i:uint=0,j:uint=arrBalls.length;i<j;i++){

 
var ball:Ball = arrBalls[i];

 
var dx:Number = ball.x - stage.stageWidth/2;

 
var dy:Number = ball.y - stage.stageHeight/2;

 
var dist:Number = Math.sqrt(dx*dx + dy*dy); //1次Math调用


ball.vr = Math.atan2(dy,dx);//2次Math调用


ball.vr += 0.005;

 
ball.x = centerX + dist * Math.cos(ball.vr);//3次Math调用

 
ball.y = centerY + dist * Math.sin(ball.vr);//4次Math调用      

 
}   

 
}

坐标旋转的新做法:

 
var arrBalls:Array = new Array(30);


var centerX:Number = stage.stageWidth/2;

 
var centerY:Number = stage.stageHeight/2;


var vr:Number = 0.01;


for(var i:uint=0,j:uint=arrBalls.length;i<j;i++){

 
arrBalls[i] = new Ball(3 + Math.random()*5,Math.random()*0xffffff);

 
arrBalls[i].x = centerX + 100 * (Math.random()*2-1);


arrBalls[i].y = centerY + 100 * (Math.random()*2-1);


arrBalls[i].vr = vr;

 
addChild(arrBalls[i]);


}

 
graphics.lineStyle(1);

 
graphics.moveTo(centerX,centerY-5);

 
graphics.lineTo(centerX,centerY+5);

 
graphics.moveTo(centerX-5,centerY);

 
graphics.lineTo(centerX+5,centerY);

 
addEventListener(Event.ENTER_FRAME,EnterFrameHandler);

 
//将Math函数的调用放到到循环体外

 
var cos:Number = Math.cos(vr);


var sin:Number = Math.sin(vr);

 
function EnterFrameHandler(e:Event):void{


for(var i:uint=0,j:uint=arrBalls.length;i<j;i++){

 
var ball:Ball = arrBalls[i];

 
var dx:Number = ball.x - stage.stageWidth/2;

 
var dy:Number = ball.y - stage.stageHeight/2;

 
var x2:Number = cos * dx - sin * dy; 

 
var y2:Number = cos * dy + sin * dx;

 
ball.x = centerX + x2;

 
ball.y = centerY + y2;      

 
}   


}

对比代码可以发现,同样的效果用坐标旋转处理后,Math的调用全部提升到循环外部了,对于30个小球来讲,每一帧至少减少了30 * 4 = 120次的三角函数运算

好处2:可以方便的处理斜面反弹

先来看下正向/反向旋转的测试


var ball:Ball=new Ball(15);

 
addChild(ball);

 
var centerX:Number=stage.stageWidth/2;

 
var centerY:Number=stage.stageHeight/2;


var radius:Number=100;


ball.x=centerX+radius;


ball.y=centerY;

 
graphics.lineStyle(1,0xdddddd);

 
graphics.moveTo(centerX,centerY);

 
graphics.lineTo(ball.x,ball.y);

 
graphics.lineStyle(1);


graphics.moveTo(centerX,centerY -10);

 
graphics.lineTo(centerX,centerY +10);

 
graphics.moveTo(centerX-10,centerY);

 
graphics.lineTo(centerX+10,centerY);

 
var angle:Number=30*Math.PI/180;

 
btn1.addEventListener(MouseEvent.MOUSE_DOWN,btn1Click);

 
//旋转

 
function btn1Click(e:MouseEvent):void {


var cos:Number=Math.cos(angle);

 
var sin:Number=Math.sin(angle);


var dx:Number=ball.x-centerX;

 
var dy:Number=ball.y-centerY;

 
var x1:Number=dx*cos-dy*sin;

 
var y1:Number=dy*cos+dx*sin;


ball.x=centerX+x1;

 
ball.y=centerY+y1;

 
graphics.lineStyle(1,0xdddddd);

 
graphics.moveTo(centerX,centerY);

 
graphics.lineTo(ball.x,ball.y);

 
}

 
btn2.addEventListener(MouseEvent.MOUSE_DOWN,btn2Click);

 
//反转1

 
function btn2Click(e:MouseEvent):void {

 
var dx:Number=ball.x-centerX;

 
var dy:Number=ball.y-centerY;

 
var cos:Number=Math.cos(-angle);

 
var sin:Number=Math.sin(-angle);

 
var x1:Number=dx*cos-dy*sin;

 
var y1:Number=dy*cos+dx*sin;


ball.x=centerX+x1;

 
ball.y=centerY+y1;

 
graphics.lineStyle(1,0xdddddd);

 
graphics.moveTo(centerX,centerY);

graphics.lineTo(ball.x,ball.y);


}

 
btn3.addEventListener(MouseEvent.MOUSE_DOWN,btn3Click);

 
//反转2

 
function btn3Click(e:MouseEvent):void{

 
var dx:Number=ball.x-centerX;

 
var dy:Number=ball.y-centerY;

 
var cos:Number=Math.cos(angle);

 
var sin:Number=Math.sin(angle);

 
//反转公式

 
var x1:Number=dx*cos+dy*sin;

 
var y1:Number=dy*cos-dx*sin;

 
ball.x=centerX+x1;


ball.y=centerY+y1;

 
graphics.lineStyle(1,0xdddddd);

graphics.moveTo(centerX,centerY);


graphics.lineTo(ball.x,ball.y);

 
}

对于水平或垂直的反弹运动,实现起来并不复杂,但对于斜面而言,情况就复杂多了,首先:物体反弹并不是光学中的反射,所以用“入射角=反射角”来模拟并不准确,其次我们还要考虑到重力因素/摩擦力因素,这些都会影响到速度的大小和方向。

如果用坐标旋转的思维方式去考虑这一复杂的问题,解决办法就变得非常简单。

所有向量(物理学中也常称矢量,虽然这二者在严格意义上讲并不相同)都可应用坐标旋转,我们可以把整个系统(包括斜面以及相对斜面运行物体的速度向量)都通过坐标旋转变成水平面或垂直面,这样就把问题简单化了,等一切按水平或垂直的简单方式处理完成以后,再把系统旋转回最初的样子。


package {

 
import flash.display.Sprite;

 
import flash.events.Event;


import flash.events.MouseEvent;

 
import flash.ui.Mouse;

 
import flash.ui.MouseCursor;

 
import flash.geom.Rectangle;


public class AngleBounce extends Sprite {

 
private var ball:Ball;

 
private var line:Sprite;

 
private var gravity:Number=0.25;

 
private var bounce:Number=-0.6;

 
private var rect:Rectangle;

 
public function AngleBounce() {


init();

 
}

 
private function init():void {

Mouse.cursor=MouseCursor.BUTTON;


ball=new Ball(10);


addChild(ball);

 
ball.x=100;


ball.y=100;

 
line=new Sprite  ;

 
line.graphics.lineStyle(1);

 
line.graphics.lineTo(300,0);

 
addChild(line);

 
line.x=50;

line.y=200;


line.rotation=25;//将line旋转形成斜面


stage.addEventListener(MouseEvent.MOUSE_DOWN,MouseDownHandler);

 
rect = line.getBounds(this);//获取line的矩形边界

 
graphics.beginFill(0xefefef)

 
graphics.drawRect(rect.left,rect.top,rect.width,rect.height);

 
graphics.endFill();

}

 
private function MouseDownHandler(e:Event) {


addEventListener(Event.ENTER_FRAME,EnterFrameHandler);


}

 
private function EnterFrameHandler(e:Event):void {

//line.rotation = (stage.stageWidth/2 - mouseX)*0.1;


//普通的运动代码 

ball.vy+=gravity;

ball.x+=ball.vx;

 
ball.y+=ball.vy;

 
/*//只有二者(的矩形边界)碰撞了才需要做处理

 
if (ball.hitTestObject(line)) {*/


//也可以换成下面的方法检测          


if (ball.x > rect.left && ball.x < rect.right && ball.y >rect.top && ball.y < rect.bottom){


//trace("true");

 
//获得角度及正余弦值 


var angle:Number=line.rotation*Math.PI/180;

 
var cos:Number=Math.cos(angle);

 
var sin:Number=Math.sin(angle);

 
//获得 ball 与 line 的相对位置 

 
var dx:Number=ball.x-line.x;

 
var dy:Number=ball.y-line.y;


//反向旋转坐标(得到ball“相对”斜面line的坐标)

var x2:Number=cos*dx+sin*dy;

 
var y2:Number=cos*dy-sin*dx;

 
//反向旋转速度向量(得到ball“相对”斜面的速度) 


var vx2:Number=cos*ball.vx+sin*ball.vy;

 
var vy2:Number=cos*ball.vy-sin*ball.vx;

 
//实现反弹 


if (y2>- ball.height/2) {

 
y2=- ball.height/2;


vy2*=bounce;

 
//将一切再正向旋转回去

 
dx=cos*x2-sin*y2;

 
dy=cos*y2+sin*x2;

 
ball.vx=cos*vx2-sin*vy2;


ball.vy=cos*vy2+sin*vx2;

 
//重新定位


ball.x=line.x+dx;

 
ball.y=line.y+dy;

 
}

 
}

//跑出舞台边界后将其重新放到原始位置

 
if (ball.x>=stage.stageWidth-ball.width/2||ball.y>=stage.stageHeight-ball.height/2) {

 
ball.x=100;

ball.y=100;

 
ball.vx=0;

 
ball.vy=0;

 
removeEventListener(Event.ENTER_FRAME,EnterFrameHandler);

 
}


}

 
}

}

多角度斜面反弹:


package {

 
import flash.display.Sprite;

 
import flash.events.Event;

 
import flash.display.StageScaleMode;

 
import flash.display.StageAlign;


import flash.geom.Rectangle;

 
import flash.events.MouseEvent;

 
import flash.ui.Mouse;

 
import flash.ui.MouseCursor;


public class MultiAngleBounce extends Sprite {

 
private var ball:Ball;


private var lines:Array;

 
private var numLines:uint=5;

 
private var gravity:Number=0.3;

 
private var bounce:Number=-0.6;

 
public function MultiAngleBounce() {

 
init();

 
}

 
private function init():void {

 
stage.scaleMode=StageScaleMode.NO_SCALE;

 
stage.align=StageAlign.TOP_LEFT;

 
ball=new Ball(20);

 
addChild(ball);

 
ball.x=100;

 
ball.y=50;

 
// 创建 5 个 line 影片 


lines = new Array();


for (var i:uint = 0; i < numLines; i++) {

 
var line:Sprite = new Sprite();

 
line.graphics.lineStyle(1);

 
line.graphics.moveTo(-50, 0);


line.graphics.lineTo(50, 0);

 
addChild(line);

 
lines.push(line);

 
}

 
// 放置并旋转 

 
lines[0].x=100;

 
lines[0].y=100;

 
lines[0].rotation=30;


lines[1].x=100;

 
lines[1].y=230;

 
lines[1].rotation=45;

 
lines[2].x=250;

 
lines[2].y=180;

 
lines[2].rotation=-30;

 
lines[3].x=150;

 
lines[3].y=330;

 
lines[3].rotation=10;

 
lines[4].x=230;

 
lines[4].y=250;


lines[4].rotation=-30;

 
addEventListener(Event.ENTER_FRAME, onEnterFrame);


ball.addEventListener(MouseEvent.MOUSE_DOWN,MouseDownHandler);

 
ball.addEventListener(MouseEvent.MOUSE_OVER,MouseOverHandler);

 
stage.addEventListener(MouseEvent.MOUSE_UP,MouseUpHandler);

 
}


function MouseOverHandler(e:MouseEvent):void {

 
Mouse.cursor=MouseCursor.HAND;

 
}

 
function MouseDownHandler(e:MouseEvent):void {

 
Mouse.cursor=MouseCursor.HAND;

 
var bounds:Rectangle = new Rectangle(ball.width,ball.height,stage.stageWidth-2*ball.width,stage.stageHeight-2*ball.height);

 
ball.startDrag(true,bounds);

 
removeEventListener(Event.ENTER_FRAME, onEnterFrame);


}

 
function MouseUpHandler(e:MouseEvent):void {

 
ball.stopDrag();

 
ball.vx=0;

 
ball.vy=0;

 
Mouse.cursor=MouseCursor.AUTO;

 
addEventListener(Event.ENTER_FRAME, onEnterFrame);

 
}

 
private function onEnterFrame(event:Event):void {

 
// normal motion code 

 
ball.vy+=gravity;


ball.x+=ball.vx;

 
ball.y+=ball.vy;

 
// 舞台四周的反弹 

 
if (ball.x+ball.radius>stage.stageWidth) {

 
ball.x=stage.stageWidth-ball.radius;

 
ball.vx*=bounce;

 
} else if (ball.x - ball.radius < 0) {

 
ball.x=ball.radius;

 
ball.vx*=bounce;

 
}

 
if (ball.y+ball.radius>stage.stageHeight) {

 
ball.y=stage.stageHeight-ball.radius;

 
ball.vy*=bounce;

 
} else if (ball.y - ball.radius < 0) {


ball.y=ball.radius;

 
ball.vy*=bounce;


}

 
// 检查每条线 
for (var i:uint = 0; i < numLines; i++) {

 
checkLine(lines[i]);

 
}

 
}

 
private function checkLine(line:Sprite):void {


// 获得 line 的边界 

 
var bounds:Rectangle=line.getBounds(this);

 
if (ball.x>bounds.left&&ball.x<bounds.right) {

 
// 获取角度与正余弦值 

 
var angle:Number=line.rotation*Math.PI/180;

var cos:Number=Math.cos(angle);

 
var sin:Number=Math.sin(angle);


// 获取 ball 与 line 的相对位置 

 
var x1:Number=ball.x-line.x;

 
var y1:Number=ball.y-line.y;

 
// 旋转坐标 

 
var y2:Number=cos*y1-sin*x1;

 
// 旋转速度向量 

 
var vy1:Number=cos*ball.vy-sin*ball.vx;

 
// 实现反弹 

 
if (y2>- ball.height/2&&y2<vy1) {

 
// 旋转坐标 

 
var x2:Number=cos*x1+sin*y1;

 
// 旋转速度向量 

 
var vx1:Number=cos*ball.vx+sin*ball.vy;


y2=- ball.height/2;


vy1*=bounce;

 
// 将一切旋转回去 

 
x1=cos*x2-sin*y2;

 
y1=cos*y2+sin*x2;

 
ball.vx=cos*vx1-sin*vy1;


ball.vy=cos*vy1+sin*vx1;

 
ball.x=line.x+x1;


ball.y=line.y+y1;

 
}

 
}

 
}

 
}

 
}

分享到:
评论

相关推荐

    PV3d Papervision3d API文档+学习笔记+全景案例

    "pv3d学习笔记 (2).rar"和"pv3d学习笔记.rar"中可能包含了作者在实践中遇到的问题、解决方法、示例代码以及对PV3D特性的深入理解。这些笔记可以帮助初学者快速上手,避免重复踩坑,同时也为有经验的开发者提供了新的...

    基于ssm的网络教学平台(有报告)。Javaee项目,ssm项目。

    重点:所有项目均附赠详尽的SQL文件,这一细节的处理,让我们的项目相比其他博主的作品,严谨性提升了不止一个量级!更重要的是,所有项目源码均经过我亲自的严格测试与验证,确保能够无障碍地正常运行。 1.项目适用场景:本项目特别适用于计算机领域的毕业设计课题、课程作业等场合。对于计算机科学与技术等相关专业的学生而言,这些项目无疑是一个绝佳的选择,既能满足学术要求,又能锻炼实际操作能力。 2.超值福利:所有定价为9.9元的项目,均包含完整的SQL文件。如需远程部署可随时联系我,我将竭诚为您提供满意的服务。在此,也想对一直以来支持我的朋友们表示由衷的感谢,你们的支持是我不断前行的动力! 3.求关注:如果觉得我的项目对你有帮助,请别忘了点个关注哦!你的支持对我意义重大,也是我持续分享优质资源的动力源泉。再次感谢大家的支持与厚爱! 4.资源详情:https://blog.csdn.net/2301_78888169/article/details/144929660 更多关于项目的详细信息与精彩内容,请访问我的CSDN博客!

    2024年AI代码平台及产品发展简报-V11.pdf

    2024年AI代码平台及产品发展简报-V11

    蓝桥杯JAVA代码.zip

    蓝桥杯算法学习冲刺(主要以题目为主)

    QPSK调制解调技术研究与FPGA实现:详细实验文档的探索与实践,基于FPGA实现的QPSK调制解调技术:实验文档详细解读与验证,QPSK调制解调 FPGA设计,有详细实验文档 ,QPSK调制解调;

    QPSK调制解调技术研究与FPGA实现:详细实验文档的探索与实践,基于FPGA实现的QPSK调制解调技术:实验文档详细解读与验证,QPSK调制解调 FPGA设计,有详细实验文档 ,QPSK调制解调; FPGA设计; 详细实验文档,基于QPSK调制的FPGA设计与实验文档

    PID、ADRC和MPC轨迹跟踪控制器在Matlab 2018与Carsim 8中的Simulink仿真研究,PID、ADRC与MPC轨迹跟踪控制器在Matlab 2018与Carsim 8中的仿真研

    PID、ADRC和MPC轨迹跟踪控制器在Matlab 2018与Carsim 8中的Simulink仿真研究,PID、ADRC与MPC轨迹跟踪控制器在Matlab 2018与Carsim 8中的仿真研究,PID, ADRC和MPC轨迹跟踪控制器Simulink仿真模型。 MPC用于跟踪轨迹 ADRC用于跟踪理想横摆角 PID用于跟踪轨迹 轨迹工况有双移线,避障轨迹,正弦轨迹多种 matlab版本为2018,carsim版本为8 ,PID; ADRC; MPC; 轨迹跟踪控制器; Simulink仿真模型; 双移线; 避障轨迹; 正弦轨迹; MATLAB 2018; CarSim 8,基于Simulink的PID、ADRC与MPC轨迹跟踪控制器仿真模型研究

    基于Springboot的个性化图书推荐系统。Javaee项目,springboot项目。

    重点:所有项目均附赠详尽的SQL文件,这一细节的处理,让我们的项目相比其他博主的作品,严谨性提升了不止一个量级!更重要的是,所有项目源码均经过我亲自的严格测试与验证,确保能够无障碍地正常运行。 1.项目适用场景:本项目特别适用于计算机领域的毕业设计课题、课程作业等场合。对于计算机科学与技术等相关专业的学生而言,这些项目无疑是一个绝佳的选择,既能满足学术要求,又能锻炼实际操作能力。 2.超值福利:所有定价为9.9元的项目,均包含完整的SQL文件。如需远程部署可随时联系我,我将竭诚为您提供满意的服务。在此,也想对一直以来支持我的朋友们表示由衷的感谢,你们的支持是我不断前行的动力! 3.求关注:如果觉得我的项目对你有帮助,请别忘了点个关注哦!你的支持对我意义重大,也是我持续分享优质资源的动力源泉。再次感谢大家的支持与厚爱! 4.资源详情:https://blog.csdn.net/2301_78888169/article/details/144486173 更多关于项目的详细信息与精彩内容,请访问我的CSDN博客!

    Matlab实现Transformer-Adaboost时间序列预测的详细项目实例(含完整的程序,GUI设计和代码详解)

    内容概要:本文档详细介绍了一个利用Matlab实现Transformer-Adaboost结合的时间序列预测项目实例。项目涵盖Transformer架构的时间序列特征提取与建模,Adaboost集成方法用于增强预测性能,以及详细的模型设计思路、训练、评估过程和最终的GUI可视化。整个项目强调数据预处理、窗口化操作、模型训练及其优化(包括正则化、早停等手段)、模型融合策略和技术部署,如GPU加速等,并展示了通过多个评估指标衡量预测效果。此外,还提出了未来的改进建议和发展方向,涵盖了多层次集成学习、智能决策支持、自动化超参数调整等多个方面。最后部分阐述了在金融预测、销售数据预测等领域中的广泛应用可能性。 适合人群:具有一定编程经验的研发人员,尤其对时间序列预测感兴趣的研究者和技术从业者。 使用场景及目标:该项目适用于需要进行高质量时间序列预测的企业或机构,比如金融机构、能源供应商和服务商、电子商务公司。目标包括但不限于金融市场的波动性预测、电力负荷预估和库存管理。该系统可以部署到各类平台,如Linux服务器集群或云计算环境,为用户提供实时准确的预测服务,并支持扩展以满足更高频率的数据吞吐量需求。 其他说明:此文档不仅包含了丰富的理论分析,还有大量实用的操作指南,从项目构思到具体的代码片段都有详细记录,使用户能够轻松复制并改进这一时间序列预测方案。文中提供的完整代码和详细的注释有助于加速学习进程,并激发更多创新想法。

    液滴穿越障碍:从文献到案例的复现研究,液滴破裂与障碍物穿越:文献复现案例研究,液滴生成并通过障碍物破裂 该案例是文献复现,文献与案例一起 ,液滴生成; 障碍物破裂; 文献复现; 案例研究,液滴破

    液滴穿越障碍:从文献到案例的复现研究,液滴破裂与障碍物穿越:文献复现案例研究,液滴生成并通过障碍物破裂。 该案例是文献复现,文献与案例一起。 ,液滴生成; 障碍物破裂; 文献复现; 案例研究,液滴破裂:障碍挑战的文献复现案例

    蓝桥杯练习题_2.zip

    蓝桥杯算法学习冲刺(主要以题目为主)

    蓝桥杯笔记,用于个人学习进步.zip

    蓝桥杯算法学习冲刺(主要以题目为主)

    基于最小递归二乘法的MPC自适应轨迹跟踪控制优化 针对轮胎刚度时变特性提升模型精度与鲁棒性,仿真验证满足车辆低速高精度跟踪与高速稳定性提升 ,基于变预测时域MPC自适应轨迹跟踪控制与轮胎侧偏刚度优化提

    基于最小递归二乘法的MPC自适应轨迹跟踪控制优化 针对轮胎刚度时变特性提升模型精度与鲁棒性,仿真验证满足车辆低速高精度跟踪与高速稳定性提升。,基于变预测时域MPC自适应轨迹跟踪控制与轮胎侧偏刚度优化提升模型精度和鲁棒性,基于变预测时域的MPC自适应轨迹跟踪控制,针对轮胎刚度时变的特点造成控制模型精度降低,基于最小递归二乘法(RLS)估算的轮胎侧偏刚度,提升了模型的控制精度和鲁棒性,通过carsim与simulink联合仿真结果发现,改进后的轨迹跟踪控制器既满足了车辆低速行驶下的轨 迹跟踪精度,也一定程度上克服了高速下车辆容易失去稳定性的问题。 有详细的lunwen分析说明和资料,以及本人的,仿真包运行。 ,基于变预测时域的MPC; 自适应轨迹跟踪控制; 轮胎刚度时变; 控制模型精度降低; 最小递归二乘法(RLS)估算; 模型控制精度和鲁棒性提升; carsim与simulink联合仿真; 轨迹跟踪控制器; 车辆稳定性。,基于变预测时域MPC的轮胎刚度自适应轨迹跟踪控制策略研究

    GMSK调制解调技术研究:基于FPGA设计与实验详解,GMSK调制解调技术详解:基于FPGA设计的实验文档与实践应用,GMSK调制解调 FPGA设计,有详细实验文档 ,GMSK调制解调; FPGA设计

    GMSK调制解调技术研究:基于FPGA设计与实验详解,GMSK调制解调技术详解:基于FPGA设计的实验文档与实践应用,GMSK调制解调 FPGA设计,有详细实验文档 ,GMSK调制解调; FPGA设计; 详细实验文档; 实验结果分析,GMSK调制解调技术:FPGA设计与实验详解

    (源码)基于Arduino和Python的Cansat卫星系统.zip

    # 基于Arduino和Python的Cansat卫星系统 ## 项目简介 本项目是一个Cansat卫星系统,旨在设计和实现一个小型卫星模型,通过火箭发射至1公里高空,并使用地面站接收其传输的数据。项目涉及Arduino编程、Python数据处理和可视化。 ## 主要特性和功能 1. 硬件组件 使用Arduino Nano作为Cansat的微控制器。 搭载BMP 280温度和压力传感器、ATGM336H GPS模块、LoRa通信模块等。 地面站使用Arduino Uno和LoRa通信模块接收数据。 2. 数据处理 使用Python进行数据处理和可视化,包括数据清洗、计算风速、绘制温度、压力、风速和海拔随时间变化的图表等。 3. 通信与控制 通过LoRa模块实现Cansat与地面站之间的数据传输。 提供实时监视和记录数据的脚本。 ## 安装和使用步骤 ### 1. 硬件准备

    LongSung-USB-Drivers-V2.0-for-Windows

    U9300C 龙尚4G模块安装后模块才能正常使用,win7 win10驱动程序,支持USB转接板。

    (源码)基于Arduino平台的物联网温湿度监控系统.zip

    # 基于Arduino平台的物联网温湿度监控系统 ## 项目简介 这是一个基于Arduino平台的物联网温湿度监控项目,旨在通过简单的硬件设备实现环境数据的实时监测与远程管理。该项目适用于智能家居、农业种植等领域。 ## 项目的主要特性和功能 1. 温湿度数据采集通过Arduino板连接温湿度传感器,实时采集环境数据。 2. 数据传输将采集到的数据通过无线网络模块发送到服务器或远程终端。 3. 数据可视化可在电脑或移动设备端展示实时的温湿度数据。 4. 报警功能当温湿度数据超过预设阈值时,自动触发报警通知。 ## 安装使用步骤 前提假设用户已经下载了本项目的源码文件。以下是简单明了的安装使用步骤 1. 环境准备安装Arduino开发环境,配置必要的硬件接口。 2. 硬件连接将Arduino板与温湿度传感器、无线网络模块连接。 3. 代码上传将本项目提供的Arduino代码上传至Arduino板。

    基于需求响应与清洁能源接入的配电网重构优化:综合成本与混合整数凸规划模型分析(matlab实现),基于需求响应与清洁能源接入的配电网重构算法研究:网损与成本优化的仿真分析,高比例清洁能源接入下计及需求

    基于需求响应与清洁能源接入的配电网重构优化:综合成本与混合整数凸规划模型分析(matlab实现),基于需求响应与清洁能源接入的配电网重构算法研究:网损与成本优化的仿真分析,高比例清洁能源接入下计及需求响应的配电网重构(matlab代码) 该程序复现《高比例清洁能源接入下计及需求响应的配电网重构》,以考虑网损成本、弃风弃光成本和开关操作惩罚成本的综合成本最小为目标,针对配电网重构模型的非凸性,引入中间变量并对其进行二阶锥松弛,构建混合整数凸规划模型,采用改进的 IEEE33 节点配电网进行算例仿真,分析了需求响应措施和清洁能源渗透率对配电网重构结果的影响。 该程序复现效果和出图较好(详见程序结果部分),注释清楚,方便学习 ,高比例清洁能源; 需求响应; 配电网重构; 二阶锥松弛; 综合成本最小化; MATLAB代码; IEEE33节点配电网; 复现效果; 出图; 注释清楚。,Matlab代码复现:高比例清洁能源接入下的配电网重构模型与需求响应分析

    (源码)基于C++的RapidJSON库测试项目.zip

    # 基于C++的RapidJSON库测试项目 ## 项目简介 本项目是一个基于C++的RapidJSON库测试项目,主要用于测试RapidJSON库的功能正确性、性能以及稳定性。RapidJSON是一个高效的C++ JSON解析生成库,广泛应用于各种场景。本项目通过编写一系列的单元测试,覆盖了RapidJSON库的主要功能点,包括JSON解析、生成、内存管理、编码转换等,以确保RapidJSON库在各种情况下都能正确、稳定地工作。 ## 项目的主要特性和功能 1. 单元测试框架使用Google Test测试框架进行单元测试,确保测试的可靠性和可扩展性。 2. 全面测试覆盖覆盖了RapidJSON库的主要功能点,包括JSON解析、生成、内存管理、编码转换等,以及针对各种输入数据的测试。 3. 性能测试通过性能基准测试,评估RapidJSON库在处理不同规模和类型的JSON数据时的性能表现。

    蓝桥杯单片机十一届试题.zip

    蓝桥杯算法学习冲刺(主要以题目为主)

    vmware虚拟机安装教程.docx

    内容概要:本文详细介绍如何安装和初步使用 VMware 虚拟机,从下载安装 VMware 到创建和配置新的虚拟机。主要内容包括:软件选择和安装步骤、虚拟机的新建配置、操作系统安装及初始化设置、安装 VMware Tools 提升性能以及一些常用的 VMWare 功能,如虚拟网络的不同连接方式及其应用场景。同时介绍了 VMware 软件在网络连接管理和服务配置方面的一些要点,确保虚拟机正常运行。 适用人群:计算机操作较为熟练、有意搭建不同操作系统测试环境的技术人员,以及想要了解虚拟机基本概念及应用的学生。 使用场景及目标:适合于个人用户进行系统兼容性和安全性的验证;适用于企业或开发者做软件测试、模拟复杂环境下作业,确保不影响宿主机正常工作的前提下完成多种任务;适用于教学培训环境中部署实验平台。此外,还可以用来隔离特定业务流程(比如银行工具)、探索不同类型操作系统的特点。 其他说明:需要注意的是,为了避免安装过程中出现问题,建议暂时关闭杀毒软件和防火墙。安装 VMware 需要接受许可协议,同时可以选择安装路径和安装类型(典型/自定义)。最后,对于网络设置,默认提供的三种模式——桥接模式、仅主机模式和 NAT 模式,可以帮助用户根据不同需求灵活调整网络连接方式。

Global site tag (gtag.js) - Google Analytics