编制椭圆旋转绘图函数

编制椭圆旋转绘图函数

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

数据传入:图形中心点 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 ****

相关推荐
智者知已应修善业2 小时前
【51单片机2个按键控制流水灯运行与暂停】2023-9-6
c++·经验分享·笔记·算法·51单片机
iCxhust4 小时前
微机原理实践教程(C语言篇)---A002流水灯
c语言·开发语言·单片机·嵌入式硬件·51单片机·课程设计·微机原理
qeen874 小时前
【数据结构】建堆的时间复杂度讨论与TOP-K问题
c语言·数据结构·c++·学习·
handler015 小时前
Linux 内核剖析:进程优先级、上下文切换与 O(1) 调度算法
linux·运维·c语言·开发语言·c++·笔记·算法
热心网友俣先生5 小时前
2026年第二十三届五一数学建模竞赛C题超详细解题思路+各问题可用模型推荐+部分模型结果展示
c语言·开发语言·数学建模
li1670902706 小时前
第二十七章:智能指针
c语言·数据结构·c++·visual studio
草履虫君6 小时前
VMware 虚拟机网络性能优化指南:从 11 秒到 4 秒的完整调优实践
服务器·网络·经验分享·性能优化
05候补工程师7 小时前
【ROS 2 具身智能】Gazebo 仿真避坑指南:从“幽灵机器人”到传感器数据流打通
人工智能·经验分享·笔记·ubuntu·机器人
Aurorar0rua8 小时前
CS50 x 2024 Notes C - 07
c语言·学习方法