转 第十五章 3D 基础 (2)(as3.0)

搞定ESD(九):静电放电之PCB设计 不同信号参考地平面应尽量保持完整,减小静电电流流过参考地平面时造成的电位差,防止电位差导致的信号传输电平错误.主芯片GPIO信号布线应保持最短化,减小与参考地平面之间的电场耦合,同时也防止因信号环路面积较大耦合静电放电噪声干扰。外部端子接地引脚顶层采用分地设计,最好是直接过孔到完整参考地平面接地,避免与顶层信号包地、其它包地相连,防止顶层串扰耦合到其它信号,造成ESD问题。 阅读详情

Z  排序
     在添加了多个物体后代码中显现出了一个新问题---称为z  排序。Z  排序就像它的名
字一样:物体如何在 z  轴上进行排序,或者说哪个物体在前面。由于物体都使用纯色,所
以看起来不是很明显。为了让效果更加明显,请将 Ball3D  的 init  方法改为以下代码,并
运行刚才那个程序:
public function init():void {
 graphics.lineStyle(0);
 graphics.beginFill(color);
  graphics.drawCircle(0, 0, radius);
 graphics.endFill();
}

     通过给小球添加轮廓线,我们就可以看出哪个小球在前面了。这几乎毁掉了整个 3D  效
果,因为现在较小的物体出现在了较大物体的前面。Z  排序就是用来解决这个问题的,但
不是自动的。Flash  不知道我们在模拟 3D。它只知道我们在移动和缩放影片。它也不知道
我们到底是使用左手还是右手坐标系。在小球远离时应该将这个小球放在相邻小球的后面。
Flash  只根据在显示列表中的相对索引进行排序。在 AS 2 中,z  排序只需要改变影片剪辑
的深度即可完成。swapDepths(深度)。深度较高的影片剪辑出现在深度较低的影片的前面。
然而在 AS 3  中,操作会稍微有些复杂。对于显示列表没有可以任意修改的深度值。显示列
表的作用更像是与个数组。列表中的每个显示对象都有一个索引。索引从 0  开始,直到列
表中所有对象的个数。例如,假设在类中加入三个影片 A, B, C。它们的索引应该是 0, 1, 2。
无法将其中的一个影片的索引设置为 100,或 -100。如果已经删除了 B 影片,那么这时 A
和 C  影片的索引应该是 0  和 1。明白了吧,在显示列表中永远没有“空间”这个概念
     根据深度,索引 0  是最低的,任何深度较高的显示对象都将出现在这个较低对象的前
面。我们可以用几种不同的方法来改变物体的深度:
■ setChildIndex(child:DisplayObject, index:int) 给对象指定索引值(index)。
■ swapChildren(child1:DisplayObject, child2:DisplayObject) 交换两个指定的对象。
■ swapChildrenAt(index1:int, index2:int)  交换两个指定的深度。
使用 setChildIndex 是最简单的。因为我们已经有了一个 balls 数组。可以根据小球的 z 轴
深度从高到低来排序这个数组,然后从 balls 的 0(最远的)  到 49(最近的)为每个小球
设置索引。请看下面这段代码:

private function sortZ():void {
 balls.sortOn("zpos", Array.DESCENDING | Array.NUMERIC);
  for (var i:uint = 0; i < numBalls; i++) {
   var ball:Ball3D = balls[i];
  setChildIndex(ball, i);
 }

}
     根据数组中每个对象的 zpos  属性对该数组进行排序。因为指定了数组的
DESCENDING  和 Array.NUMERIC,则是按数值大小反向排序的——换句话讲,就是从高
到低。结果会使最远的小球(zpos  值最高的)将成为数组中的第一个,最近的将成为最后
一个。
     然后循环这个数组,将每个小球在显示列表中的索引值设置为与当前在数组中的索引值
相同。
     将这个方法放入类中,只需要在小球移动后调用它即可,将函数调用放在 onEnterFrame
方法的最后:

private function onEnterFrame(event:Event):void {
  for (var i:uint = 0; i < numBalls; i++) {
   var ball:Ball3D = balls[i];
  move(ball);
 }
 sortZ();
}
     剩下的代码与上一个例子中的相同。全部代码可在 Zsort.as  中找到。
 

 

