转 第十九章 flash实用技巧 (1)(as3.0)

Flash定时器 基于计时器的动画       作为计时器动画使用的关键类,不出意料,它就是 flash.utils.Timer。同时我们还需要  flash.events.TimerEvent  类。       使用计时器实际上与使用 enterFrame  没什么两样。只需要我们去创建一个计时器 (Timer),告诉它多久“滴答响”一声,并侦听 TimerEvent.TIMER  事件,就像对  ... 阅读详情

现在您已经来到了最后一章。我将所有想要介绍的一些小东西都放在了这一章,它们不
太合适放在其它地方,或者说与前面章节的主线有些脱离。
    本章,我还重组了前面每章课后列出的公式,因此可以当作这些公式的一个参考点。
    由于这些课题都是比较零碎的概念,所以我没有办法将这些许许多多的内容组织起来。
因此每一节都是一个独立的单元。好了,不多说了,让我们开始吧。


布朗(随机)运动
    先讲讲历史。一天,一个名叫罗伯特-布朗(Robert Brown)的植物学家正在观察一滴水
中的花粉颗粒,随后他发现这些花粉是在随机运动的。虽然它们不是水流或水的运动,但是
这些小小的颗粒却永远不会停下来。     他发现同样的事情会发生在微尘中,但它们不会像花粉
那样游泳。虽然他不知道为什么会有这种现象,     其实不只是他还有其他所有人在几十年内都
不能给出解释,但是他却将这种现象用自己的名字命名 —— 只是为了能意识到它!
    当今,我们对布朗运动的解释是大量的水分子在一滴水中不断运动,     虽然水滴看上去是
静止的。这些水分子与花粉和灰尘发生碰撞,将一些动量传给它们。因为即使是一颗小小的
灰尘都要比一个水分子重上一百万倍,     所以一次碰撞不会带来多大的影响。但是当每秒有几
百万次的碰撞时,那么这些动量就会累计起来。
    现在,一些水分子也许撞到了灰尘的一边,而另一些则撞在了另一边。最终,它们会达
到总的平均值。但是,随着时间的变化,受到更多撞击的一边就会产生波动,假设为左边,
那么这个粒子就会向右运动一点。底部所受撞击越多,则粒子向上运动得就越多。最后所有
的值趋于平均,最终的结果通常不会在任何一个方向产生太多的动量。   这就是随机悬浮动作。
    我们可以在 Flash 中轻松地模拟出这种效果。在每一帧中,计算一个随机数加在运动
物体的 x 和 y 速度中。随机的数值应该即可以是正数也可以是负数,    并且一般来说都非常
小,比如范围从 -0.1 到 +0.1。形式如下:
    vx += Math.random() * 0.2 - 0.1;
    vy += Math.random() * 0.2 - 0.1;
