`
mapdigit
  • 浏览: 250293 次
文章分类
社区版块
存档分类
最新评论

Silverlight 引路蜂二维图形库示例:动画Beziers曲线

 
阅读更多

类Path为一条几何路径,可以通过直线,二次曲线,三次曲线来构成任意路径。Path提供了moveTo, lineTo, curveTo, curveToCubic, closePath方法来构成路径。

下面的例子动态显示一条Bezier曲线。

/**
* The animation thread.
*/
Thread _thread;
bool _drawn;
/**
 * The random number generator.
 */
readonly Random _random = new Random();
/**
 * The animated path
 */
readonly Path _path = new Path();
/**
 * Red brush used to fill the path.
 */
readonly SolidBrush _brush = new SolidBrush(Color.Red);
const int Numpts = 6;
readonly int[] _animpts = new int[Numpts * 2];
readonly int[] _deltas = new int[Numpts * 2];
 
private void Beziers()
{
 Reset(screenWidth, screenHeight);
 _thread = new Thread(RunBeziers);
 _thread.Start();
}
 
private void RunBeziers()
{
 
 Thread me = Thread.CurrentThread;
 
 if (!_drawn)
 {
  lock (this)
  {
   graphics2D.Clear(Color.White);
   graphics2D.Fill(_brush, _path);
   _drawn = true;
  }
 }
 while (_thread == me)
 {
  DrawDemo(screenWidth, screenHeight);
 }
}
 
/**
* Generates new points for the path.
*/
private void Animate(int[] pts, int[] deltas, int i, int limit)
{
 int newpt = pts[i] + deltas[i];
 if (newpt <= 0)
 {
  newpt = -newpt;
  deltas[i] = (_random.Next() & 0x00000003) + 2;
 }
 else if (newpt >= limit)
 {
  newpt = 2 * limit - newpt;
  deltas[i] = -((_random.Next() & 0x00000003) + 2);
 }
 pts[i] = newpt;
}
 
/**
* Resets the animation data.
*/
private void Reset(int w, int h)
{
 for (int i = 0; i < _animpts.Length; i += 2)
 {
  _animpts[i + 0] = (_random.Next() & 0x00000003) * w / 2;
  _animpts[i + 1] = (_random.Next() & 0x00000003) * h / 2;
  _deltas[i + 0] = (_random.Next() & 0x00000003) * 6 + 4;
  _deltas[i + 1] = (_random.Next() & 0x00000003) * 6 + 4;
  if (_animpts[i + 0] > w / 2)
  {
   _deltas[i + 0] = -_deltas[i + 0];
  }
  if (_animpts[i + 1] > h / 2)
  {
   _deltas[i + 1] = -_deltas[i + 1];
  }
 }
}
 
/**
 * Sets the points of the path and draws and fills the path.
 */
private void DrawDemo(int w, int h)
{
 for (int i = 0; i < _animpts.Length; i += 2)
 {
  Animate(_animpts, _deltas, i + 0, w);
  Animate(_animpts, _deltas, i + 1, h);
 }
 //Generates the new pata data.
 _path.Reset();
 int[] ctrlpts = _animpts;
 int len = ctrlpts.Length;
 int prevx = ctrlpts[len - 2];
 int prevy = ctrlpts[len - 1];
 int curx = ctrlpts[0];
 int cury = ctrlpts[1];
 int midx = (curx + prevx) / 2;
 int midy = (cury + prevy) / 2;
 _path.MoveTo(midx, midy);
 for (int i = 2; i <= ctrlpts.Length; i += 2)
 {
  int x1 = (curx + midx) / 2;
  int y1 = (cury + midy) / 2;
  prevx = curx;
  prevy = cury;
  if (i < ctrlpts.Length)
  {
   curx = ctrlpts[i + 0];
   cury = ctrlpts[i + 1];
  }
  else
  {
   curx = ctrlpts[0];
   cury = ctrlpts[1];
  }
  midx = (curx + prevx) / 2;
  midy = (cury + prevy) / 2;
  int x2 = (prevx + midx) / 2;
  int y2 = (prevy + midy) / 2;
  _path.CurveTo(x1, y1, x2, y2, midx, midy);
 }
 _path.ClosePath();
 // clear the clipRect area before production
 
 graphics2D.Clear(Color.White);
 graphics2D.Fill(_brush, _path);
 
 RefreshBitmap();
 
}

其中实时更新图像需要CompositionTarget.Rendering事件来处理。CompositionTarget.Rendering += CompositionTargetRendering;


private void CompositionTargetRendering(object sender, EventArgs e)
{
 bmp.Invalidate();
}


分享到:
评论

相关推荐

    beziers.py:Python Bezier操作库

    贝塞尔曲线提供了用于构造,操纵和绘制贝塞尔曲线和路径的各种类。 它主要是为字体设计软件设计的,它使您可以在路径上进行连接,拆分,偏移和执行许多其他操作。 这是一个示例会话: from beziers.point import ...

    浙江大学 计算机图形学讲义

    Beziers曲线和NURBS(非均匀有理B样条)是生成曲线和曲面的常用方法,提供了平滑连续的形状,并且在工业设计和动画中广泛应用。 2. **二维图形变换**:Lecture 7和Lecture 8讨论了如何对二维图形进行平移、旋转、...

    python实现贝塞尔(Bezier)曲线画法

    贝塞尔曲线是一种在计算机图形学中广泛使用的参数曲线,它具有平滑、连续的性质,常用于动画、游戏开发、CAD设计等领域。Python作为一种强大的编程语言,提供了多种方式来实现贝塞尔曲线的绘制。在本教程中,我们将...

    PyPI 官网下载 | beziers-0.0.7-py2.py3-none-any.whl

    对于Python初学者或者需要处理Bézier曲线的开发者来说,beziers库提供了一个方便的工具集,可以帮助他们更高效地进行相关计算和图形生成。不过,具体的功能和使用方法还需要查阅beziers库的官方文档或者通过源码...

    TeeChart 平滑曲线实现例子源码

    Beziers曲线是另一种常见用于图形平滑的技术,它通过控制点来决定曲线形状。在TeeChart中,BezierSeries类可以帮助我们创建这种曲线,开发者可以通过调整控制点的位置来改变曲线的平滑度和形状。 在"SmoothChartPro...

    copy-agg-jj-2.5.zip_JJ

    AGG,全称为“Anti-Grain Geometry”,是一个强大的开源二维图形库,旨在提供高效、高质量的2D渲染能力。它的设计目标是超越传统的图形库,如GDI+,为开发者提供更灵活的编程接口和更优秀的图形输出质量。AGG这个...

    MFC曲线分析

    在本文中,我们将深入探讨如何使用Microsoft Foundation Class (MFC) 库来实现曲线分析功能。MFC 是 Microsoft 提供的一个C++类库,它为Windows应用程序开发提供了一种结构化的方法,使得开发者可以轻松地创建图形...

    基于 Python 的跳动爱心

    这个项目通常被用作学习图形界面、动画制作或情人节礼物的示例。下面我们将深入探讨如何使用Python实现这个效果,以及相关的编程知识点。 首先,要创建一个跳动的爱心,我们需要一个能够绘制图形的库。在Python中,...

    VC++画图板源代码

    - 曲线:可能使用Beziers或者其他曲线算法来实现平滑的曲线。 - 多边形:通过一系列线段连接各个顶点形成多边形。 - 三角形:绘制三个点之间的线段即可。 - 五角星:通过复杂的路径绘制,结合LineTo和MoveTo在...

    Bezier-Curves-Generator

    贝塞尔曲线是一种在计算机图形学中广泛应用的数学工具,它能够创建平滑且连续的曲线,常用于动画、游戏开发、CAD设计等领域。本项目"Bezier-Curves-Generator"专注于使用Python语言实现贝塞尔曲线的生成与可视化。 ...

    绘图小程序(Draw)

    【绘图小程序(Draw)】是一款使用VC++编程语言开发的简单绘图应用程序,它集成了MFC(Microsoft Foundation Classes)库,为用户提供了一个基础的图形绘制环境。在这个程序中,用户可以绘制基本的几何图形,包括点、...

    程序自动画线,VC++ 代码

    总的来说,VC++中实现自动画线主要涉及GDI图形库的使用,包括创建和管理画笔,以及在CDC对象上进行画线操作。通过理解和掌握这些知识,你不仅可以实现自动画线,还可以扩展到更复杂的图形处理任务。

    Python库 | cu2qu-1.6.6-cp36-cp36m-manylinux1_x86_64.whl

    `cu2qu`是一个Python库,主要针对SVG(Scalable Vector Graphics)图形处理,特别是用于将环形路径(cubic Bezier曲线)转换为二次贝塞尔曲线(quadratic Bezier曲线)。这个库在图形编程、矢量图形渲染和PDF文档...

    画图的源码

    程序的实现可能涉及以下技术:图形库(如Windows GDI, OpenGL, 或者跨平台的库如Qt, wxWidgets),事件驱动编程(用于响应用户的输入操作),以及图形渲染算法(用于在屏幕上精确显示图形)。源代码可能包含多个模块...

    PyPI 官网下载 | cu2qu-1.6.6-cp27-cp27m-manylinux1_i686.whl

    总结,`cu2qu-1.6.6-cp27-cp27m-manylinux1_i686.whl` 是一个针对Python 2.7环境的`cu2qu` 库的二进制发行版,它提供了曲线到二次贝塞尔曲线的转换功能,广泛适用于图形处理和数据可视化的场景。通过`pip` 安装后,...

    PitStop_Pro_10使用说明

    Enfocus PitStop Pro是Enfocus公司开发一款功能超强...圆形可以检查或直压((overprint),也能转成 Beziers曲线来修改;转换函数(Transfer function),半色调、CMYK或RGB都能加上去,还能从其他的PDF上搬过来新的物件。

    freetype使用帮助

    轮廓线可以是二次曲线(quadratic Beziers)或三次曲线(cubic Beziers)。每个点都由标志表明其类型是普通点还是控制点。控制点可以用来缩放整个轮廓,从而实现字体的缩放渲染。 在渲染时,要注意输出设备的分辨率...

    Bezier_HTF - MetaTrader 5脚本.zip

    Bezier曲线,源自计算机图形学,是一种通过控制点定义的平滑曲线。在MT5中,"Bezier_HTF"脚本引入了这一概念,允许交易者在不同的时间帧上绘制和分析Bezier曲线,以揭示市场动态的潜在模式。这个功能的实现得益于MQ5...

Global site tag (gtag.js) - Google Analytics