重力
     这里我们所说的重力就像地球表面上的重力一样,如第五章所讲的。既然这样 3D 的
重力和 2D  的就很像了。我们所需要做的就是选择一个施加在物体上的重力值,并在每帧
中将它加入到物体的速度中。
     由于 3D  的重力非常简单,我差点就跳过去说“是的,同 2D  一样。OK,下一话题。”
但是,我决定将它放到一个很好的例子中加以解释,让大家知道即使很简单的东西也可以创
造出非常棒的效果,就像 3D  烟火一样。
     首先,我们需要找个物体代表一个单独的“烟火”——我们知道,这些发光的点可以组
合到一起形成巨大的爆炸。我们给忠实的 Ball3D  类一个较小的半径值,就可以完成这个目
的。只要给每个小球一个随机的颜色效果就会非常漂亮。如果将背景色设置为黑色就更好了。
我使用 SWF  元数据来完成这个设置,但如果是在 Flash CS3 IDE  中,只需要简单地改变
一下文档属性的背景色即可。
     我确信大家现在一定能够完成。先将所有的代码列出来(Fireworks.as),随后加以解释。

package {
 import flash.display.Sprite;
 import flash.events.Event;
 [SWF(backgroundColor=0x000000)];
  public class Fireworks extends Sprite {
   private var balls:Array;
   private var numBalls:uint = 100;
   private var fl:Number = 250;
   private var vpX:Number = stage.stageWidth / 2;
   private var vpY:Number = stage.stageHeight / 2;
   private var gravity:Number = 0.2;
   private var floor:Number = 200;
   private var bounce:Number = -0.6;
   public function Fireworks() {
   init();
  }

 private function init():void {
  balls = new Array();
   for (var i:uint = 0; i < numBalls; i++) {
    var ball:Ball3D = new Ball3D(3, Math.random() * 0xffffff);
   balls.push(ball);
   ball.ypos = -100;
    ball.vx = Math.random() * 6 - 3;
    ball.vy = Math.random() * 6 - 6;
    ball.vz = Math.random() * 6 - 3;
   addChild(ball);
  }
  addEventListener(Event.ENTER_FRAME, onEnterFrame);
 }
 private function onEnterFrame(event:Event):void {
   for (var i:uint = 0; i < numBalls; i++) {
   var ball:Ball3D = balls[i];
   move(ball);
  }
  sortZ();
 }

 private function move(ball:Ball3D):void {
  ball.vy += gravity;
  ball.xpos += ball.vx;
  ball.ypos += ball.vy;
  ball.zpos += ball.vz;
   if (ball.ypos > floor) {
   ball.ypos = floor;
   ball.vy *= bounce;
  }
   if (ball.zpos > -fl) {
   var scale:Number = fl / (fl + ball.zpos);
    ball.scaleX = ball.scaleY = scale;
    ball.x = vpX + ball.xpos * scale;
    ball.y = vpY + ball.ypos * scale;
   ball.visible = true;
  } else {
   ball.visible = false;
  }
 }
 private function sortZ():void {
  balls.sortOn("zpos", Array.DESCENDING | Array.NUMERIC);
   for (var i:uint = 0; i < numBalls; i++) {
   var ball:Ball3D = balls[i];
   setChildIndex(ball, i);

  }
  }
 }
}
     首先加入一些属性:gravity, bounce, floor。前两个大家都见过。Floor  属性就是  --

bottom --也就是物理反弹之前可以运动到的 y 值。除了增加 y  轴速度以及碰撞地
面后的反弹以外,所有的内容我们前面都介绍过,是不是越来越酷了,哈?
     运行结果如图 15-6 所示。

转 <wbr>第十五章 <wbr>3D <wbr>基础 <wbr>(2)(as3.0)

图 15-6  烟火(相信我,运动中的效果更好)

屏幕环绕
     回忆一下第六章,我们说过三种当物体碰到边界后受到反作用力的可能。目前为
们只介绍了反弹。还有两个:屏幕环绕与重置。对于 3D  而言,我发现屏幕环绕效果是最
为有用的,但只能在 z 轴上使用。
    2D  屏幕环绕中,在 x  或 y  轴上判断物体是否出了屏幕。效果非常好,因为当物体超
