关于windows屏幕保护程序中贝塞尔曲线的问题
非常喜欢windows屏幕保护程序中贝塞尔曲线的效果,但苦于自己不会其中的算法,请高手赐教!如果可以的话希望也可以提供普通贝塞尔曲线的算法。我会加分的...
非常喜欢windows屏幕保护程序中贝塞尔曲线的效果,但苦于自己不会其中的算法,请高手赐教!
如果可以的话希望也可以提供普通贝塞尔曲线的算法。
我会加分的 展开
如果可以的话希望也可以提供普通贝塞尔曲线的算法。
我会加分的 展开
展开全部
/*
产生三次方贝塞尔曲线的程序码
*/
typedef struct
{
float x;
float y;
}
Point2D;
/*
cp 在此是四个元素的阵列:
cp[0] 为起始点,或上图中的 P0
cp[1] 为第一个控制点,或上图中的 P1
cp[2] 为第二个控制点,或上图中的 P2
cp[3] 为结束点,或上图中的 P3
t 为参数值,0 <= t <= 1
*/
Point2D PointOnCubicBezier( Point2D* cp, float t )
{
float ax, bx, cx;
float ay, by, cy;
float tSquared, tCubed;
Point2D result;
/* 计算多项式系数 */
cx = 3.0 * (cp[1].x - cp[0].x);
bx = 3.0 * (cp[2].x - cp[1].x) - cx;
ax = cp[3].x - cp[0].x - cx - bx;
cy = 3.0 * (cp[1].y - cp[0].y);
by = 3.0 * (cp[2].y - cp[1].y) - cy;
ay = cp[3].y - cp[0].y - cy - by;
/* 计算位于参数值 t 的曲线点 */
tSquared = t * t;
tCubed = tSquared * t;
result.x = (ax * tCubed) + (bx * tSquared) + (cx * t) + cp[0].x;
result.y = (ay * tCubed) + (by * tSquared) + (cy * t) + cp[0].y;
return result;
}
/*
ComputeBezier 以控制点 cp 所产生的曲线点,填入 Point2D 结构的阵列。
呼叫者必须分配足够的内存以供输出结果,其为 <sizeof(Point2D) numberOfPoints>
*/
void ComputeBezier( Point2D* cp, int numberOfPoints, Point2D* curve )
{
float dt;
int i;
dt = 1.0 / ( numberOfPoints - 1 );
for( i = 0; i < numberOfPoints; i++)
curve[i] = PointOnCubicBezier( cp, i*dt );
}
产生三次方贝塞尔曲线的程序码
*/
typedef struct
{
float x;
float y;
}
Point2D;
/*
cp 在此是四个元素的阵列:
cp[0] 为起始点,或上图中的 P0
cp[1] 为第一个控制点,或上图中的 P1
cp[2] 为第二个控制点,或上图中的 P2
cp[3] 为结束点,或上图中的 P3
t 为参数值,0 <= t <= 1
*/
Point2D PointOnCubicBezier( Point2D* cp, float t )
{
float ax, bx, cx;
float ay, by, cy;
float tSquared, tCubed;
Point2D result;
/* 计算多项式系数 */
cx = 3.0 * (cp[1].x - cp[0].x);
bx = 3.0 * (cp[2].x - cp[1].x) - cx;
ax = cp[3].x - cp[0].x - cx - bx;
cy = 3.0 * (cp[1].y - cp[0].y);
by = 3.0 * (cp[2].y - cp[1].y) - cy;
ay = cp[3].y - cp[0].y - cy - by;
/* 计算位于参数值 t 的曲线点 */
tSquared = t * t;
tCubed = tSquared * t;
result.x = (ax * tCubed) + (bx * tSquared) + (cx * t) + cp[0].x;
result.y = (ay * tCubed) + (by * tSquared) + (cy * t) + cp[0].y;
return result;
}
/*
ComputeBezier 以控制点 cp 所产生的曲线点,填入 Point2D 结构的阵列。
呼叫者必须分配足够的内存以供输出结果,其为 <sizeof(Point2D) numberOfPoints>
*/
void ComputeBezier( Point2D* cp, int numberOfPoints, Point2D* curve )
{
float dt;
int i;
dt = 1.0 / ( numberOfPoints - 1 );
for( i = 0; i < numberOfPoints; i++)
curve[i] = PointOnCubicBezier( cp, i*dt );
}
展开全部
/*
产生三次方贝塞尔曲线的程序码
*/
typedef
struct
{
float
x;
float
y;
}
Point2D;
/*
cp
在此是四个元素的阵列:
cp[0]
为起始点,或上图中的
P0
cp[1]
为第一个控制点,或上图中的
P1
cp[2]
为第二个控制点,或上图中的
P2
cp[3]
为结束点,或上图中的
P3
t
为参数值,0
<=
t
<=
1
*/
Point2D
PointOnCubicBezier(
Point2D*
cp,
float
t
)
{
float
ax,
bx,
cx;
float
ay,
by,
cy;
float
tSquared,
tCubed;
Point2D
result;
/*
计算多项式系数
*/
cx
=
3.0
*
(cp[1].x
-
cp[0].x);
bx
=
3.0
*
(cp[2].x
-
cp[1].x)
-
cx;
ax
=
cp[3].x
-
cp[0].x
-
cx
-
bx;
cy
=
3.0
*
(cp[1].y
-
cp[0].y);
by
=
3.0
*
(cp[2].y
-
cp[1].y)
-
cy;
ay
=
cp[3].y
-
cp[0].y
-
cy
-
by;
/*
计算位于参数值
t
的曲线点
*/
tSquared
=
t
*
t;
tCubed
=
tSquared
*
t;
result.x
=
(ax
*
tCubed)
+
(bx
*
tSquared)
+
(cx
*
t)
+
cp[0].x;
result.y
=
(ay
*
tCubed)
+
(by
*
tSquared)
+
(cy
*
t)
+
cp[0].y;
return
result;
}
/*
ComputeBezier
以控制点
cp
所产生的曲线点,填入
Point2D
结构的阵列。
呼叫者必须分配足够的内存以供输出结果,其为
<sizeof(Point2D)
numberOfPoints>
*/
void
ComputeBezier(
Point2D*
cp,
int
numberOfPoints,
Point2D*
curve
)
{
float
dt;
int
i;
dt
=
1.0
/
(
numberOfPoints
-
1
);
for(
i
=
0;
i
<
numberOfPoints;
i++)
curve[i]
=
PointOnCubicBezier(
cp,
i*dt
);
}
产生三次方贝塞尔曲线的程序码
*/
typedef
struct
{
float
x;
float
y;
}
Point2D;
/*
cp
在此是四个元素的阵列:
cp[0]
为起始点,或上图中的
P0
cp[1]
为第一个控制点,或上图中的
P1
cp[2]
为第二个控制点,或上图中的
P2
cp[3]
为结束点,或上图中的
P3
t
为参数值,0
<=
t
<=
1
*/
Point2D
PointOnCubicBezier(
Point2D*
cp,
float
t
)
{
float
ax,
bx,
cx;
float
ay,
by,
cy;
float
tSquared,
tCubed;
Point2D
result;
/*
计算多项式系数
*/
cx
=
3.0
*
(cp[1].x
-
cp[0].x);
bx
=
3.0
*
(cp[2].x
-
cp[1].x)
-
cx;
ax
=
cp[3].x
-
cp[0].x
-
cx
-
bx;
cy
=
3.0
*
(cp[1].y
-
cp[0].y);
by
=
3.0
*
(cp[2].y
-
cp[1].y)
-
cy;
ay
=
cp[3].y
-
cp[0].y
-
cy
-
by;
/*
计算位于参数值
t
的曲线点
*/
tSquared
=
t
*
t;
tCubed
=
tSquared
*
t;
result.x
=
(ax
*
tCubed)
+
(bx
*
tSquared)
+
(cx
*
t)
+
cp[0].x;
result.y
=
(ay
*
tCubed)
+
(by
*
tSquared)
+
(cy
*
t)
+
cp[0].y;
return
result;
}
/*
ComputeBezier
以控制点
cp
所产生的曲线点,填入
Point2D
结构的阵列。
呼叫者必须分配足够的内存以供输出结果,其为
<sizeof(Point2D)
numberOfPoints>
*/
void
ComputeBezier(
Point2D*
cp,
int
numberOfPoints,
Point2D*
curve
)
{
float
dt;
int
i;
dt
=
1.0
/
(
numberOfPoints
-
1
);
for(
i
=
0;
i
<
numberOfPoints;
i++)
curve[i]
=
PointOnCubicBezier(
cp,
i*dt
);
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询