APP下载

正多边形和心脏线生成算法

2021-02-28张博

电脑知识与技术 2021年35期
关键词:构造算法

摘要:对于正多边形和心脏线图形的生成,本文给出了新的递推公式,并以该公式为基础构造了正多边形和心脏线的生成算法;该算法在等分角度的设定下,计算正多边形每对顶点需要2次乘法运算,计算心脏线每对点需要4次乘法运算,算法避免了大量的三角函数运算因而效率较高。用VB编写程序对算法进行了验证,算法具有一定的实用价值。

关键词:正多边形;心脏线;构造;算法;递推公式

中图分类号:TP391     文献标识码:A

文章编号:1009-3044(2021)35-0127-02

1 正多边形算法设计

1.1 正多边形算法递推公式的构造

r为正多边形外接圆半径,圆心与直角坐标系下的原点[o]重合。假设把圆周角[m]等份,每份对应的角度[θ=2π/m]。沿[x]轴的正方向逆时针方向顺次在圆上取点,相邻两点圆弧对应的圆心角为[θ]。初始时,取[x0=0,y0=r;] [x1=rcos(θ),] [y1=rsin(θ)]。

[xn=rcos(nθ)]

[yn=rsin(nθ)]

根据前面两对点的坐标值,可推导出新的一个点的坐标。下面推出递推公式:

[xn+2=rcos((n+2)θ)]    [=rcos((n+1)θ)cos(θ)-rsin((n+1)θ)sin(θ)=2rcos(θ)cos((n+1)θ)-r(cos((n+1)θ)cos(θ)+sin((n+1)θ)sin(θ)=2rcos(θ)cos((n+1)θ)-rcos(nθ)=2cos(θ)xn+1-xn]

[yn+2=rsin((n+2)θ)]    [=rsin((n+1)θ)cos(θ)+rcos((n+1)θ)sin(θ)=2rcos(θ)sin((n+1)θ)-r(sin((n+1)θ)cos(θ)-cos((n+1)θ)sin(θ))=2rcos(θ)sin((n+1)θ)-rsin(nθ)=2cos(θ)yn+1-yn]

r为正多边形外接圆半径,m为多边形的边数,color为生成多边形所用的颜色。t为每一条边对应圆心角值。初始化后每次循环生成一对点画一条线,直到执行m-1次循环。

1.2 正多边形的生成算法

Pcreat(r,m,color)

int r,m,color;

{

int i,cx,cy;

float xn0,yn0,xn1,yn1,xn2,yn2,pi,t,d;

pi=3.1415927;                    /*pi是圆周率*/

t=2*pi/m;

d=2*cos(t);                      /*t为上面递推公式中的等分角度*/

xn0=0;                         /*(xn0,yn0),第1对起始点初始化*/

yn0=r;

xn1=r*cos(t);                    /*(xn1,yn1),第2对起始点初始化*/

yn1=r*sin(t);

line (xn0,yn0)-(xn1,yn1),color;      /*两对起始点以color颜色画线*/

for (i=2;i<=m;i++)

{

xn2=d*xn1-xn0;                 /*计算新的一对坐标(xn2,yn2)*/

yn2=d*yn1-yn0;

Line (xn2,yn2)-(xn1,yn1),color;     /*两对点以color颜色画线*/

xn0=xn1;

yn0=yn1;

xn1=xn2;

yn1=yn2;

}

}/*pcreat*/

1.3 正多边形应用实例输出

用VB6.0编写程序得到图1。

1.4 正多边形算法分析

算法速度主要取决于正多边形的边数(m)和计算每对点的计算量。初始化后,计算每对绘图点需要2次乘法运算。计算m个绘图点需要2m次乘法运算。

2 心脏线算法设计

2.1 心脏线递推公式构造

在直角坐標系中,普通螺旋线的参数方程为:

[x=acosθ(1+cosθ))y=asinθ(1+cosθ),θ∈0,2π]

其中,[x,y的单位为像素] 。

变换上式可得:

[x=acosθ+a2·cos2θ+a2y=asinθ+a2·sin2θ]

假设把以上区间分成m份,每份的角度为:[t=2πm] 。当[θ=kt]时(k=0,1,…,n),分别计算出[x]和[y]的值。