出了其中一个边界时就看不到它了,因此可以轻松地重新设置物体的位置,不会引起人们的
注意。但是 3D  中就不能这么潇洒了。
     在 3D  中,实际上只有两个点可以安全地删除和重置物体。一个就是当物体运动到观
察点的后面。前面例子中,将物体设置为不可见时,就是这个道理。另一个就是当物体的距
离太远和太小时也可以将其设为不可见的。这就意味着我们可以在 z  轴上安全地进行屏幕
包装。当物体走到身后时,就将它放到面前的远方。如果物体离得过远,超出了可见范围,
就可以删除它并将其重置到身后。如果大家喜欢 x, y  轴也可以这样做,但是多数情况下,
这么做会导致一些不自然的忽隐忽现的效果。
     还好 z 轴的环绕可以是相当常用的。我曾用它制作出真实的 3D 赛车游戏,下面我们
就来制作其中的一部分。
     主体思想是把不同的 3D  物体放到观察点前。然后将这些物体向观察点移动。换句话
讲,给它们一些负的 z  速度。这要看我们如何设置了,可以让物体向我们走来,让眼睛以
为是我们向物体走去。一旦物体走到了观察点后,就将它重置到眼前一段距离。这样就可以
永无止境地掠过这些物体了。
     本例中使用的物体是一棵线条化的树。创建一棵带有随机枝叉的树形结构。我确信
能做得更好!
     绘制树的代码放在名为 Tree  的类中,下面会看到,用三个位置属性以及随机绘制树枝
的代码来代表一颗树。

 

package {
 import flash.display.Sprite;
  public class Tree extends Sprite {
   public var xpos:Number = 0;
    public var ypos:Number = 0;
   public var zpos:Number = 0;
   public function Tree() {
   init();
  }
   public function init():void {
   graphics.lineStyle(0, 0xffffff);
     graphics.lineTo(0, -140 - Math.random() * 20);
     graphics.moveTo(0, -30 - Math.random() * 30);
     graphics.lineTo(Math.random() * 80 - 40,
     -100 - Math.random() * 40);
     graphics.moveTo(0, -60 - Math.random() * 40);
     graphics.lineTo(Math.random() * 60 - 30,
     -110 - Math.random() * 20);
  }
 }
}

  同样,还是使用 SWF  元数据将背景色设置为黑色。大家可以创建任何喜欢的物体,
想要多复杂都可以自行设置。在文档类中创建所有的树(100  左右)。随机分散在 x  轴上,
每个方向 1000  像素。它们同样随机分散到 z  轴上,从 0  到 10000。它们都以 floor  属性
为基础,具有相同的 y 坐标,给人一种地平面的感觉。
     以下是代码(可以见 Trees.as):
Here’s the code (which you can also find in Trees.as):
package {
 import flash.display.Sprite;
 import flash.events.Event;
 import flash.events.KeyboardEvent;
 import flash.ui.Keyboard;
 [SWF(backgroundColor=0x000000)];
  public class Trees extends Sprite {
   private var trees:Array;
   private var numTrees:uint = 100;
   private var fl:Number = 250;
   private var vpX:Number = stage.stageWidth / 2;
   private var vpY:Number = stage.stageHeight / 2;
   private var floor:Number = 50;
   private var vz:Number = 0;
   private var friction:Number = 0.98;

 public function Trees() {
  init();
 }
 private function init():void {
  trees = new Array();
   for (var i:uint = 0; i < numTrees; i++) {
   var tree:Tree = new Tree();
   trees.push(tree);
     tree.xpos = Math.random() * 2000 - 1000;
   tree.ypos = floor;
   tree.zpos = Math.random() * 10000;

    addChild(tree);
   }
   addEventListener(Event.ENTER_FRAME, onEnterFrame);
   stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
  }
   private function onEnterFrame(event:Event):void {
     for (var i:uint = 0; i < numTrees; i++) {
    var tree:Tree = trees[i];
    move(tree);
   }
   vz *= friction;
   sortZ();
  }
   private function onKeyDown(event:KeyboardEvent):void {
     if (event.keyCode == Keyboard.UP) {
    vz -= 1;
     } else if (event.keyCode == Keyboard.DOWN) {
    vz += 1;
   }
  }
   private function move(tree:Tree):void {

   tree.zpos += vz;
     if (tree.zpos < -fl) {
    tree.zpos += 10000;
   }
     if (tree.zpos > 10000 - fl) {
    tree.zpos -= 10000;
   }
     var scale:Number = fl / (fl + tree.zpos);
     tree.scaleX = tree.scaleY = scale;
     tree.x = vpX + tree.xpos * scale;
     tree.y = vpY + tree.ypos * scale;
   tree.alpha = scale;
  }
   private function sortZ():void {
   trees.sortOn("zpos", Array.DESCENDING | Array.NUMERIC);
     for (var i:uint = 0; i < numTrees; i++) {
    var tree:Tree = trees[i];
    setChildIndex(tree, i);
   }
  }
 }
}

  请注意,这里只有一个 z 轴速度变量,因为树不需要在 x 或 y  轴上进行移动,所有