用 0.2 乘以一个随机的小数,所得的值从 0.0 到 0.2。再减去 0.1 则值变为 -0.1 到 0.1。
在这里加入一些摩擦力(friction)很重要,否则速度会增大,并产生不自然的加速。在
Brownian1.as 中,我创建了 50 个粒子并让它们以布朗运动的形式悬浮。粒子就是我们熟悉
的 Ball 类的实例,让它们为黑色并缩小。以下是代码:
package {
 import flash.display.Sprite;
 import flash.events.Event;
 public class Brownian1 extends Sprite {
  private var numDots:uint = 50;
  private var friction:Number = 0.95;
  private var dots:Array;
  public function Brownian1() {
    init();
  }
  private function init():void {
    dots = new Array();
    for (var i:uint = 0; i < numDots; i++) {
     var dot:Ball = new Ball(1, 0);
     dot.x = Math.random() * stage.stageWidth;
    dot.y = Math.random() * stage.stageHeight;
    dot.vx = 0;
    dot.vy = 0;
    addChild(dot);
    dots.push(dot);
  }
  addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
private function onEnterFrame(event:Event):void {
  for (var i:uint = 0; i < numDots; i++) {
    var dot:Ball = dots[i];
    dot.vx += Math.random() * 0.2 - 0.1;
    dot.vy += Math.random() * 0.2 - 0.1;
    dot.x += dot.vx;
    dot.y += dot.vy;
    dot.vx *= friction;
    dot.vy *= friction;
    if (dot.x > stage.stageWidth) {
      dot.x = 0;
    } else if (dot.x < 0) {
      dot.x = stage.stageWidth;
    }
    if (dot.y > stage.stageHeight) {
      dot.y = 0;
    } else if (dot.y < 0) {
      dot.y = stage.stageHeight;
    }
  }
}
  }
}
这里大多部分内容都不是什么新知识,我已将有关的部分用加粗表示。
如图 19-1 所示,代码运行时屏幕上的显示。
转 <wbr>第十九章 <wbr>flash实用技巧 <wbr>(1)(as3.0)

图 19-1 布朗运动


在 Brownian2.as 中,我将 numDots 减少到 20。然后将这行代码:
      graphics.lineStyle(0, 0, .5);
加入到 init 函数中,并在 onEnterFrame 中加入一些绘图的代码。
private function onEnterFrame(event:Event):void {
  for (var i:uint = 0; i < numDots; i++) {
    var dot:Ball = dots[i];
    graphics.moveTo(dot.x, dot.y);
    dot.vx += Math.random() * 0.2 - 0.1;
    dot.vy += Math.random() * 0.2 - 0.1;
    dot.x += dot.vx;
    dot.y += dot.vy;
    dot.vx *= friction;
    dot.vy *= friction;
    graphics.lineTo(dot.x, dot.y);
  }
}
这样就在每个 dot 移动前与移动后的位置之间绘制了一条线。也就绘制出了自己的运动路
径,如图 19-2 所示。如果您知道“布朗运动”这个词的话,那么一定会常常看到这种图像。

转 <wbr>第十九章 <wbr>flash实用技巧 <wbr>(1)(as3.0)

图 19-2 带有行迹的布朗运动


     当我们要让物体以无意识、无外力的形式运动时,那么布朗运动将是最为实用的。也可
以将它加入到一个带有其它运动的影片中,这样会给人一种随意(randomness)的感觉。例
如到处乱飞的苍蝇或蜜蜂。 也许这些影片已经有了它们各自的运动路径,但是在加入了一些
随机运动后会让它看起来更加栩栩如生。
随机分布
     有时候我们会创建一些物体并将它们随机放置。您已经在本书中看到了很多这样的例
子,但是下面我们要来关注几种不同的方法,获得不同的结果。
方形分布
     如果你想让物体随机分布在整个舞台上,那是相当简单的。只需要选择一个舞台宽度的
随机数作为 x,一个高度的随机数作为 y。事实上,我们上一节就是这么做的:
for (var i:uint = 0; i < numDots; i++) {
  var dot:Ball = new Ball(1, 0);
  dot.x = Math.random() * stage.stageWidth;
  dot.y = Math.random() * stage.stageHeight;
  ...
}
但是如果说我们要让这些点集中分布在舞台中心,比如舞台中心上方 100 像素为顶,下方
100 像素为底。我们可以这样做,可见 Random1.as:
package {
  import flash.display.Sprite;
  public class Random1 extends Sprite {
    private var numDots:uint = 50;
    public function Random1() {
      init();
    }
    private function init():void {
      for (var i:uint = 0; i < numDots; i++) {
        var dot:Ball = new Ball(1, 0);
        dot.x = stage.stageWidth / 2 +
        Math.random() * 200 - 100;
        dot.y = stage.stageHeight / 2 +
        Math.random() * 200 - 100;
        addChild(dot);
      }
    }
  }
}
这里创建了一个从 -100 到 +100 的随机数,并将它加到舞台中心点上,因此所有的点在每
个轴上都不能超过 100 像素。如图 19-3 所示。
转 <wbr>第十九章 <wbr>flash实用技巧 <wbr>(1)(as3.0)

图 19-3 随机安排的点


     不赖嘛。但是如果让它们挤在一起,增加点的数量(300)并减少随机范围为 50,我们
将看到一些奇怪的事情。以下代码来自 Random2.as:
package {
  import flash.display.Sprite;
  public class Random2 extends Sprite {
    private var numDots:uint = 300;
    public function Random2() {
      init();
    }
    private function init():void {
      for (var i:uint = 0; i < numDots; i++) {
        var dot:Ball = new Ball(1, 0);
        dot.x = stage.stageWidth / 2 +
        Math.random() * 100 - 50;
        dot.y = stage.stageHeight / 2 +
        Math.random() * 100 - 50;
        addChild(dot);
      }
    }
  }
}

 


图 19-4 为运行结果。

转 <wbr>第十九章 <wbr>flash实用技巧 <wbr>(1)(as3.0)

图 19-4 这种方法形成了一个方形。看起来不再像是随机安排的


     如您所见,这些点形成了一个正方形。这样没问题,但是如果我们要制作一些爆炸效果
或星系效果等,正方形看起来就不那么自然了。如果正方形分布不是您真正想要的,那么就
继续下一项技术吧。
圆形分布
     虽然圆形分布比方形分布稍稍复杂一点,但是它真的也不难。
     首先,我们需要知道圆的半径。为了与上一个例子呼应,这里仍然使用 50。这将是从
舞台中心开始能够放置的最大半径。我们将从 0 到 50 之间取一个随机数作为点的位置。
然后从 0 到 PI * 2 个弧度 (360 度)选择一个随机的角度,再使用三角形函数找出点的 x
和 y 坐标。以下是 Random3.as 的代码:


package {
 import flash.display.Sprite;
 public class Random3 extends Sprite {
    private var numDots:uint = 300;
    private var maxRadius:Number = 50;
    public function Random3() {
      init();
    }
    private function init():void {
      for (var i:uint = 0; i < numDots; i++) {
        var dot:Ball = new Ball(1, 0);
        var radius:Number = Math.random() * maxRadius;
        var angle:Number = Math.random() * (Math.PI * 2);
        dot.x = stage.stageWidth / 2 +
        Math.cos(angle) * radius;
        dot.y = stage.stageHeight / 2 +
        Math.sin(angle) * radius;
        addChild(dot);
      }
    }
  }
}


运行结果如图 19-5 所示。

转 <wbr>第十九章 <wbr>flash实用技巧 <wbr>(1)(as3.0)

图 19-5 圆形随机分布


      这就是我前面提到的那种更加自然的分布形式。大家也许注意到了这些点似乎更集中于
圆形的中心。因为点是沿着半径平均的分布的,这就会使中心的点与边上的点同样多。但是
因为中心的空间小,也就会显得更加拥挤。
      这样的效果也许对于某些程序来说很好,但是 O’Shell (www.pixelwit.com) 的 Sean 曾
给我一次挑战,让我给出一种方法将这些点均匀地分布成圆形。不得不承认我被难倒了,我
的解决方法非常复杂。最后他给了我一个非常简单的办法,可见 Random4.as:
package {
  import flash.display.Sprite;
  public class Random4 extends Sprite {
   private var numDots:uint = 300;
   private var maxRadius:Number = 50;
   public function Random4() {
     init();
   }
    private function init():void {
      for (var i:uint = 0; i < numDots; i++) {
        var dot:Ball = new Ball(1, 0);
        var radius:Number = Math.sqrt(Math.random()) * maxRadius;
        var angle:Number = Math.random() *
        (Math.PI * 2);
        dot.x = stage.stageWidth / 2 +
        Math.cos(angle) * radius;
        dot.y = stage.stageHeight / 2 +
        Math.sin(angle) * radius;
        addChild(dot);
      }
    }
  }
}
通过取随机数的平方根,所得的结果偏向 1 而远离 0,这样做足以使分布变均匀。运行结
果如图 19-6 所示。Sean,好人呀!

转 <wbr>第十九章 <wbr>flash实用技巧 <wbr>(1)(as3.0)
图 19-6 更为均衡的分布


偏向分布
     最后,我们也许还想让物体自由地分布在整个舞台上,但是要让它们趋于在中心区域分
布。我们已经找到了分布在边缘的方法,而现在要让它们越接近中心越多。这就有点像第一
个圆形分配的例子,只不过这次要运用在矩形区域中。
     我们为每个坐标生成一个随机数,然后求它们的平均数得到最终的值。例如,假设舞台
有 500 像素宽。 如果为每个对象随机生成一个 x 坐标,那么每个对象分布在哪里的概率都
是相同的。但是如果从 0 到 500 产生两个随机数,再求平均,那么被置在舞台中心的机会
就会略高一些。
     让我们更深入地看一看这个问题。我们有一定的概率让两个数都在较“高”的范围内,
假设从 300 到 500。让两个数都得到较低范围的概率也几乎相同,从 0 到 200。但是相比
而言,一个数较高而另一个数较低,或者一个数居中另一个数较高或较低,或者都处于中等
水平的概率要更高。所有这些可能性的平均值将使大多数点更靠近舞台中心。
     OK,让我们来看代码。像平常一样,从一维的开始。下面是代码(可以在 Random5.as
中找到):
package {
  import flash.display.Sprite;
  public class Random5 extends Sprite {
    private var numDots:uint = 300;
    public function Random5() {
      init();
    }
    private function init():void {
      for (var i:uint = 0; i < numDots; i++) {
        var dot:Ball = new Ball(1, 0);
        var x1:Number = Math.random() * stage.stageWidth;
        var x2:Number = Math.random() * stage.stageWidth;
        dot.x = (x1 + x2) / 2;
        dot.y = stage.stageHeight / 2 +
        Math.random() * 50 - 25;
        addChild(dot);
      }
    }
  }
}
这里我们创建了两个随机数 x1 和 x2,并设置 dot 的 x 坐标为它们的平均值。y 坐标只
是邻近舞台中心点的一个简单的随机数。运行结果如图 19-7 所示。

转 <wbr>第十九章 <wbr>flash实用技巧 <wbr>(1)(as3.0)

图 19-7 一次迭代的偏向分布


      虽然这个效果不是很明显,但是我们已经可以看到中心位置比边缘位置的点更多一些。
创建更多的随机值,      再取它们的平均值,会使效果更加明显。我们可以将它放入一个 for 循
环中动态执行(Random6.as)        :
package {
  import flash.display.Sprite;
  public class Random6 extends Sprite {
   private var numDots:uint = 300;
   private var maxRadius:Number = 50;
   private var iterations:uint = 6;
   public function Random6() {
    init();
    }
    private function init():void {
      for (var i:uint = 0; i < numDots; i++) {
        var dot:Ball = new Ball(1, 0);
        var xpos:Number = 0;
        for (var j:uint = 0; j < iterations; j++) {
          xpos += Math.random() * stage.stageWidth;
        }
        dot.x = xpos / iterations;
        dot.y = stage.stageHeight / 2 +
        Math.random() * 50 - 25;
        addChild(dot);
      }
    }
  }
}
这里 iterations 变量控制要取多少个数的平均值。开始让 xpos 变量等于 0,然后将每个随
机数都加在上面。最后,用这个结果除以 iterations 得到最终的值。运行结果如图 19-8。

转 <wbr>第十九章 <wbr>flash实用技巧 <wbr>(1)(as3.0)

图 19-8 六次迭代的偏向分布


      现在,要 y 轴也做同样的事就非常简单了,Random7.as:
package {
  import flash.display.Sprite;
  public class Random7 extends Sprite {
   private var numDots:uint = 300;
   private var maxRadius:Number = 50;
   private var iterations:uint = 6;
   public function Random7() {
     init();
   }
   private function init():void {
     for (var i:uint = 0; i < numDots; i++) {
      var dot:Ball = new Ball(1, 0);
      var xpos:Number = 0;
      for (var j:uint = 0; j < iterations; j++) {
          xpos += Math.random() * stage.stageWidth;
        }
        dot.x = xpos / iterations;
        var ypos:Number = 0;
        for (j = 0; j < iterations; j++) {
          ypos += Math.random() * stage.stageHeight;
        }
        dot.y = ypos / iterations;
        addChild(dot);
      }
    }
  }
}


这种分布如图 19-9 所示。
转 <wbr>第十九章 <wbr>flash实用技巧 <wbr>(1)(as3.0)
图 19-9 二维的偏向分布


     在我看来,这是所有分布效果中最无规律,最具爆发性,最像星系的一种分布,虽然
它也是最复杂的。好了,我们现在至少已经掌握了四种生成随机位置的方法。
基于计时器与时间的动画
     到目前为止本书的所有例子都是通过把运动代码放到 onEnterFrame 方法中并将它赋
给一个 enterFrame 事件的处理函数来实现的。我一直认为这是最简单的一种方式,因为帧
的概念在 Flash 中根深蒂固,它就是给我们准备的;我猜我们大多都习以为常了。
     然而,对于那些从非 Flash 编程环境转来的朋友,对于这种模式可能并不习惯。对于
他们来说,时序动画模型(使用 Interval 或 Timer)似乎可以更加精准地控制动画。
     稍后,我们要来看看“基于时间的动画”,一种即能用作帧又能用作计时器的技术。

基于计时器的动画
     作为计时器动画使用的关键类,不出意料,它就是 flash.utils.Timer。同时我们还需要
flash.events.TimerEvent 类。
     使用计时器实际上与使用 enterFrame 没什么两样。只需要我们去创建一个计时器
(Timer) , 告 诉 它 多 久 “ 滴 答 响 ” 一 声 , 并 侦 听 TimerEvent.TIMER 事 件 , 就像对
Event.ENTER_FRAME 事件的侦听一样。哦,还要告诉计时器何时开始!接下来,计时器
就会每隔一段时间广播一个计时事件,         它将调用赋给它的函数进行处理。 计时器触发的间隔
以毫秒为单位,在创建该计时器时指定。让我们来看一个简单的例子(可在 Timer1.as 中找
到)  :
package {
  import flash.display.Sprite;
  import flash.utils.Timer;
  import flash.events.TimerEvent;
  public class Timer1 extends Sprite {
    private var timer:Timer;
    public function Timer1() {
      init();
    }
    private function init():void {
      timer = new Timer(30);
      timer.addEventListener(TimerEvent.TIMER, onTimer);
      timer.start();
    }
    private function onTimer(timer:TimerEvent):void {
      trace("timer!");
    }
  }
}
重要的部分加粗表示。我们创建一个计时器,告诉它每隔 30 毫秒触发一次,意味着每秒约
33 次。添加一个事件的侦听器并将它起动。 onTimer 方法与我们以前用的 onEnterFrame
类似。
      这是我们所要知道计时器的大部分内容。  它还有其它两个漂亮的特征。  一个是在创建计
时器时,可以通过第二个参数,repeatCount,告诉它运行的次数。假设我们要让计时器每秒
运行一次,总共执行 5 秒。就可以这样做:
      timer = new Timer(1000, 5);
如果没有指定重复的次数,或传入 0,那么计时器将无限地运行。
      另一个好东西是可以让计时器在某个点上启动或停止,只需要调用 timer.stop 或
timer.start 即可。在某些例子中,这样做比删除和重新加入事件侦听器更简单一些。
      与 enterFrame 相比,很多朋友更喜欢使用计时器的原因是,理论上讲,计时器可以让
我们控制动画的速度——这是对于帧的不精确性的一个重大改进。      我之所以说“理论上讲”,
是因为这里有些事情需要弄清楚。
      首先, 实际上计时器要依赖于帧频。 另一个原因是计时器的事件函数中的代码会增加整
个计时器间隔。    稍后我会解释一下第二点。现在,让我们看看计时器是如何与帧频相关联的。
下面是文档类 Timer2.as,使用到我们著名的 Ball 类。
package {
  import flash.display.Sprite;
  import flash.utils.Timer;
  import flash.events.TimerEvent;
  public class Timer2 extends Sprite {
   private var timer:Timer;
   private var ball:Ball;
   public function Timer2() {
     init();
   }
private function init():void {
 stage.frameRate = 1;
      ball = new Ball();
      ball.y = stage.stageHeight / 2;
      ball.vx = 5;
      addChild(ball);
      timer = new Timer(20);
      timer.addEventListener(TimerEvent.TIMER, onTimer);
      timer.start();
    }
    private function onTimer(event:TimerEvent):void {
      ball.x += ball.vx;
    }
  }
}
这里我们把创建出来的小球放在舞台的左侧。让它以 vx 为 5 的速度穿过舞台。然后设置
一个 20 毫秒的计时器,每秒约调用 50 次。同时设置影片的帧频为 1 就是为了看看帧频
是否会对计时器有影响。
        测试后,我们会看到小球没有平稳地穿过屏幕,而是每秒钟跳一下 —— 以帧的频率。
每跳一次都会大于 5 像素。为什么呢?
        回想一下一、二章的动画基础,我们知道模型是需要更新的,所以屏幕要根据新的模型
被刷新。    这里时间间隔函数确实将更新了模型并将小球每次移动 5 像素,但是只有在 Flash
进入新的一帧时才进行刷新。仅仅运行一个函数不会驱使 Flash 进行重绘。
        幸运的是,Macromedia (现在的 Adobe) 的好人们看到了这个问题并给了我们另一个小
工具:updateAfterEvent。最初是在 Flash MX 中介绍的,现在它是传给计时器事件函数中
TimerEvent 对象的一个方法。就像它的名字一样,在事件之后刷新屏幕的。当然,由于它
是 TimerEvent 类的一个方法,所以只有在收到一个事件后才能被调用。    (事实上,它也是
KeyboardEvent 和 MouseEvent 的方法,因此也能在这些处理函数中调用。    )
这样一来,我们可以修正一下 onTimer 事件:
private function onTimer(event:TimerEvent):void {
  ball.x += ball.vx;
  event.updateAfterEvent();
}
现在一切有所好转了。非常流畅。但是如果您意识到小球应该每秒更新 50 次,我们看到的
基本上应该是一个 50 fps 的动画。这就意味着小球的运动应该比第四章创建的 fps 小于
50 的 enterFrame 事件的例子更为流畅。但是实际的运动更为缓慢。
      问题出来了,计时器在某种程度上要依赖于帧频。通过我的测算,在帧频为 1 fps 时,
我们所得到的计时器运行的最快间隔大约为 100 毫秒。
      我已经听到了嘲笑:每帧只得到了 10 次间隔。所以,试将帧频改为 5。它允许每秒更
新 50 次。在我看来,仍然不是很流畅。如果不大于每秒 10 帧的话是不会达到真正流畅的
效果。因此,我们可以看到使用计时器并不能完全让我们从帧频的铐链中解脱出来。
      下一个问题是计时器内部是怎样工作的,它会对计时的精确度产生多大的影响。当
timer.start() 被调时,实际上发生了什么,Flash 等待一段指定的时间,然后广播事件,运行
与该计时器相关的处理函数。只有当函数执行完成后计时器才开始定时下一次计时。看一个
例子,  假设我们有一个每 20 毫秒运行一次计时器。   假设在处理函数中有大量的代码需要执
行 30 毫秒。下一轮定时只有在所有的代码都运行完成后才开始。这样一来,我们的函数会
在大约每 50 毫秒调用一次。 因为在用户的机器上没法精确地知道代码会运行多快,所以多
数情况下,计时器动画不会比帧动画精确多少。
    如果您需要真正的精确,那么基于时间的动画则是我们的必经之路。

 

 


 

(如果要转载请注明出处http://blog.sina.com.cn/jooi,谢谢)

STM32H750 内部FLASH介绍及应用 STM32H750VBT6的内部Flash实际上是128KB封装的QSPI NOR Flash,映射到0x08000000地址,支持XIP执行。其核心特性包括16KB扇区结构、100,000次擦写耐久性、20年数据保持能力。操作流程需先解锁、擦除扇区、编程32位字/64位双字数据,最后重新锁定。与外部QSPI Flash相比,内部Flash更适合存储小型固件和关键参数,而大容量存储建议使用外部Flash。实际应用中需注意H750的特殊架构,其Flash操作本质是通过QSPI接口实现的。 阅读详情

相关推荐

UsageLog电脑使用记录软件

UsageLog电脑使用记录软件

Flash ActionScript (12)间隔循环的3种表现方式

间隔循环的三种表现方式,如果想使动画不依赖于帧频,可使用3种方法: 1、setlnterval()函数 setlnterval()函数作用是每隔一定的时间,就调用函数 setlnterval()函数的形式为: setlnterval(函数名,时间间隔,函数参数); 函数名是自定义的函数的名,时间间隔为毫秒,函数参数是自定义函数的参 下面制作一个计时器...

weixin_34277853的博客 318

最新推荐-2026年固态电池+锂电正极+硅基负极等关键技术实践PPT合集(55份).zip

2026年最新固态电池+锂电正极+硅基负极等关键技术实践PPT合集,共55份。供大家查阅。 一、固态电池 1.全固态电池用硅基负极材料研究进展 2.全固态电池硅基负极的开发思考 3.功能型固态电解质设计及界面调控 4.固态电池及关键材料研发与产业化进展 5.固态电池的产业化应用探索 6.固态锂电池开发现状及未来展望 7.固态锂离子电池正极结构设计与材料选择 8.固态锂金属电池设计与应用 9.硫化物全固态电池石墨和硅负极性能调控技术 10.硫化物固态电解质行业应用 11.聚合物基固态电解质与固态电池的关键技术 12.蜂鸟声共振技术-固态电池产业化的革命性创新 13.长安汽车固态电池应用探索 14.高安全性固态电池技术发展趋势 15.高性能硫化物全固态锂电池解决方案 16.高硅体系的膨胀解决方案 二、硅基负极 1.化学气相沉积碳包覆技术在硅基负极材料中的应用 2.新型粘结剂解决 硅基负极膨胀问题 3.氧化亚硅负极材料化学预锂化与界面设计 4.流化床法生产磷酸铁锂及硅负极材料研究 5.石墨烯包覆硅碳负极 6.硅基材料的发展现状及展望 7.硅基负极与固态电解质 8.硅基负极技术与进展 9.硅基负极材料体积膨胀解决策略 10.硅基负极材料及其结构设计 11.硅基负极材料的冶金法制备 12.硅基负极材料的发展与应用 13.硅基负极材料研究进展 14.硅基负极材料:从基础研究到产业应用 15.硅基负极析锂行为及调制研究 16.硅碳负极低成本制造技术报告 17.硅碳负极制备用多孔碳的开发 18.硅碳负极挑战和进展 19.硅碳负极新路线及关键材料制备 20.硅碳负极锂离子电池应力特性研究 21.锂电石墨负极材料工程化技术进步 22.锂离子电池负极材料 23.高容量石墨烯-硅基复合负极材料的研究进展 三、锂电正极 1.基于AI和图论结构化学的锂电池的材料基因探索 2.废旧磷酸铁锂电池梯次及再生利用进展 3.电动汽车大功率充电标准体系与检测认证实践 4.磷酸铁及磷酸铁锂异物防控管理 5.磷酸铁锂正极材料:液相法合成及产业化应用研究 6.磷酸锰铁锂正极材料的研究现状 7.车用动力电池安全标准化工作进展及未来展望 8.锂电层状氧化物正极材料的原子尺度失效机制 9.锂电正极材料工厂异物防控管理图册 10.锂离子电池高熵正极材料成分设计及储锂机制研究 11.高压实磷酸铁锂正极材料生产工艺配方.docx 12.高安全正极材料添加剂提升三元锂电安全性 13.高比能富锂锰基电池关键技术 14.高能量密度锂离子电池正极材料及应用研究 15.高镍单晶三元正极材料研究 16.三元高电压单晶正极材料

Flash动画教程学习(一)--动画基础

第一部 ActionScript动画基础 第二章 动画基础 类和OOP: 基类、包、导入、构造函数、继承、 Sprite精灵 移除侦听事件:removeEventListener(,); 帧循环: 默认循环、gotoAndPlay() addChild添加元件到舞台上 removeChild将一个元件从舞台移除,却不删除 鼠标事件: ...

weixin_30722589的博客 219

Zotero 是学术管理领域非常优秀的软件 它功能成熟、生态稳定,帮助许多科研人员建立了最初的文献归档体系

Zotero 是学术管理领域非常优秀的软件。它功能成熟、生态稳定,帮助许多科研人员建立了最初的文献归档体系。但在当下日常科研与深度使用各类 Agent 时,传统的文献工具链暴露出一些断点:上下文严重分散:论文存储在 Zotero,笔记记在 Obsidian,与模型的推导和分析留在各个网页对话框中。三者数据彼此隔离,当需要 Agent 结合某篇具体论文与历史笔记进行深入推导时,用户必须反复手动复制粘贴。文献格式对模型不友好:人类习惯阅读排版良好的 PDF 文件;但对于模型而言,直接解析双栏排版、跨页表格、复杂数学公式和交叉引用的成本极高,极易产生识别错误与幻觉。结构化 Markdown 与 LaTeX 才是模型容易准确理解的格式。维护成本较高:AI 伴读、全文翻译、笔记同步等高频需求,往往需要安装和调试多个社区插件,配置门槛高且在版本升级时容易出现兼容性问题。批量自动化能力有限:通过 Deep Research 或自动化检索工具发现的大量文献,目前仍需人工在浏览器中逐篇点击保存,难以顺畅衔接批量研究流。Agentero 并非旨在替代 Zotero,而是探索一种人与 Agent 协同处理科研上下文的新方式:人类负责:提出研究问题、进行学术价值判断、深度研读与核心结论推导;Agent 负责:批量检索筛选、元数据抓取、图表与公式提取、引用关系梳理及基础总结。

基于 .net 8、blazor 、furion 开发的后台管理系统,功能全(完善的用户权限管理、定时任务、附件管理、日志审计、物联网、企业门户等)、技术新

基于 .net 7开发的后台管理系统,系统前后台分离,api 是基于Furion 框架开发,前端是基于ant-design-blazor开发,系统使用技术或框架较新

FLASH实用代码大全(二)

30.问:如何优化Flash动画,使文件更小,播放更流畅?答: Flash作为Macromedia公司出品的网页制作与动画创作的专业软件,操作简便,功能强大,现已成为交互式矢量图形和Web动画事实上的标准。  但是,如果制作的Flash电影文件较大,动辄几百k的话,常常会让网上浏览者在不断等待中失去耐心。对Flash电影进行优化就显得很有必要了,但前提是我们不能有损电影的播放质量。  1....

weixin_34308389的博客 2968

材料科学基于电致塑性效应的多场耦合精密成形:难变形合金超薄带材低缺陷轧制工艺

内容概要:本文系统阐述了合金在电、热、力多场耦合作用下的电致塑性精密成形工艺(Electrically-Assisted Rolling, EAR),重点介绍其通过瞬时脉冲电流实现材料“成形时软、用时强”的核心技术原理。该工艺利用电子风力、焦耳热微区软化等非热与热效应协同作用,降低难变形合金的流动应力,提升单道次压下率(如SUS304由33.8%提升至41.5%),显著减少中间退火次数,实现数十微米级极薄带材的高效、低残余应力、高平整度轧制。文章详细分析了工艺参数(电流密度、频率、脉宽、温度窗口等)、装备配置(脉冲电源、绝缘辊系、在线检测)及失效模式控制,并强调需以“变形区有效电流密度”和“窄温区闭环控制”为核心进行工艺设计与优化。; 适合人群:从事金属材料加工、精密轧制、先进成形技术研发的科研人员与工程技术人员,具备材料科学与工程、机械制造或相关领域背景的研发工程师及研究生。; 使用场景及目标:①开发高强钛合金、不锈钢、特种合金等难变形金属的超薄精密箔材(如折叠屏基材、光刻机钢带);②优化现有冷轧工艺,降低能耗与退火次数,提升产品尺寸精度与表面质量;③研究电-热-力多场耦合成形机理,指导新型电辅助制造装备开发。; 阅读建议:本文兼具理论深度与工程实践指导意义,建议结合图表与实测数据理解多机制协同效应,重点关注电流回路设计、温度场闭环控制与参数标定方法,避免直接套用文献参数;在应用中应坚持“实验标定+仿真验证”原则,确保工艺安全性与可重复性。

dev c++怎么调试_探索者 STM32F407 开发板资料连载第十九章 USMART 调试组件实验

1)实验平台:alientek 阿波罗 STM32F767 开发板2)摘自《STM32F7 开发指南(HAL 库版)》关注官方微信号公众号,获取更多资料:正点原子第十九章 USMART 调试组件实验本章,我们将向大家介绍一个十分重要的辅助调试工具:USMART 调试组件。该组件由ALIENTEK 开发提供,功能类似 linux 的 shell(RTT 的 finsh 也属于此类)。USMART 最...

