Silverlight & Blend动画设计系列十:Silverlight中的坐标系统(Coordinate System)与向量(Vector)运动...

本文探讨了Silverlight中的坐标系统及其与传统数学坐标系统的区别,并通过实例讲解了一维和二维向量运动,展示了如何利用Silverlight API实现对象的位置变换。

  如果我们习惯于数学坐标系,那么对于Silverlight中的坐标系可能会有些不习惯。因为在Silverlight中的坐标系与Flash中的坐标系一样,一切都的颠倒的。在标准的数学坐标系中,X轴表示水平轴,Y轴表是垂直轴,然而Silverlight中的坐标系是基于视频屏幕的坐标系。

  Silverlight中的坐标系统和Flash中的坐标系统是完全一样的,都是采用笛卡尔坐标系统,分为四象限。简单的说就是以X轴表示水平方向并向东方无限延伸,Y轴表示垂直方向并向着南方无限延伸,X和Y轴相交点表示坐标系源点,其X,Y坐标值为0,0,所以在Silverlight中的坐标系范围就是以坐标源点为起点,无限向东南方向延伸,也就是笛卡尔坐标系中的四象限。

        

  Silverlight的向量(Vector)运动目前仅支持一维向量运动(One-dimensional vector movement)和二维向量运动(Two-dimensional vector movement),也就是平时大家所说的1D和2D。一维向量运动可以理解为在同一直线上的运动,二维向量运动则可以理解在平面空间(X,Y坐标系)里的运动。向量的概念从初中就开始学习,这里就不做介绍了,如有不清楚的朋友可以移步到这里

  二维向量运动很容易理解,在Silverlight的动画设计中二维动画也是最常见和使用率最高的动画,可参考在本系列第一篇《Silverlight & Blend动画设计系列一:偏移动画(TranslateTransform)》中所介绍到的偏移动画变换的实现,其实质就是一个二维向量运动,动画元素对象在动画过度期间不停的改变对象所在的物理坐标位置实现了对象位置的变化,本质上就是元素对象在坐标系里的二维坐标位置的改变。从几何上来理解就是发生了一个二维的向量运动,Silverlight中命名为动画。

        

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> /// <summary>
/// 创建动画
/// </summary>
private void CreateStoryboard()
{
// 元素当前所在的坐标点
PointcurrentPoint = new Point(Canvas.GetLeft(darkMoon),Canvas.GetTop(darkMoon));
// 目标点坐int标
Pointpoint = new Point( 280 , - 245 );
// 创建动画容器时间线
Storyboardstoryboard = new Storyboard();

DoubleAnimationdoubleAnimation
= new DoubleAnimation();

// 创建X轴方向动画
doubleAnimation.From = currentPoint.X;
doubleAnimation.To
= point.X;
doubleAnimation.Duration
= new Duration( new TimeSpan( 0 , 0 , 1 ));
Storyboard.SetTarget(doubleAnimation,darkMoon);
Storyboard.SetTargetProperty(doubleAnimation,
new PropertyPath( " (UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X) " ));
storyboard.Children.Add(doubleAnimation);

// 创建Y轴方向动画
doubleAnimation = new DoubleAnimation();
doubleAnimation.SetValue(DoubleAnimation.FromProperty,currentPoint.Y);
doubleAnimation.SetValue(DoubleAnimation.ToProperty,point.Y);
doubleAnimation.SetValue(DoubleAnimation.DurationProperty,
new Duration( new TimeSpan( 0 , 0 , 1 )));
Storyboard.SetTarget(doubleAnimation,darkMoon);
Storyboard.SetTargetProperty(doubleAnimation,
new PropertyPath( " (UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.Y) " ));
storyboard.Children.Add(doubleAnimation);

storyboard.Begin();
}

  下面再来一起学习一个稍微复杂点的二维向量运动,模拟屏幕内有一小球,当鼠标在舞台上点击则小球以动画的形式移动到鼠标点击处。如下XAML定义:

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> < UserControl x:Class ="SLV.MainPage"
xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d
="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc
="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable
="d" >
< Canvas x:Name ="LayoutRoot" Width ="400" Height ="400" Background ="Black" MouseLeftButtonDown ="OnMouseDown" >
< Ellipse Fill ="YellowGreen" x:Name ="ellipse"
Width
="20"
Height
="20"
Canvas.Left
="80"
Canvas.Top
="66" >
</ Ellipse >
</ Canvas >
</ UserControl >

  其舞台的鼠标左键点击事件代码如下:

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> private void OnMouseDown( object sender,System.Windows.Input.MouseButtonEventArgse)
{
//鼠标点击点坐标
varmousePoint
= e.GetPosition(null);
//当前对象所在坐标
varcurrentPoint
= new Point(( double )ellipse.GetValue(Canvas.LeftProperty),( double )ellipse.GetValue(Canvas.TopProperty));

Storyboardsb
= new Storyboard();
//创建X坐标方向动画
DoubleAnimationdoubleAnimation
= new DoubleAnimation();
doubleAnimation.From
= currentPoint.X;
doubleAnimation.To
= mousePoint.X;
doubleAnimation.Duration
= new Duration( new TimeSpan( 0 , 0 , 2 ));
Storyboard.SetTarget(doubleAnimation,ellipse);
Storyboard.SetTargetProperty(doubleAnimation,
new PropertyPath( " (Canvas.Left) " ));

sb.Children.Add(doubleAnimation);
//创建Y坐标方向动画
doubleAnimation
= new DoubleAnimation();
doubleAnimation.From
= currentPoint.Y;
doubleAnimation.To
= mousePoint.Y;
doubleAnimation.Duration
= new Duration( new TimeSpan( 0 , 0 , 2 ));
Storyboard.SetTarget(doubleAnimation,ellipse);
Storyboard.SetTargetProperty(doubleAnimation,
new PropertyPath( " (Canvas.Top) " ));
sb.Children.Add(doubleAnimation);

sb.Begin();
}

  以上太阳的简单位置变换移动和小球随鼠标的移动都可以理解为平面中向量的运动,只不过在实现上没有直接通过向量的变换实现,而是通过Silverlight中提供的动画API实现,个人认为,从某种角度可以将Silverlight中的动画API理解为Silverlight的向量API,动画API实现的平面动画理解为向量运动。

