返回首页


{S0}简介
贝塞尔曲线是一条曲线,这是一个最常使用的计算机图形。用于3D的作品,其中还包括贝兹三角Bezier曲线的高维。皮埃尔贝塞尔​​,为雷诺车队工作的一个新的工程师,派生曲线计算的机制,这是他用来设计车身零件背后的概念。在一般情况下,贝塞尔方程是简单但参数方程在一个变量的t(其中t的范围从0 - 1)。我们将使用这个在哪里?
作为一个软件工程师/程序员,这是一个问题,我们有,当我们看到一些不规则的数学计算。但答案是,我们使用在几乎所有的图形相关的工程贝济耶绘制简单而流畅的曲线。我们在几乎所有的运动平稳的动画从一个点到另一个在后台使用Bezier曲线。这是广泛使用的Adobe Flash和转型的Silverlight以及。
有时,当您使用三维动画,贝塞尔曲线是用来定义3D路径和关键帧插补2D曲线。
我们也使用Bezier如果我们要创建捉襟见肘的文字,或有趣的寻找面临的,是有很多的计算,是具体的,大量的数学计算在后台执行这些功能。
在这篇文章中,我试图定义一个简单的贝塞尔曲线(点),并找到在任何给定的点的贝塞尔的角度。本文将帮助很多人已经拥有了贝塞尔曲线(S),并希望保持对象的旋转,移动一个对象的人。我怎么这样做呢?
我有一个要求,需要在一个给定的画布上绘制的对象路径,点需要转换成流畅的曲线。在完成此,我不得不移动对象(如箭头)从起始位置到结束位置,保持箭头的旋转角度。
我最初以为是要求搞砸了,但如你所知,Wiki有几乎所有的定义计算。作为一个数学爱好者,我接受了挑战驱动器通过一段时间的贝塞尔曲线和标准功能。

B(t) = (1-t)<sup>2</sup> P0 + 2(1-t) t P1 + t<sup>2</sup>P2 , t ranges from 0,1

这是一个二次贝塞尔曲线,其中P0为起点的功能,P2是终点,曲线通过P1的传递。还有其他各种贝塞尔曲线使用给定的功能是可以解决的的。
我们此功能转换到X,Y坐标如下:B(T)X =(1 - T)2 P0x 2(1 - T),T吨P1x t2P2x范围从0.1(决定了曲线的x坐标)B(T)Y =(1 - T)2 P0y 2(1 - T)T P1y t2P2y吨不等,从0,1(决定了曲线的y坐标)
我们将能够得到一个代T(0-1)值的值的范围;为T给人一种更精确的值会给你为X,Y坐标分钟值,使其顺利。代码说明
的代码分为以下模块:绘制贝塞尔曲线(Silverlight中已经有这个)。查找贝塞尔曲线的每一部分的坐标。确定点之间的角度。 画出你的箭头。
System.Windows.Media命名空间已经绘制贝塞尔段各阶层。他们BezierSegment(绘制三次贝塞尔曲线两点之间),PolyBezierSegment(绘制多个立方贝塞尔曲线),QuadraticBezierSegment(绘制二次贝塞尔曲线),PolyQuadraticBezierSegment(绘制二次贝塞尔曲线的一系列)。
我们使用QuadraticBezierSegment的类,下面给出这将创建一个给定的三个点的贝塞尔曲线。{C}
我们已经有一个用上面给出的代码绘制贝塞尔曲线绘制曲线是一次,我们要确定在曲线中所涉及的各点。我的目的,我只是想确定终点箭头,所以我限制的T值从0.99至1,我将只得到两分(这是必需的,以确定箭头的角度)。
注意:如果你想寻找参与曲线的所有点,你应该取代的开始值从0.99到0,如果你想进入分钟的曲线点,改变增量值从0.01至任何值较小。
double x = 0, y = 0;

double xold = 0, yold = 0;

double angle = 0;

for (double t = 0.99; t < 1.001; t += 0.01)

{

    x = ((1 - t) * (1 - t) * p0.X) + (2 * t * (1 - t) * p1.X) + (t * t * p2.X);

    //this statement is used to determine the x coordinate of the curve. 



    y = ((1 - t) * (1 - t) * p0.Y) + (2 * t * (1 - t) * p1.Y) + (t * t * p2.Y);

    //this statement is used to determine the y coordinate of the curve. 



    x = Math.Round(x, 3);

    y = Math.Round(y, 3);

    angle = Math.Round(Angle(xold, yold, x, y), 3);

    textBox1.Text += "Angle = " + angle.ToString() + "Degrees :" + 

                     x.ToString() + "," + y.ToString() + "\n";



    xold = x; yold = y;

}

E可确定两个不同的点,采用几何函数之间的角度。这是卡洛斯Femmer(感谢你的男人)提供的链接:{A}解释精美。
我用上面的网址中提到的相同的功能。
这篇文章的最后一部分是基于贝塞尔曲线的最后一点决定了我们的角度绘制一个箭头。我使用了一个rotateImage功能,基于角度的箭头旋转功能。下面的代码说明所涉及的细节。
//code to be placed in the Bezier Function

Image image = new Image();

Uri uri = new Uri("arrow.jpg", UriKind.Relative);

ImageSource img = new System.Windows.Media.Imaging.BitmapImage(uri);

image.Margin = new Thickness(x, y, 0, 0);



image.SetValue(Image.SourceProperty, img);

image.Width = 36;

image.Height = 32;

image.Stretch = Stretch.Fill;

image.VerticalAlignment = System.Windows.VerticalAlignment.Top;

image.HorizontalAlignment = System.Windows.HorizontalAlignment.Left;



LayoutRoot.Children.Add(image);



private void rotateImage(double angle, Image image1)

{

    WriteableBitmap bm;

    RotateTransform objTran;



    try

    {

        objTran = new RotateTransform();

        objTran.CenterX = 0.5 * image1.Width;

        objTran.CenterY = 0.5 * image1.Height;



        objTran.Angle = angle;



        bm = new WriteableBitmap(image1, objTran);

        image1.Source = (System.Windows.Media.ImageSource)bm;

        bm = null;

        GC.Collect();

    }

    catch (Exception ex)

    {

        //do waht ever you want here :) 

       

    } 
其他差异
我们可以创建贝塞尔使用下列公式的差异:
历史
的代码不会有多大的历史,我只写了两天回来,但我有一个。不写在这里,你们可能螺杆我与您的意见。

回答

评论会员:JohnExalt 时间:2012/01/27
!非常好的

感谢分享
评论会员:TefikBecirovic 时间:2012/01/27
感谢菲利普

VB程序员,VC
评论会员:JohnExalt 时间:2012/01/27
喂JohnExalt,感谢分享的文章

此外,还有一个简单的分析方法来确定quadrtic贝塞尔曲线的坡度。

B(T)=(1 - T)^ 2 * P0 2 * T *(1 - T)* P1 T ^ 2 * P2

B"(T)= DB(T)/ DT = 2 * T *(P0 - 2 * P1 P2)2 * P1 - 2 * P0 =(X'(T),Y(T))

这是一个点沿B(T)"速度"!

X'(T)= 2 * T *(P0.x 2 * P1.x P2.x)2 * P1.x - 2 * P0.x
Y'(T)= 2 * T *(P0.y - 2 * P1.y P2.y)2 * P1.y - 2 * P0.y

因此,坡度为T(T)= X'(T)/ Y(T)

在特殊情况下,y'(T)= 0斜率= 0。

关于
Tefik Becirovic
评论会员:TefikBecirovic 时间:2012/01/27
多数民众赞成伟大的..

程序员在VB,VC + +