weixin_39992417的博客 181

电气工程基于电磁原理的继电器工作机理与应用:工业控制中强弱电隔离开关的设计选型及保护电路分析

内容概要:本文深入浅出地介绍了继电器的工作原理、核心结构、分类、常见应用场景及选型要点。继电器是一种利用小电流控制大电流的“自动开关”,通过线圈通电产生磁场,驱动衔铁吸合或释放,从而控制触点的通断。文章详细解析了其五大组成部分(线圈、铁芯、衔铁、弹簧、触点)和工作三步循环过程,强调了强弱电隔离的优势,并区分了常开、常闭和转换型触点的应用。同时,文章列举了继电器在工业控制、汽车电子、家用电器、新能源和电力系统中的典型应用,重点指出高压直流继电器在新能源汽车中的关键作用。针对选型,强调需根据负载类型(阻性、感性、容性)进行降额使用,并介绍续流二极管、RC吸收电路等保护措施以延长寿命。最后对比了电磁继电器与固态继电器的优缺点,帮助读者合理选择。; 适合人群:具备基础电工知识,从事电子、电气、自动化相关工作的技术人员或爱好者,以及工科类学生。; 使用场景及目标:①理解继电器在电路控制中的隔离与放大作用;②掌握继电器的选型方法与常见故障排查技巧;③应用于实际项目中如电机控制、电源管理、自动化系统设计等; 阅读建议:结合实物或电路图对照学习,重点关注触点保护与负载匹配部分,在实际应用中注意降额设计与环境因素影响。