的移动都在 z  轴上。在 onEnterFrame 方法中,判断方向键上和下,增加或减少 vz。加入
一点点摩擦力让速度不会增加到无限大,在按键松开时将速度降下来。
     代码循环获得每棵树,用当前 z  速度更新该树的 z  坐标。然后判断这棵树是否走到了
我们的身后。如果是,将这个棵树向 z 轴内移动 10000  像素。否则,如果超过了 10000  –
fl,就将该树往回移动 10000  像素。再执行标准透视动作。为了更好地加强立体感我还加

入了一个小小的设计:
    tree.alpha = scale;
根据 z  轴的深度设置树的透明度。离得越远颜色越淡。这是大气透视,模拟大气与观察者
和物体之间的效果。这是本例中表现物体远离时一种特殊效果。这个特殊的设计给了我们黑
暗的效果和幽深的夜。大家也许可以试试这种方法:
       tree.alpha = scale * .7 + .3;
让树的可见度至少为 30%。看上去不再那么朦胧。这里没有正确或错误可言--只有不同
的数值创造不同的效果。
    大家也许注意到了,我仍把 z 排序方法留在这里。在这个特殊的例子中,它没有发挥
本应有的作用,因为树都是由同一颜色的简单线条构成的,但如果绘制的是一些非常复杂的
或重叠的图形,那么它的存在就是至关重要的了。
     本文件的运行结果  15-7  所示。

转 <wbr>第十五章 <wbr>3D <wbr>基础 <wbr>(2)(as3.0)

图 15-7  当心小树!
     下面我将给大家一个加强的例子,让我们看一下还可以做到什么样的程度。以下是程
(可以在 Trees2.as  中找到):
package {
 import flash.display.Sprite;
 import flash.events.Event;
 import flash.events.KeyboardEvent;
 import flash.ui.Keyboard;
 [SWF(backgroundColor=0x000000)];
  public class Trees2 extends Sprite {
   private var trees:Array;
   private var numTrees:uint = 100;
   private var fl:Number = 250;
   private var vpX:Number = stage.stageWidth / 2;
   private var vpY:Number = stage.stageHeight / 2;
   private var floor:Number = 50;
   private var ax:Number = 0;

   private var ay:Number = 0;
   private var az:Number = 0;
   private var vx:Number = 0;
    private var vy:Number = 0;
   private var vz:Number = 0;
   private var gravity:Number = 0.3;
   private var friction:Number = 0.98;
   public function Trees2() {
   init();
  }
   private function init():void {
   trees = new Array();
     for (var i:uint = 0; i < numTrees; i++) {
    var tree:Tree = new Tree();
    trees.push(tree);
       tree.xpos = Math.random() * 2000 - 1000;
    tree.ypos = floor;
    tree.zpos = Math.random() * 10000;
    addChild(tree);
   }

   addEventListener(Event.ENTER_FRAME, onEnterFrame);
   stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
   stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp);
  }
   private function onEnterFrame(event:Event):void {
   vx += ax;
   vy += ay;
   vz += az;
   vy -= gravity;
     for (var i:uint = 0; i < numTrees; i++) {
    var tree:Tree = trees[i];
    move(tree);
   }
   vx *= friction;
   vy *= friction;
   vz *= friction;
   sortZ();
  }
   private function onKeyDown(event:KeyboardEvent):void {
   switch (event.keyCode) {
    case Keyboard.UP :

   az = -1;
     break;
    case Keyboard.DOWN :
     az = 1;
     break;
    case Keyboard.LEFT :
     ax = 1;
     break;
    case Keyboard.RIGHT :
     ax = -1;
     break;

   case Keyboard.SPACE :
     ay = 1;
     break;
    default :
     break;
   }
  }
   private function onKeyUp(event:KeyboardEvent):void {
   switch (event.keyCode) {
    case Keyboard.UP :
    case Keyboard.DOWN :
     az = 0;
     break;
    case Keyboard.LEFT :
    case Keyboard.RIGHT :
     ax = 0;
     break;
    case Keyboard.SPACE :
     ay = 0;
     break;

  default :
     break;
   }
  }
   private function move(tree:Tree):void {
   tree.xpos += vx;
   tree.ypos += vy;
   tree.zpos += vz;
     if (tree.ypos < floor) {
    tree.ypos = floor;
   }
     if (tree.zpos < -fl) {
    tree.zpos += 10000;
   }
     if (tree.zpos > 10000 - fl) {
    tree.zpos -= 10000;
   }
     var scale:Number = fl / (fl + tree.zpos);
     tree.scaleX = tree.scaleY = scale;

   tree.x = vpX + tree.xpos * scale;
   tree.y = vpY + tree.ypos * scale;
  tree.alpha = scale;
 }
 private function sortZ():void {
  trees.sortOn("zpos", Array.DESCENDING | Array.NUMERIC);
   for (var i:uint = 0; i < numTrees; i++) {
   var tree:Tree = trees[i];
   setChildIndex(tree, i);
  }

  }
 }
}
     这里,我已经加入了 x  和 y 轴的速度,还有重力。还必需要能够捕获多个按键。我唯
