编制椭圆旋转绘图函数

编制椭圆旋转绘图函数

需要编制商标徽标程序和那些画板绘图类程序软件的,在编程时,一般的图形如点直线矩形圆形直接用绘图语句就能绘制,若要绘制椭圆和椭圆旋转就会有些困惑。本博文提供简单直捷的方法:用三角函数方法自己编制一个绘图函数。这样就可在程序编程语言平台迁移时少些麻烦。

数据传入:图形中心点 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 (); //画出图形

}//Private.DrawOval ()

测试示例代码:繁花图形

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 ****

相关推荐
德思特12 小时前
测试效率跃升10倍!射频开关矩阵一站式解决多端口S参数测试与通信系统自动化路由难题
经验分享
上海广测检测科技有限公司13 小时前
VR眼镜PSB认证详解:新加坡安全标志注册制度的合规要求与技术要点分析
经验分享·vr
sdffdfdfdfd14 小时前
炫软美业管理系统:全链路数字化赋能,解锁美业门店盈利新范式
经验分享
南城以南溫暖如初14714 小时前
社区健身小程序开发流程详解:技术选型与实施经验分享
java·经验分享·spring boot·mysql·vue·apache
不正经学生14 小时前
C语言大小端字节序:内存里字节的排列顺序
c语言·开发语言·arm开发·c++·算法·c#
2601_9538246115 小时前
【计算机毕业设计】基于Spring Boot的宠物领养救助平台的设计与实现
spring boot·课程设计·宠物
动词ing15 小时前
【C语言】命名规范
c语言·开发语言
IT小白杨15 小时前
从Chromium重构到真实ARM云手机:多账号隔离方案的技术演进
大数据·经验分享·智能手机·重构·安全架构·指纹浏览器
YSL07012415 小时前
数据在内存中的存储
c语言
依然鸣15 小时前
PTA团体程序设计天梯赛L2真题讲解L2-001-004
经验分享·学习·算法·深度优先·pat考试