智算中心AI大模型赋能智能体平台及AI场景应用规划方案(决策评审版).pptx

智算中心AI大模型赋能智能体平台及AI场景应用规划方案(决策评审版).pptx

dev c++调试怎么看变量的值_探索者 STM32F407 开发板资料连载第十九章 USMART 调试组件实验...

1)实验平台:alientek 阿波罗 STM32F767 开发板2)摘自《STM32F7 开发指南(HAL 库版)》关注官方微信号公众号,获取更多资料:正点原子第十九章 USMART 调试组件实验本章,我们将向大家介绍一个十分重要的辅助调试工具:USMART 调试组件。该组件由ALIENTEK 开发提供,功能类似 linux 的 shell(RTT 的 finsh 也属于此类)。USMART 最...

weixin_32534073的博客 195

Everything-v.1.4.1.1032 -X64-号称全世界查找文件最快的工具-便携版 .zip

Everything_v.1.4.1.1032 _X64_号称全世界查找文件最快的工具_便携版 .zip

百例看完啦,学习小总结

到今天为止我的百例总算是看完啦,从年前一直看到现在,应该是从2012年1月7号~2012年2月1号一直在研究《百例》,它真的是本不错的书,适合想入门的初学者,譬如:俺。呵呵。。。每个例子不但有针对性,而且在每个例子里还可以复习以前的知识点,当你遇到看不懂的代码时,只要顺着不懂得代码往右再看一眼,就可以看到清清楚楚的注释了,而且注释的很清楚,很容易看懂。极力推荐《百例》,初学者一定要看。