一想念 AS 2  的是 Key.isDown()  方法,任何时间都可以调用找出某个键是否被按住。因为
在 AS 3  中我们只能知道最后一次按下或释放的键,所以不得不判断哪个键被按下并设置相
应轴上的加速度为 1  或 -1。随后,当该键被松开时,再将加速度设回 0。在 onEnterFrame
的开始就将每个轴上的加速度加到相应轴的速度中。左键和右键显然就是用于选择 x  轴的
速度,使用空格键操作 y  轴。有趣的一点是我们实际是从 vy  减去了重力。因为我想要一
个类似于观察者落到树林中的效果,如图 15-8  所示。注意我们同样也限定了树的 y  坐标
为 50,看起来就像是站在陆地上一样。



转 <wbr>第十五章 <wbr>3D <wbr>基础 <wbr>(2)(as3.0)

图 15-8  看,我在飞!
     这里没有对 x  轴的运动加以任何的限制,也就意味着可以在树林边上行进。要想加入
限制对于大家来说也不是件难事,但是作为一个启发性的例子做到这里已经足够了。
缓动与弹性运动
     在 3D 中的缓动与弹性运动不会比 2D  中的难多少(第八章的课题)。我们只需为 z
轴再加入一至两个变量。

 

 
缓动
     对于缓动的介绍不算很多。在 2D  中,我们用 tx  和 ty 最为目标点。现在只需要再在
z  轴上加入 tz。每帧计算物体每个轴到目标点的距离,并移动一段距离。
     让我们来看一个简单的例子,让物体缓动运动到随机的目标点,到达该点后,再选出另
一个目标并让物体移动过去。注意后面两个例子,我们又回到了 Ball3D  这个类上。以下是
代码(可以在 Easing3D.as  中找到):
package {
 import flash.display.Sprite;
 import flash.events.Event;
  public class Easing3D extends Sprite {
   private var ball:Ball3D;
   private var tx:Number;
   private var ty:Number;
   private var tz:Number;
   private var easing:Number = .1;
   private var fl:Number = 250;
   private var vpX:Number = stage.stageWidth / 2;

   private var vpY:Number = stage.stageHeight / 2;
   public function Easing3D() {
   init();
  }
   private function init():void {
   ball = new Ball3D();
   addChild(ball);
     tx = Math.random() * 500 - 250;
     ty = Math.random() * 500 - 250;
     tz = Math.random() * 500;
   addEventListener(Event.ENTER_FRAME, onEnterFrame);
  }
   private function onEnterFrame(event:Event):void {
     var dx:Number = tx - ball.xpos;
     var dy:Number = ty - ball.ypos;
     var dz:Number = tz - ball.zpos;
   ball.xpos += dx * easing;
   ball.ypos += dy * easing;
     ball.zpos += dz * easing;
     var dist:Number = Math.sqrt(dx*dx + dy*dy + dz*dz);

     if (dist < 1) {
       tx = Math.random() * 500 - 250;
       ty = Math.random() * 500 - 250;
       tz = Math.random() * 500;
   }
     if (ball.zpos > -fl) {
    var scale:Number = fl / (fl + ball.zpos);
      ball.scaleX = ball.scaleY = scale;
      ball.x = vpX + ball.xpos * scale;
      ball.y = vpY + ball.ypos * scale;
    ball.visible = true;
   } else {
    ball.visible = false;
   }
  }
 }
}
代码中最有趣的地方是下面这行:

      var dist:Number = Math.sqrt(dx * dx + dy * dy + dz * dz);