为表达递推公式方便,令[f(n)=acos(n⋅t),g(n)=asin(n⋅t),]其中0≤n≤m。[f1(n)=a2·cos(n⋅2t),g1(n)=a2·sin(n⋅2t),]其中0≤n≤m。

采用与正多边类似的构造方法,可构造出心脏线算法。

2.2 心脏线生成算法

Stancu (a,m,color)

int a, m, color;

{

int i;

float xn1, xn2, yn1, yn2, xm1, xm2, ym1, ym2 ;

float pi, t, t2, u, d, d2, x, y;

pi = 3.14159;

cx = 800.5;

cy = 1500.5;

a = 1000;

m = 1000;

t = 2 * pi / m;

t2 = 2 * t;

u = a / 2;

d = 2 * Cos(t);

d2 = 2 * Cos(t2);

xn0 = a * Cos(0);

yn0 = a * Sin(0);

xm0 = a / 2 * Cos(0);

ym0 = a / 2 * Sin(0);

x = xn0 + xm0 + u;             /*(x,y),第1對起始点初始化*/

y = yn0 + ym0;

drawpixel ( int(x), int(y),color);   /*显示第1个点*/

xn1 = a * Cos(t);

yn1 = a * Sin(t);

xm1 = a / 2 * Cos(t2);

ym1 = a / 2 * Sin(t2);

x = xn1 + xm1 + u;             /*第2对起始点初始化*/

y = yn1 + ym1;

drawpixel ( int(x), int(y),color);   /*显示第2个点*/

for( i = 2; i<=m; i++ )

xn2 = d * xn1 - xn0;           /*计算新的点*/

yn2 = d * yn1 - yn0;

xm2 = d2 * xm1 - xm0;

ym2 = d2 * ym1 - ym0;

x = xn2 + xm2 + u;

y = yn2 + ym2;

drawpixel ( int(x), int(y),color);   /*显示新的点*/

xn0 = xn1: yn0 = yn1;

xn1 = xn2: yn1 = yn2;

xm0 = xm1: ym0 = ym1;

xm1 = xm2: ym1 = ym2;

}

}/* Stancu */

xn0,xn1,xn2对应f(n),f(n+1)和f(n+2); yn0,yn1,yn2对应g(n),g(n+1)和g(n+2)。xm0,xm1,xm2对应f1(n),f1(n+1)和f1(n+2);yn0,yn1,yn2对应g1(n),g1(n+1)和g1(n+2)。

2.3 心脏线应用实例输出

用VB6.0编写程序得到图2的输出,其中,a=1000,m=1500。

2.4 心脏线算法分析

算法速度取决于取点数的多少和计算每对点的计算量。初始化后,计算每对绘图点需要4次乘法运算。计算m个绘图点需要4m次乘法运算。

3 结束语

本文给出了正多边形和心脏线的逐点生成算法,并且已经编写了程序进行了验证。算法具有构造简单,执行速度较快的特点。通过构造递推公式的方法避免了大量的三角函数运算,算法中乘法运算次数也较少,因此算法效率较高。递推公式的构造方法也可以应用于类似的其他问题中,对于基于角度的图像绘制算法的研究具有参考意义。

参考文献:

[1] 李星秀,康宝生.玫瑰线和普通旋轮线的逐点生成算法[J].计算机工程与设计,2006,27(5):746-748.

[2] 刘勇奎.直线与曲线的逐点生成算法[J].工程图学学报,2005,26(6):41-51.

[3] 张博.圆的高质量、快速生成算法[J].计算机应用与软件,1994,11(2):51-56.

[4] 谭浩强.Visual Basic程序设计[M].北京:清华大学出版社,2004.

[5] 严蔚敏,吴伟民.数据结构:C语言版[M].北京:清华大学出版社,1997.

[6] 张博.普通旋轮线和玫瑰线的逐点生成新算法[J].计算机时代,2014(9):54-56.

【通联编辑:梁书】

猜你喜欢

构造算法
基于MapReduce的改进Eclat算法
Travellng thg World Full—time for Rree
进位加法的两种算法
构造单元划分及岩石变质作用概述
基于增强随机搜索的OECI-ELM算法
工业机器人技术的发展与应用综述
流逝的岁月 流淌的歌声
一种改进的整周模糊度去相关算法
印度尼西亚金多金属成矿条件及规律