编制椭圆旋转绘图函数
需要编制商标徽标程序和那些画板绘图类程序软件的,在编程时,一般的图形如点直线矩形圆形直接用绘图语句就能绘制,若要绘制椭圆和椭圆旋转就会有些困惑。本博文提供简单直捷的方法:用三角函数方法自己编制一个绘图函数。这样就可在程序编程语言平台迁移时少些麻烦。
数据传入:图形中心点 sx,sy,椭圆的半横轴半纵轴La,Lb,旋转角度 d,
依据此设置值可以绘制椭圆图形。
若La = Lb则画出的是圆形。
若设置角度值 d > 0 就可以实现椭圆旋转图形的画出。
图形旋转的公式:
a=2 *pi/180 * k;
2pi/180 整圆,pi/180半圆,k = 0 to 180
x0=(float)(La*cos(a)); //原点顺时针绘出
y0=(float)(Lb*sin (a));
x1, y1 >>> 依原点 x0, y0 和 旋转角度 d 计算
x1=(float)(x0 *cos (d)-y0 *sin (d))+sx ;
y1=(float)(y0 *cos (d)+x0 *sin (d))+sy ;
顺便说一下,有些文章介绍的是逆时针绘出图形,
x0=(La *cos(a))
y0=(Lb * sin(a)) 是 3点钟方向顺时针画点
x0=(La * sin (a))
x0=(Lb * cos(a)) 是 6点钟方向逆时针画点
还有一点说明:对于半长轴半短轴的提法语意不明确。我的理解是:x轴是横轴,y轴是纵轴,若x>y则是横向椭圆图形,y>x则是纵向椭圆图形。我以La.表示x轴,以Lb表示y轴,以此轴径来绘制椭圆。
下例是我编制的椭圆旋转绘图函数:
此函数是自己编制的私有函数,区别于Canvas 的内置函数
PDrawOval (float sx, float sy, float La, float Lb, float D){
//****** Draw Oval and Rotate figure ******
//** 传入 ( sx, sy, La, Lb, d )
// La, Lb 半横轴,半纵轴
// 图形中心点 sx, sy
// D ,setD=45 旋转角度
// 计算 d=pi/180*setD;
cs.SetFillMode (0);//0不填色,1填色
d=pi/180*D; //D=setD
sx1=(float)(La*cos(d))+sx ; //旋转后画笔起点
sy1=(float)(La*sin (d))+sy ;
//** 以一个周期画出椭圆点,连接点封闭椭圆
for (k=0;k<=180;k++){ //3 点钟方向顺时针绘出
a=2*pi/180*k; //2pi/180 整圆,pi/180半圆
x0=(float)(La*cos(a)); //原点顺时针绘
y0=(float)(Lb*sin (a));
x1=(float)(x0*cos (d)-y0*sin (d))+sx ;
y1=(float)(y0*cos (d)+x0*sin (d))+sy ;
//** x0 >> cos(a), y0 >> sin(a) 3点钟方向顺时针画点
//** x0 >> sin(a), y0 >> cos(a) 6点钟方向逆时针画点
//** 依旋转后点 x1, y1 画出椭圆
// cs.SetColor (255,0,250,0); //set pen color
cs.DrawPoint (x1,y1);
cs.DrawLine (sx1, sy1, x1,y1);
sx1=x1; sy1=y1;
}
cs.Update (); //画出图形
测试示例代码:繁花图形
test_draw (){
px=360; py=360;
cs.SetFillMode (1); //0不填色,1填色
cs.SetColor (255, 0, 0, 0);
cs.DrawRect (0, 0, 720, 720);
for(i=0;i<13;i++){ //十字星 六角形 八角形
a=2*pi/12*i;
L=60;
sx1=(float)(L*cos(a))+px ;
sy1=(float)(L*sin (a))+py ;
sx2=(float)((L-30)*cos(a))+px ;
sy2=(float)((L-30)*sin (a))+py ;
cs.SetColor (255, 250, 250, 0); //pen color
kn=20;
PDrawOval (sx1,sy1, kn*4, kn*2, i*30);
PDrawOval (sx2,sy2, 40, 20, i*30);
cs.SetColor (255, 0, 0, 0);
cs.DrawRect (20, 680, 700, 715);
cs.SetFillMode (1); //0不填色,1填色
cs.SetColor (255, 250, 250, 250);
ss="Test Draw figure : Rotate Oval " ;
cs.DrawText (ss, 80, 695);
cs.Update (); }
}//test Draw using private DrawOval ( )


测试示例代码:曼陀罗图案画
mandala (){
//** init center point
px=360; py=360; //** 图案输出中心点
cs.SetFillMode (1);//0不填色,1填色
cs.SetColor (255,0,0,0);
cs.DrawRect (0,0,720,720); //图形区清屏
//** 图案绘出
for (t=1; t<=8; t++){
cs.SetFillMode (1);//0不填色,1填色
cs.SetColor (255,0,0,0);
cs.DrawRect(20,660,700,710); //renew text
//** 屏幕打印状态提示
cs.SetFillMode (1);//0不填色,1填色
cs.SetTextSize (24);
s=intToString (t);
ss3="Times = "+s;
cs.DrawText (ss3,80,680);
cs.SetTextSize (28);
cs.DrawText ("Test Draw:曼陀罗图案 ",50,40);
cs.Update ();
//** 定范围设置中心距长度
Rn=random()*15 ;
L=50+(int)Rn;
//****** figure 1 ****** 图形叠加设计
//** 设置调色板颜色,取得颜色值
getcolor ();
for(i=0;i<16;i++){ // pi/8 八角形 i*45 度
a=2*pi/16*i ;
sx1=(float)((L+70)*sin(a))+px;
sy1=(float)(-(L+70)*cos(a))+py;
k=10; La=40; Lb=k*5 ;
//** 依取得颜色 >>> 颜色变化 a=150 半透明
cs.SetColor (150,r1+10,g1+k*25, 250-b1);
PDrawOval (sx1,sy1,La, Lb, i*22.5);
}
//****** figure 2 ****** 图形叠加设计
//** 设置调色板颜色,取得颜色值
getcolor ();
for(i=0;i<16;i++){ // pi/8 八角形 i*45 度
a=2*pi/16*i ;
sx1=(float)((L+110)*sin(a))+px;
sy1=(float)(-(L+110)*cos(a))+py;
sx2=(float)((L+80)*sin(a))+px; //两种写法
sy2=(float)(-(L+80)*cos(a))+py; //两种写法
//** 依取得颜色 >>> 颜色变化 a=150 半透明
k=10 ;
cs.SetColor (150,r1+10,g1+k*25,250-b1);
PDrawOval (sx1,sy1, 15, k*4, i*22.5);
PDrawOval (sx2,sy2, 10, 10, i*45);
}
//****** figure 3 **** center figure
//** 重新调色板设置颜色,取得颜色值
getcolor ();
for(i=0;i<8;i++){
a=2*pi/8*i ;
sx1=(float)((L-20)*cos(a))+px; //两种写法
sy1=(float)((L-20)*sin(a))+py; //两种写法
// ** 依取得颜色 >>> 颜色变化 a=150 半透明
k=25;
cs.SetColor (150,r1+10,g1+k*10,250-b1);
PDrawOval (sx1,sy1,30, 20, i*45);
}
} //next t
cs.Update ();
}//test ()



//** End ****