我们知道,在 2D  中计算两点间距离的方程是:
      var dist:Number = Math.sqrt(dx * dx + dy * dy);
在 3D  距离中,只需要将第三个轴距离的平方加入进去。由于这个公式过于简单所以我
常会受到质疑。在加入了一个条件后,似乎应该使用立方根。但是它并不是用在这里的。
 
 
 
弹性运动
     弹性运动是缓动的兄弟,需用相似的方法将其调整为 3D  的。我们只使用物体到目标
的距离改变速度,而不是改变位置。给大家一个快速的示例。本例中(Spring3D.as),点击

鼠标将创建出一个随机的目标点。
package {
 import flash.display.Sprite;
 import flash.events.Event;
 import flash.events.MouseEvent;
  public class Spring3D extends Sprite {
   private var ball:Ball3D;
   private var tx:Number;
   private var ty:Number;
   private var tz:Number;
   private var spring:Number = .1;
   private var friction:Number = .94;
   private var fl:Number = 250;
   private var vpX:Number = stage.stageWidth / 2;
   private var vpY:Number = stage.stageHeight / 2;
   public function Spring3D() {
   init();
  }

   private function init():void {
   ball = new Ball3D();
   addChild(ball);
     tx = Math.random() * 500 - 250;
     ty = Math.random() * 500 - 250;
     tz = Math.random() * 500;
   addEventListener(Event.ENTER_FRAME, onEnterFrame);
   stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
  }
   private function onEnterFrame(event:Event):void {
     var dx:Number = tx - ball.xpos;
     var dy:Number = ty - ball.ypos;
     var dz:Number = tz - ball.zpos;
     ball.vx += dx * spring;
     ball.vy += dy * spring;
     ball.vz += dz * spring;
   ball.xpos += ball.vx;
   ball.ypos += ball.vy;
   ball.zpos += ball.vz;
   ball.vx *= friction;
   ball.vy *= friction;
   ball.vz *= friction;

   if (ball.zpos > -fl) {
   var scale:Number = fl / (fl + ball.zpos);
    ball.scaleX = ball.scaleY = scale;
    ball.x = vpX + ball.xpos * scale;
    ball.y = vpY + ball.ypos * scale;
   ball.visible = true;
  } else {
   ball.visible = false;
  }

  }
   private function onMouseDown(event:MouseEvent):void {
     tx = Math.random() * 500 - 250;
     ty = Math.random() * 500 - 250;
     tz = Math.random() * 500;
  }
 }
} 
 




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

图片风格自动分析模型 对于分类任务,我们可以使用交叉熵损失作为损失函数。同时,我们可以选择随机梯度下降(SGD)或Adam等优化器进行模型优化。# 使用SGD优化器# 或使用Adam优化器在这部分,总结整个项目的过程,包括数据准备、模型构建、训练、优化和评估等。同时,讨论可能的改进方向和未来工作,例如尝试更多的模型结构、优化技巧等。 阅读详情

相关推荐

信号削峰CFR基础知识介绍(一)