推荐资源:

  MSDN:http://msdn.microsoft.com/zh-cn/library/cc189090(VS.95).aspx

  http://www.silverlight.net/learn/quickstarts/animations/

Silverlight & Blend动画设计系列文章

  《Function Silverlight 3 Animation》----本篇中使用的部分素材选自此书

通过短时倒谱(Cepstrogram)计算进行时-倒频分析研究(Matlab代码实现)内容概要:本文主要介绍了一项关于短时倒谱(Cepstrogram)计算在时-倒频分析中的研究,并提供了相应的Matlab代码实现。通过短时倒谱分析方法,能够有效提取信号在时间倒频率域的特征,适用于语音、机械振动、生物医学等领域的信号处理故障诊断。文中阐述了倒谱分析的基本原理、短时倒谱的计算流程及其在实际工程中的应用价值,展示了如何利用Matlab进行时-倒频图的可视化分析,帮助研究人员深入理解非平稳信号的周期性成分谐波结构。; 适合人群:具备一定信号处理基础,熟悉Matlab编程,从事电子信息、机械工程、生物医学或通信等相关领域科研工作的研究生、工程师及科研人员。; 使用场景及目标:①掌握倒谱分析短时倒谱的基本理论及其傅里叶变换的关系;②学习如何用Matlab实现Cepstrogram并应用于实际信号的周期性特征提取故障诊断;③为语音识别、机械设备状态监测、振动信号分析等研究提供技术支持方法参考; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,先理解倒谱的基本概念再逐步实现短时倒谱分析,注意参数设置如窗长、重叠率等对结果的影响,同时可将该方法其他时频分析方法(如STFT、小波变换)进行对比,以提升对信号特征的理解能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值