类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();
}
分享到:
相关推荐
贝塞尔曲线提供了用于构造,操纵和绘制贝塞尔曲线和路径的各种类。 它主要是为字体设计软件设计的,它使您可以在路径上进行连接,拆分,偏移和执行许多其他操作。 这是一个示例会话: from beziers.point import ...
Beziers曲线和NURBS(非均匀有理B样条)是生成曲线和曲面的常用方法,提供了平滑连续的形状,并且在工业设计和动画中广泛应用。 2. **二维图形变换**:Lecture 7和Lecture 8讨论了如何对二维图形进行平移、旋转、...
贝塞尔曲线是一种在计算机图形学中广泛使用的参数曲线,它具有平滑、连续的性质,常用于动画、游戏开发、CAD设计等领域。Python作为一种强大的编程语言,提供了多种方式来实现贝塞尔曲线的绘制。在本教程中,我们将...
对于Python初学者或者需要处理Bézier曲线的开发者来说,beziers库提供了一个方便的工具集,可以帮助他们更高效地进行相关计算和图形生成。不过,具体的功能和使用方法还需要查阅beziers库的官方文档或者通过源码...
Beziers曲线是另一种常见用于图形平滑的技术,它通过控制点来决定曲线形状。在TeeChart中,BezierSeries类可以帮助我们创建这种曲线,开发者可以通过调整控制点的位置来改变曲线的平滑度和形状。 在"SmoothChartPro...
AGG,全称为“Anti-Grain Geometry”,是一个强大的开源二维图形库,旨在提供高效、高质量的2D渲染能力。它的设计目标是超越传统的图形库,如GDI+,为开发者提供更灵活的编程接口和更优秀的图形输出质量。AGG这个...
在本文中,我们将深入探讨如何使用Microsoft Foundation Class (MFC) 库来实现曲线分析功能。MFC 是 Microsoft 提供的一个C++类库,它为Windows应用程序开发提供了一种结构化的方法,使得开发者可以轻松地创建图形...
这个项目通常被用作学习图形界面、动画制作或情人节礼物的示例。下面我们将深入探讨如何使用Python实现这个效果,以及相关的编程知识点。 首先,要创建一个跳动的爱心,我们需要一个能够绘制图形的库。在Python中,...
- 曲线:可能使用Beziers或者其他曲线算法来实现平滑的曲线。 - 多边形:通过一系列线段连接各个顶点形成多边形。 - 三角形:绘制三个点之间的线段即可。 - 五角星:通过复杂的路径绘制,结合LineTo和MoveTo在...
贝塞尔曲线是一种在计算机图形学中广泛应用的数学工具,它能够创建平滑且连续的曲线,常用于动画、游戏开发、CAD设计等领域。本项目"Bezier-Curves-Generator"专注于使用Python语言实现贝塞尔曲线的生成与可视化。 ...
【绘图小程序(Draw)】是一款使用VC++编程语言开发的简单绘图应用程序,它集成了MFC(Microsoft Foundation Classes)库,为用户提供了一个基础的图形绘制环境。在这个程序中,用户可以绘制基本的几何图形,包括点、...
总的来说,VC++中实现自动画线主要涉及GDI图形库的使用,包括创建和管理画笔,以及在CDC对象上进行画线操作。通过理解和掌握这些知识,你不仅可以实现自动画线,还可以扩展到更复杂的图形处理任务。
`cu2qu`是一个Python库,主要针对SVG(Scalable Vector Graphics)图形处理,特别是用于将环形路径(cubic Bezier曲线)转换为二次贝塞尔曲线(quadratic Bezier曲线)。这个库在图形编程、矢量图形渲染和PDF文档...
程序的实现可能涉及以下技术:图形库(如Windows GDI, OpenGL, 或者跨平台的库如Qt, wxWidgets),事件驱动编程(用于响应用户的输入操作),以及图形渲染算法(用于在屏幕上精确显示图形)。源代码可能包含多个模块...
总结,`cu2qu-1.6.6-cp27-cp27m-manylinux1_i686.whl` 是一个针对Python 2.7环境的`cu2qu` 库的二进制发行版,它提供了曲线到二次贝塞尔曲线的转换功能,广泛适用于图形处理和数据可视化的场景。通过`pip` 安装后,...
Enfocus PitStop Pro是Enfocus公司开发一款功能超强...圆形可以检查或直压((overprint),也能转成 Beziers曲线来修改;转换函数(Transfer function),半色调、CMYK或RGB都能加上去,还能从其他的PDF上搬过来新的物件。
轮廓线可以是二次曲线(quadratic Beziers)或三次曲线(cubic Beziers)。每个点都由标志表明其类型是普通点还是控制点。控制点可以用来缩放整个轮廓,从而实现字体的缩放渲染。 在渲染时,要注意输出设备的分辨率...
Bezier曲线,源自计算机图形学,是一种通过控制点定义的平滑曲线。在MT5中,"Bezier_HTF"脚本引入了这一概念,允许交易者在不同的时间帧上绘制和分析Bezier曲线,以揭示市场动态的潜在模式。这个功能的实现得益于MQ5...