接下来,将得到的峰值分成若干段,在每一段中,仅保留该段内所有峰值中幅度最大的峰值。为了减少不必要的带外泄露,削峰后的信号将通过一个低通滤波器,以减少对应于削峰后信号中尖锐拐角的高频信号。首先,它识别出高于由目标PAPR确定的阈值的峰值。在峰值加窗算法中,削峰是通过在峰值区域将原始信号与一个加窗函数相乘来实现的,如下图所示。其中,w(n) 是一种常见的加窗函数,如凯撒窗、高斯窗和汉明窗等,而 p(n) 是一个加权系数。如上图所示,削峰会导致削峰后的信号出现尖锐的拐角,从而引发不必要的带外辐射(ACP增加)。

weixin_49761275的博客 1553

sort函数使用方法包含自定义函数

目录sort函数简单的介绍 关于自定义函数 将奇数和偶数分开 首先sort函数的头文件是#includesort函数我认为可以分成三段,结构是sort(开始位置,结束位置,自定义函数),排序范围是左闭右开,使用的是地址。最后一个自定义函数可以不用写,默认是从小到大。i

qq_63482686的博客 1369

WangEditor 5.0版本dangerouslyInsertHtml方法的正确使用方式

WangEditor 5.0版本dangerouslyInsertHtml方法的正确使用方式

yang1067155909的专栏 4293

如何自定义sort函数中的比较函数

**总结起来就是:** **sort函数根据comp函数的返回值,对comp函数的两个参数排序。** **如果comp返回true,排序为“参数1”“参数2”,否则排序为“参数2”“参数1”。** **想要升序排列,则`return parameter1<parameter2`** **想要降序排列,则`return parameter1>parameter2`**

程序媛暖暖 2万+

叶绿体基因组提交NCBI全流程避坑指南

叶绿体基因组作为环状细胞器DNA,其数据提交并非简单上传,而是需严格遵循INSDC标准的学术出版行为。其核心原理在于元数据完整性、拓扑结构语义一致性与分类学路径精确匹配;技术价值体现在保障序列可追溯、可复现、可互操作;典型应用场景涵盖植物系统发育、条形码开发及合成生物学底盘构建。实践中,FASTA头行格式、feature table嵌套规则、taxid绑定及BankIt静默校验等环节极易引发失败。本文聚焦NCBI|叶绿体基因组数据上传中的高频报错与隐性约束,提供面向生物信息工程师的实操级规范解析。

weixin_31960565的博客 331

反激电源RCD尖峰吸收电路的原理以及调试

反激电源RCD尖峰吸收电路的原理以及调试

mnmmnmn的博客 9255

as3.0学习笔记

Array的用法 1:创建数组,var array:Array = new Array(3),其中3为数组的长度。 2:数组在创建并赋值后,可以使用“数组名[下标]"来访问数组中某个元素。下标从0开始 3:length属性,是数组的长度,但是这个长度是随时可变的。 4:数组的基本方法: pop(): 删除数组中最后一个元素,并且返回该元素的值 shift():删除数组中第一个元素,并且

erwer8363的专栏 680

Ollama本地大模型部署指南:从核心原理到实战避坑

大语言模型(LLM)作为人工智能领域的核心技术,通过海量数据训练获得强大的语言理解和生成能力。其工作原理基于Transformer架构,通过自注意力机制处理序列数据,在文本生成、代码编写和对话系统等场景展现出巨大价值。随着开源模型的普及,本地部署成为关注焦点,它解决了数据隐私和定制化需求,但面临环境配置和资源管理的挑战。Ollama作为开源工具,通过封装模型格式和统一API,简化了本地部署流程,支持GPU加速和性能调优,让开发者能够快速集成到IDE和自动化脚本中,实现高效的本地AI应用部署。

weixin_30915951的博客 453

Array的SortOn排序

sortOn () 方法 AS3 function sortOn(fieldName:Object, options:Object = null):Array 语言版本 : ActionScript 3.0 RuntimeVersions: AIR 1.0, Flash Player 9 根据数组中的一个或多个字段对数组中的元素进行排序。数组应具有下列特性...

张 作强 BLOG 851

自动化测试与AI的结合应用

自动化测试,人工智能,机器学习,深度学习,测试用例生成,缺陷预测,测试优化 1. 背景介绍 在软件开发领域,自动化测试已成为不可或缺的一部分,它可以提高测试效率、降低测试成本,并确保软件质量。然而,传统的自动化测试方法往往依赖于人工编写的测试用例,这不仅耗时费力,而且难以应对复杂软件