葵歌小妖 1395

基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究(Matlab代码实现)

内容概要:本文系统研究了基于序贯蒙特卡洛模拟法的配电网可靠性评估方法,重点在于通过Matlab编程实现对含分布式电源的配电网在多种运行条件下的可靠性量化分析。文章深入阐述了序贯蒙特卡洛模拟的核心原理,包括系统状态的时序抽样、状态转移机制以及故障与修复过程的随机建模,并构建了完整的仿真流程以计算系统平均停电频率(SAIFI)、系统平均停电持续时间(SAIDI)等关键可靠性指标。研究结合典型配电网络算例,验证了该方法在评估复杂电力系统可靠性方面的有效性与实用性,尤其分析了分布式电源接入对系统可靠性的影响机制,为现代配电网规划与运行提供了科学依据和技术支撑。; 适合人群:具备电力系统基础理论知识和一定Matlab编程能力的高校研究生、科研机构研究人员,以及从事配电网规划、运行与可靠性管理的工程技术人员。; 使用场景及目标:①深入掌握序贯蒙特卡洛模拟法在电力系统可靠性评估中的具体实施过程与技术细节;②学习并实践利用Matlab进行电力系统时序仿真与可靠性指标统计分析的方法;③探究分布式电源渗透对配电网整体可靠性水平的影响规律,为提升电网韧性提供决策参考; 阅读建议:读者应结合文中提供的Matlab代码实例进行实操演练,建议在理解算法逻辑的基础上,尝试修改系统参数、网络拓扑结构或调整分布式电源的配置方案,通过对比仿真结果加深对可靠性评估过程和影响因素的理解,该资源亦可直接应用于相关科研课题或工程项目的技术论证。

