圆的生成1
- 格式:doc
- 大小:309.50 KB
- 文档页数:18
圆的第一定义第二定义第三定义1. 圆的第一定义:数学中的“圆”说到“圆”,大家首先想到的肯定是数学课上那个神秘的东西。
记得我第一次看到圆的定义,心里就想:“这是什么鬼?”其实,圆在数学上是一个简单又不简单的概念。
简单说,就是平面上所有距离某个固定点(也就是圆心)相同的点的集合。
哎,听起来是不是有点像谈恋爱?你我之间的距离总是那么近,嘿嘿,感觉到了吧?圆的半径就是从圆心到圆上任意一点的那条线。
想象一下,就像是你和你的朋友手拉手,围成一个圈。
这样一来,大家的距离都是一样的,哦,这种均匀感真让人开心。
不过,圆的定义可不仅仅是数学上的抽象东西。
它在我们生活中处处可见:披萨、车轮、游泳圈,甚至是那颗你喜欢的葡萄,都能归为圆的大家庭。
想想看,哪一个圆形的东西能让你忍不住想咬一口?哈哈!1.1 圆的特点说到圆的特点,大家肯定会想:“哦,它不就是个圆吗?”不不不,圆可不仅仅是个“圆”那么简单。
首先,圆是对称的,无论你从哪个方向看,它都是一模一样的,简直就是完美的代名词。
就像你心中那位完美的偶像,光环四射,让人无法抵挡。
再者,圆的周长和面积计算起来也很有趣,周长是 (2pi r),面积是 (pi r^2)。
听起来是不是有点复杂?别担心,反正只要记住 (pi) 这个神奇的数字就行了,嘿,生活中的小妙招。
2. 圆的第二定义:生活中的圆好吧,我们不再沉迷于数学的海洋,咱们聊聊生活中的圆。
圆在我们的日常生活中到处都是,就像那种你永远也躲不开的追求者,哈哈!无论是节日里的圆月,还是团圆饭上的大圆桌,圆都是团聚和和谐的象征。
看,过年回家时,和亲戚朋友围坐在一起,聊聊家长里短,心里暖暖的,整个气氛就像那颗圆圆的月亮,让人倍感亲切。
当然,生活中的圆也有点搞笑。
比如你在商场里转来转去,最后却迷了路,没想到自己又回到了原点。
那一刻,你就会感觉自己仿佛被生活的圆圈圈住了,真是哭笑不得。
不过,这种“圆”的感觉也挺不错,起码你知道自己是在“圆”里,找不到路的日子里,总能见到熟悉的风景,对吧?2.1 圆的象征意义说到象征,圆可是个不简单的角色。
24.1.1圆的定义及有关概念 一、学习目标1、探索圆的两种定义,理解并掌握弧、弦、优弧、劣弧、半圆等基本概念,能够从图形中识别;2、体会圆的不同定义方法,感受圆和实际生活的联系二、自学指导问题一:你接触过圆吗?生活中哪些物品是圆形的呢?你知道有关于圆的哪些知识呢?总结:(1)圆的描述性定义:在一个平面内,线段绕它的固定的一个端点旋转一周,另一个端点形成的图形叫做圆.固定的端点O 叫做圆心,线段OA 叫做半径.以点O 为圆心的圆,记作⊙O ,读作“圆O”.说明:“圆”指的是“圆周”,而不是“圆面”.(2)圆的集合性定义: 圆可以看作是到定点的距离等于定长的所有点的集合.问题二:等圆和同心圆等圆:半径相等的圆叫做等圆同心圆:圆心相同半径不等的圆叫做同心圆问题三:弦、弧、直径弦:连接圆上任意两点的线段叫作弦;直径:经过圆心的弦叫作直径;弧:圆上任意两点间的部分叫作圆弧,简称弧;弧的表示方法:以A 、B 为端点的弧记作AB ,读作“圆弧AB ”或“弧AB ”;半圆:圆的任意一条直径的两个端点把圆分成两条弧,每一条弧都叫作半圆. 优弧:大于半圆的弧叫作优弧,用三个字母表示,如上图中的ABC ;劣弧:小于半圆的弧叫作劣弧,如上图中的BC .三、互动研讨:☆☆1. 如图,请用正确的方式表示出以点A 为端点的优弧及劣弧.FE DC B AO IA B C O☆☆☆2.矩形ABCD 的对角线AC 、BD 相交于点O ,求证:A 、B 、C 、D 四个点都在以点O 为圆心的圆上.☆☆3.如下图所示,回答问题:(1)请写出图中所有的弦;(2)请任选一条弦,写出这条弦所对的弧;(3)若∠ABC=30°,你能求出哪些角的度数?四、课堂练习:☆☆4. 判断:(1)直径是弦. ( )(2)弦是直径. ( )(3)半圆是弧,但弧不一定是半圆.( )(4)半径相等的两个半圆是等弧. ( )☆☆5.下列说法中,结论错误的是( )A.直径相等的两个圆是等圆B.长度相等的两条弧是等弧C.圆中最长的弦是直径D.一条弦把圆分成两条弧,这两条弧可能是等弧☆☆☆6.如图,已知AB 为⊙O 的直径,点C 在⊙O 上,∠C =15°,则∠BOC的度数为( )A .15° B. 30° C. 45° D .60° ☆☆☆7. 平面上一点P 到⊙O 上一点的距离最长为6 cm ,最短为2 cm ,则⊙O 的半径为 .☆☆☆8. 如图,在⊙O 中,AB 是⊙O 的直径,点P 是OB 上的任一点(不与O 、B 两点重合),CD 、EF 是过点P 的两条弦,则图中的弦和以点B 为端点的劣弧分别有( ) A.3条,4个 B.4条,4个 C.5条,5个 D.5条,6个 A B C D E F P O。
圆的生成算法利用直线坐标法和极坐标法生成圆周颇费时间,而圆的Bresenham算法则简捷很多。
一.圆的Bresenham算法思想:设圆的半径为r,先考虑圆心在(0,0),并从x=0、y=r开始的顺时针方向的1/8圆周的生成过程。
在这种情况下,x每步增加1,从x=0开始,到x=y结束。
即有X i+1=X i+1相应地yi+1则在两种可能中选择:Y i+1=y i或者y i+1=y i-1选择的原则是考虑精确值y是靠近yi还是靠近yi-1,计算公式为Y2=r2-(x i+1)2d1=y i2-y2=y i2-r2+(x i+1)2d2=y2-(y i-1)2=r2-(x i+1)2-(y i-1)2令pi=d1-d2,并代入d1、d2,则有P i=2(x i+1)2+y i2+(y i-1)2-2r2(1)Pi称为误差。
如果Pi<0,则yi+1=yi,否则yi+1=yi-1.pi的递归式为P i+1=p i+4x i+6+2(y i+12-y i2)-2(y i+1-y i) (2)P i的初值由式(1)代入xi=0,yi=r,而得P1=3-2r (3)根据上面的推导,圆周生成算法思想如下:(1)求误差初值,p1=3-2r,i=1,画点(0,r);(2)求下一个光栅位置,其中x i+1=x i+1,如果p i<0,则y i+1=y i,否则y i+1=y i-1;(3)画点(x i+1,y i+1);(4)计算下一个误差,如果p i<0,则p i+1=p i+4x i+6,否则p i+1=p i+4(x i-y i)+10;(5)I=i+1,如果x=y,则结束,否则返回步骤2;虽然(1)式表示p i+1的算法很复杂,但因为y i+1只能y i或y i-1,使得步骤(4)的算法变得简单,只需做加法和乘4的乘法。
圆的Bresenham算法的程序实现如下:#include<stdio.h>#include<conio.h>#include<stdlib.h>#include<graphics.h>void BresenhemCircle(int centerx, int centery, int radius, int color, int type);void initgr(void) /* BGI初始化*/{int gd = DETECT, gm = 0; /* 和gd = VGA,gm = VGAHI是同样效果*/ registerbgidriver(EGAVGA_driver);/* 注册BGI驱动后可以不需要.BGI文件的支持运行*/ initgraph(&gd, &gm, "");setbkcolor(WHITE);}int main(void){int centerx,centery,radius,color,type;printf("centerx,centery\n");scanf("%d",¢erx);scanf("%d",¢ery);printf("radius\n");scanf("%d",&radius);printf("color,type\n");scanf("%d",&color);scanf("%d",&type);initgr(); /*BGI初始化*/BresenhemCircle(centerx,centery,radius,color,type);getch();closegraph();}void BresenhemCircle(int centerx, int centery, int radius, int color, int type){int x =type= 0;int y = radius;int delta = 2*(1-radius);int direction;while (y >= 0) {if (!type) {putpixel(centerx+x, centery+y, color);putpixel(centerx-x, centery+y, color);putpixel(centerx-x, centery-y, color);putpixel(centerx+x, centery-y, color);}else {line(centerx+x, centery+y, centerx+x, centery-y);line(centerx-x, centery+y, centerx-x, centery-y);}if (delta < 0) {if ((2*(delta+y)-1) < 0) {direction = 1;}else {direction = 2;}}else if(delta > 0) {if ((2*(delta-x)-1) <= 0) {direction = 2;}else {direction = 3;}}else {direction=2;}switch(direction) {case 1:x++;delta += (2*x+1);break;case 2:x++;y--;delta += 2*(x-y+1);break;case 3:y--;delta += (-2*y+1);break;}}}二.中心画圆法圆的特性:八对称性。
圆及圆弧生成算法圆及圆弧生成算法是计算机图形学中常用的算法之一,用于生成圆及圆弧的几何形状。
圆是一个闭合曲线,由一系列连续的点组成,其到中心点的距离都相等。
圆弧是圆的一部分,也是由一系列点组成的曲线。
下面将介绍几种常见的圆及圆弧生成算法。
1.中点圆生成算法:中点圆生成算法是一种常用的生成圆形的算法。
该算法从圆心开始,逐步生成圆上其它点的坐标,直到生成整个圆。
算法的基本思想是在每一步中选择一个点,使得该点的距离到圆的实际弧路径最接近满足圆方程的距离。
具体步骤如下:(1)初始化圆心坐标和半径;(2)设置初始点的坐标为(0,r),即圆上的一个点;(3)设置初始参数值d,初始值为1-r;(4)当x小于等于y时,递归生成圆上的其它点的坐标,具体步骤如下:-如果d<0,则令d=d+2x+3,x=x+1,y=y;-如果d>=0,则令d=d+2x-2y+5,x=x+1,y=y-1;(5)重复步骤(4)直到x大于y结束。
2. Bresenham圆生成算法:Bresenham圆生成算法是基于中点圆生成算法的改进。
该算法的主要思想是通过对称性减少计算量,较中点圆生成算法更快速。
具体步骤如下:(1)初始化圆心坐标和半径;(2)设置初始点的坐标为(0,r),即圆上的一个点;(3)设置初始参数值d,初始值为3-2r;(4)当x小于等于y时,递归生成圆上的其它点的坐标,具体步骤如下:-如果d<0,则令d=d+4x+6,x=x+1,y=y;-如果d>=0,则令d=d+4(x-y)+10,x=x+1,y=y-1;(5)重复步骤(4)直到x大于y结束。
3.中点圆弧生成算法:中点圆弧生成算法是用于生成圆弧的算法。
该算法通过给定圆心、弧的起始点和终止点,计算圆弧上的所有点的坐标。
具体步骤如下:(1)初始化圆心、起始点和终止点坐标;(2)计算圆上点的初始参数值d,初始值根据起始点和终止点的位置关系计算得到;(3)按递增顺序计算圆弧上的点的坐标,具体步骤如下:-如果d<0,则令d=d+4x+6,x=x+1,y=y;-如果d>=0,则令d=d+4(x-y)+10,x=x+1,y=y-1;-输出当前点的坐标;(4)重复步骤(3)直到到达终止点。
生成圆的bresenham算法原理描述详细Bresenham算法是计算机图形学中非常重要的算法之一,可以生成各种形状的图像。
其中,生成圆形图像的Bresenham算法也是应用比较广泛的算法之一。
本文将详细描述生成圆的Bresenham算法原理。
1. 圆的数学表示圆是一个几何图形,其数学表示为:x² + y² = r²,其中,x、y是圆上点的坐标,r是圆的半径。
因此,生成圆的Bresenham算法需要计算出符合该数学表示的所有点的坐标。
2. Bresenham算法的核心思想Bresenham算法的核心思想是利用对称性和递推式来快速计算出每个点的坐标。
对于圆而言,其有四分之一的区域可以通过对称性计算出来,而另外四分之三的区域可以通过递推式来得出。
3. 圆的对称性对于圆而言,其具有对称性,即当坐标为(x,y)在圆上时,也必然存在(y,x)、(y,-x)、(x,-y)、(-x,-y)、(-y,-x)、(-y,x)、(-x,y)在圆上的点,也就是说,直接通过圆的对称性可以得到大约四分之一的在圆上的点。
4. 圆的递推式对于圆的另外四分之三的部分,我们可以使用递推式来获得。
根据圆的坐标表示式x² + y² = r²,我们可以得到下届式:x² + y² - r² = 0根据这个方程,可以计算出下一个点的坐标为:x + 1, y 或 x + 1, y - 1如果采用当前点(x,y)的对称点来计算,比如(y,x),那么坐标可以改成:y + 1, x 或 y + 1, x - 1通过这种方式,就可以逐个计算出每个点的坐标了。
5. 算法步骤生成圆的Bresenham算法的步骤如下:1)确定圆的中心点的坐标和半径;2)以圆心为原点建立坐标系,以x轴为基准线向右,y轴向上;3)通过圆的对称性计算出直径上的点的坐标;4)使用递推式计算出剩余的坐标;5)根据得到的坐标渲染圆的边缘。
中北大学课 程 设 计 说 明 书学生姓名: 学 专 题 院: 业:冷欣璐学 号: 1005064216信息与通信工程学院 电子信息工程目:多媒体技术和程序设计实践:圆的生成指导教师:陈友兴陈平职称:副教授2011 年 12 月 30 日中北大学课程设计任务书2011/2012 学年第 一 学期学 专院: 业:信息与通信工程学院 电子信息工程 冷欣璐 曹振华 胡博伟 学 号: 1005064216 学 号: 1005064224 学 号: 1005064257学 生 姓 名: 学 生 姓 名: 学 生 姓 名:课程设计题目:多媒体技术和程序设计实践: 圆的生成 起 迄 日 期: 课程设计地点: 指 导 教 师: 系 主 任:2011 年 12 月 12 日~2011 年 12 月 30 日信息工程系综合实验室 陈友兴 王浩全 陈平下达任务书日期:2011 年 12 月 9 日课 程 设 计 任 务 书1.设计目的: (1) 掌握 VC++程序开发平台; (2) 掌握可视化实现和消息的响应; (3)掌握应用 VC++库函数实现数据的产生、显示等功能。
2.设计要求(包括原始数据、技术参数、条件、设计要求等) : (1)查阅相关资料,掌握基于面向对象的编程方法; (2)通过主界面的选择输入任意的圆心坐标和半径,生成不同的圆; (3)通过绘图功能显示坐标轴,实现生成圆的显示,通过鼠标点击圆周上的任意一点,实 时显示该点的坐标和数值; (4)要求 3 位同学各自实现不同分工。
3.设计原理: 用 Windows API 中的 Ellipse().只要把长半轴和短半轴设成一样长就能画圆.代码 如下: int m; m=ptTo.y-ptFrom.y;//计算出末点纵坐标与起点纵坐标之间的距离 point.x=ptFrom.x+m;//把上一步计算的距离加上起点横坐标就可以得出你想要的末点 横坐标,这样起点和末点横纵坐标之差就相等了,也就使长短半轴一样长了. CClientDC dc(this); dc.Ellipse(ptFrom.x,ptFrom.y,ptTo.x,ptTo.y);) 4.设计主要步骤:(1) 首先建立一单文档工程,并在 vc++下新建一个对话框,设置如下:对话框产生过程:从控件栏,拖入三个静态文本框,三个编辑框,对其进行命名。
双击确 定按钮,对其进行设定,形成程序如下: // DLG.cpp : implementation file //#include "stdafx.h" #include "LXL.h" #include "DLG.h"#ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILEstatic char THIS_FILE[] = __FILE__; #endif///////////////////////////////////////////////////////////////////////////// // DLG dialogDLG::DLG(CWnd* pParent /*=NULL*/) : CDialog(DLG::IDD, pParent) { //{{AFX_DATA_INIT(DLG) m_X = 0; m_R = 0; m_Y = 0; //}}AFX_DATA_INIT }void DLG::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(DLG)DDX_Control(pDX, IDOK, m_IDOK); DDX_Control(pDX, IDCANCEL, m_IDCANCEL); DDX_Text(pDX, IDC_EDIT1, m_X); DDX_Text(pDX, IDC_EDIT3, m_R); DDX_Text(pDX, IDC_EDIT2, m_Y); //x=pDX->m_X; //y=pDX->m_Y; //r=pDX->m_R; //}}AFX_DATA_MAP }BEGIN_MESSAGE_MAP(DLG, CDialog) //{{AFX_MSG_MAP(DLG) ON_EN_CHANGE(IDC_EDIT1, OnChangeEdit1) ON_EN_CHANGE(IDC_EDIT2, OnChangeEdit2) ON_EN_CHANGE(IDC_EDIT3, OnChangeEdit3) //}}AFX_MSG_MAP END_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////// // DLG message handlersvoid DLG::OnOK() { // TODO: Add extra validation here //编写代码 UpdateData(TRUE); //AfxMessageBox(m_X); //AfxMessageBox(m_Y); //AfxMessageBox(m_R); //编写代码结束CDialog::OnOK(); }void DLG::OnChangeEdit1() { // TODO: If this is a RICHEDIT control, the control will not // send this notification unless you override the CDialog::OnInitDialog() // function and call CRichEditCtrl().SetEventMask() // with the ENM_CHANGE flag ORed into the mask.// TODO: Add your control notification handler code here}void DLG::OnChangeEdit2() { // TODO: If this is a RICHEDIT control, the control will not // send this notification unless you override the CDialog::OnInitDialog() // function and call CRichEditCtrl().SetEventMask() // with the ENM_CHANGE flag ORed into the mask.// TODO: Add your control notification handler code here}void DLG::OnChangeEdit3() { // TODO: If this is a RICHEDIT control, the control will not // send this notification unless you override the CDialog::OnInitDialog() // function and call CRichEditCtrl().SetEventMask() // with the ENM_CHANGE flag ORed into the mask.// TODO: Add your control notification handler code here} (2) 定义公共变量:int x;int y;int r; (3) 主要的函数代码如下: // CLXLView drawingvoid CLXLView::OnDraw(CDC* pDC) { CLXLDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc);// TODO: add draw code for native data here //编写代码 //if(lpDoc) return; //设置映射模式,单位为 0.1mm,引时窗口坐标以客户区左上角为原点,X 轴的方向为 从左往右,Y 轴的方向为从下往上 pDC->SetMapMode(MM_LOMETRIC); //获得客户区域 CRect rc; GetClientRect(&rc); //将客户坐标转换为逻辑坐标pDC->DPtoLP(&rc); //在逻辑坐标下,意图将视口原点所置的位置 CSize org(200,-rc.bottom-200); //将该位置转换为设置坐标,方便移动视口坐标原点 pDC->LPtoDP(&org); //移动视口坐标原点,整个坐标尺在可见区域 pDC->SetViewportOrg(org.cx,org.cy); //在逻辑坐标系下画 X 轴,起点为逻辑坐标系下的原点,终点为自定的 pDC->MoveTo(0,0); //X 轴的长度为客户区的宽度减去 5 厘米(一个像素单位为 0.1mm) ,此时 X 轴终点距右 边框的距离为 3CM(视口原点已经移动到距左边框 2CM 处) pDC->LineTo(rc.right-500,0); //以下代码用来画 X 轴的终点箭头 pDC->MoveTo(rc.right-540,20); pDC->LineTo(rc.right-500,0); pDC->MoveTo(rc.right-540,-20); pDC->LineTo(rc.right-500,0); pDC->TextOut(rc.right-450,0,"X(cm)"); //在逻辑坐标系下画 Y 轴,起点为逻辑坐标系下的原点,终点为自定的 pDC->MoveTo(0,0); //Y 轴的长度为客户区的宽度减去 5 厘米(一个像素单位为 0.1mm) ,此时 Y 轴终点距上边框的距离为 3CM(视口原点已经移动到距下边框 2CM 处) pDC->LineTo(0,-rc.bottom-500); //以下代码用来画 Y 轴的终点箭头 pDC->MoveTo(-20,-rc.bottom-540); pDC->LineTo(0,-rc.bottom-500); pDC->MoveTo(20,-rc.bottom-540); pDC->LineTo(0,-rc.bottom-500); pDC->TextOut(0,-rc.bottom-450,"Y(cm)"); //在画标尺时,刻度的最大单位为 cm,最小单位为 mm,坐标轴上只画有整数个 cm 段, 并在相应的位置标明 cm 刻度 //计算 X 轴可以画出多少个 cm 刻度 int num=(rc.right-500)/100; //利用循环画 X 轴上的刻度,i 表示第多少个 mm 刻度,总共为 num*10 个毫米刻度 for(int i=1;i<=num*10;i++) { //毫米刻度能为 5 整除,此时的可能值为:5,10,15...... if(i%5==0) { //刻度为 10 的倍数时,画出刻度标记,它的长度为 4mm,并在刻度的下文标明刻度值, 单位为 cm if(i%10==0) {pDC->MoveTo(i*10,0); pDC->LineTo(i*10,40); CString str; str.Format("%d",i/10); pDC->TextOut(i*10-10,-10,str); } else//刻度为 5,15 等时,画出刻度标记,它的长度为 2mm { pDC->MoveTo(i*10,0); pDC->LineTo(i*10,20); } } else//画出其它毫米刻度 { pDC->MoveTo(i*10,0); pDC->LineTo(i*10,10); } } //计算 Y 轴可以画出多少个 cm 刻度 num=(-rc.bottom - 500)/100; // CString str; // str.Format("%d",num);// pDC->TextOut(500,500,str); //使用现 X 轴上的坐标相同的方法来绘制 Y 轴坐标,此时注意绘画点的改变 for(int j=1;j<=num*10;j++) { if(j%5==0) { if(j%10==0) { pDC->MoveTo(0,j*10); pDC->LineTo(40,j*10); CString str; str.Format("%d",j/10); pDC->TextOut(-45,j*10+10,str); } else { pDC->MoveTo(0,j*10); pDC->LineTo(20,j*10); } } else {pDC->MoveTo(0,j*10); pDC->LineTo(10,j*10); } } (4)画圆程序如下: //pDC->Ellipse(pDoc->x - pDoc->r/sqrt(2), pDoc->y - pDoc->r/sqrt(2),pDoc->x + pDoc->r/sqrt(2),pDoc->y+pDoc->r/sqrt(2)); pDC->Ellipse(pDoc->x pDoc->r, pDoc->y pDoc->r,pDoc->x +pDoc->r,pDoc->y+pDoc->r);//(画圆)(5)鼠标点击坐标位置设置程序如下: void CLXLView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default //编写代码 //pDC->LPtoDP(&rect);//将逻辑坐标转换为设备坐标 CString str; //定义字符串变量//str.Format("你按下了鼠标左键,当前 x 坐标为%d,当前 y 坐标 为%d",point.x-460,point.y-320); //格式化字符串 str.Format("你按下了鼠标左键,当前 x 坐标为%d,当前 y 坐标 为%d",point.x-72,point.y-456); //格式化字符串 MessageBox(str); //显示字符串//编写代码结束 CView::OnLButtonDown(nFlags, point);}6.运行结果: 主窗口界面输入圆心坐标、半径画圆产生新的圆产生点的坐标7.设计评价与收获: (1) 通过这次实验,我对于生成圆的过程有了更深刻的认识,同时对于圆生成算法和思 想也有了很好的理解。