AI架构师小马 2248

手把手教你学Simulink--逆变器场景:基于Simulink的单相全桥逆变器PWM控制仿真建模

本文介绍了使用Simulink和Simscape Electrical库进行单相全桥逆变器PWM控制仿真建模的详细步骤。主要内容包括:从创建Simulink项目、添加电力电子组件、构建逆变器模型,到设置参数、运行仿真和结果分析。重点讲解了逆变器核心模块的配置、PWM信号生成、负载建模等关键环节,并提供了优化改进建议。该指南适用于电力电子初学者,通过仿真可以帮助理解单相全桥逆变器的工作原理和PWM控制技术,为实际应用和算法开发提供基础平台。

MHD0815的博客 667

AS3.0 基础代码收集

AS3.0 控制时间轴上动作 1:addFrameScript()方法 //允许你指定在flash player播放头播放到指定的位置时触发事件. mc.addFrameScript(帧位置,调用函数); 2:鼠标的点击事件    btn.addEventListener(MouseEvent.鼠标事件,调用事件)    事件定义    function xxx(ev

waizi1976的专栏 4932

NVIDIA平台Xavier/TX2板摄像头驱动开发与TP2850方案开发

本文介绍了在NVIDIA平台上开发Xavier/TX2板摄像头驱动的过程,并结合TP2850方案实现了多路模拟相机输入。我们提供了初始化摄像头和连接TP2850方案的示例代码,并介绍了相关的步骤和注意事项。需要注意的是,以上示例代码仅提供了基本的摄像头初始化和与TP2850通信的框架,你需要根据具体的需求进行进一步开发和配置。你可能需要参考摄像头和TP2850的数据手册以及相关的开发文档,以了解更多详细的配置和操作。此外,你还需要一个支持TP2850方案的硬件设备,并将其连接到Xavier/TX2板上。

PixelLancer的博客 593

转 第十五章 3D 基础 (3)(as3.0)

坐标旋转      接下来是 3D  坐标旋转。这里要比第十和十一章中的 2D  坐标旋转要稍微复杂一些。 我们不仅可以在三个不同的轴上旋转,还可以同时在两个以上的轴上进行旋转。      在 2D 坐标旋转中物体是绕着 z  轴旋转的,如图 15-9  所示。想一想命运之

roadProgram的专栏 1439

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

转 第十六章 3D 线条与填充(1) (as3.0)

第十五章我们介绍了 3D,但只是将物体置于 3D 空间中,设置大小与位置。物体实际 上还是 2D 的。这就像老的 3D 游戏中,我们可以绕着某个物体或人物走,这些对象会转 过来面对我们。这些物体或人物并不是真正的会转过来 —— 只是看上去是这样的,因为它 们都是 2D 物体

roadProgram的专栏 4118

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

转 第十五章 3D 基础 (1)(as3.0)

前面我们做的一切都是二维的(有时只有一维),但是已经可以做出非常酷的东东了。 现在,将它们带入到下一个等级。      创建 3D  图形总是那么另人兴奋。新加入的这个维度似乎将物体真正地带入到了生活 中。如何在 Flash  中实现 3D  在无数的书籍和教学软件中都有介

roadProgram的专栏 972

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

转 第十七章 背面剔除与flash 3D 灯光 (as3.0)

第十六章介绍了所有建立 3D 立体模型的基础包括:如何创建点,线,用多边形组成 各种形状,以及如何为每个多边形设置颜色。但是,我们只能让颜色的透明度为 50%,才 能看到正确的效果。虽然制作出的 3D 立体模型也不差,但是这样做在真实度上还是有所 欠缺。     本章,通

roadProgram的专栏 4292

【as3】ActionScript 3.0体验试教学视频教程

很不错的视频教程 原文地址: [url=http://blog.sina.com.cn/s/blog_3ecb9b1101009nx0.html]http://blog.sina.com.cn/s/blog_3ecb9b1101009nx0.html[/url]   全屏观看地址: [url=http://vhead.blog.sina.com.cn/player/outer_pla...

hgfghwq13 113
上一篇: 转 第十五章 3D 基础 (1)(as3.0)
下一篇: 转 第十五章 3D 基础 (3)(as3.0)
coding_most
博客等级 码龄15年 13粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值