塔式熔盐光热朗肯循环电站建模!并且搭建了Simulink模型!!

内容概要:本文详细介绍了塔式熔盐光热朗肯循环电站的系统建模过程,并成功构建了相应的Simulink仿真模型。研究不仅涵盖电站热力循环的核心建模,还深入集成电力系统的关键环节,包括一次调频与二次调频控制、风光水火储多能互补的双目标动态调度、化学储能与超级电容混合储能系统的双层容量配置、风电功率波动的RLMD分解与平抑、综合能源系统多目标优化配置等关键技术。同时,文中应用了多种先进优化算法,如多目标粒子群算法(MOPSO)、基于核密度估计(KDE)的CDF置信带鲁棒调度方法等,形成了从系统建模、仿真到优化决策的完整技术链条,为新型电力系统的分析与设计提供了综合性解决方案。; 适合人群:具备电力系统、新能源科学、自动化控制、热能工程等相关专业背景,熟悉MATLAB/Simulink仿真平台,从事能源系统建模、优化调度、储能控制、电力电子与电网稳定性研究的科研人员、研究生及工程师。; 使用场景及目标:① 为塔式光热电站及综合能源系统相关的教学与科研工作提供详尽的Simulink建模范例与Matlab代码参考;② 实现对高比例新能源接入背景下电网的频率响应、动态调度、储能优化配置等问题的仿真分析与控制策略验证;③ 利用所提供的完整代码与模型,复现并深入研究多目标优化、鲁棒调度、信号分解等先进算法在复杂能源系统中的具体应用。; 阅读建议:此资源以实际工程项目为导向,深度融合了系统建模、仿真验证与优化算法三大核心环节。使用者应在深入理解文档中所涉基础理论(如朗肯循环原理、调频控制机制、SVPWM调制技术等)的基础上,结合所提供的Simulink模型与Matlab代码进行动手实践,通过调整系统参数、优化算法配置等方式,探究系统动态特性与优化机制。同时,强烈建议关注文末提供的完整资源下载链接,以获取全部配套的仿真文件、计算书及参考文献,确保学习的完整性与可复现性。

ADSP-BF533的视频教程下载(40个中文视频教程教会你用ADI的Blackfin系列DSP)

曾经为ADI的BF系列录了40个视频教程,从处理器内核、外设、驱动、应用全方位讲解,想做ADI BF系列DSP的入门必选,有兴趣的可以看一下。

ADI_OP的博客 639

【DBO三维路径规划】基于多策略改进的蜣螂算法MSDBO多无人机协同集群避障路径规划(目标函数:最低成本:路径、高度、威胁、转角)研究(Matlab代码实现)

内容概要:本文研究基于多策略改进的蜣螂算法(MSDBO)在多无人机协同三维避障路径规划中的应用,旨在实现最低成本的路径规划,综合考虑路径长度、飞行高度、环境威胁和飞行转角等多个目标函数。通过Matlab代码实现算法仿真,优化无人机集群在复杂三维空间中的协同飞行路径,有效规避静态与动态障碍物,提升任务执行效率与飞行安全性。该方法融合智能优化算法与路径规划技术,针对城市空中交通、应急救援、军事侦察等实际场景需求,提出了高效的分布式协同求解框架,为多无人机系统在复杂环境下的自主导航与集群控制提供了理论依据和技术支撑。; 适合人群:具备一定编程基础和优化算法知识的科研人员、自动化与人工智能领域研究生、从事无人机路径规划或智能优化算法开发的工程师。; 使用场景及目标:①应用于多无人机协同执行任务时的三维路径规划与动态避障;②解决复杂环境中多目标优化路径问题,提升集群飞行的安全性与经济性;③为智能交通、灾害巡检、城市物流等场景提供可扩展的算法支持;④支持进一步研究算法在异构无人机集群、实时通信受限条件下的适应性改进。; 阅读建议:建议读者结合Matlab代码进行实践操作,深入理解蜣螂算法的改进策略及其在路径规划中的具体实现方式,同时可通过调整环境参数、障碍物分布及目标权重进行扩展性研究,探索算法在不同任务场景下的性能表现与优化潜力。

上一篇: 转 第十八章 矩阵数学 (as3.0)
下一篇: 转 第十九章 flash实用技巧 (2)(as3.0)
coding_most
博客等级 码龄15年 13粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值