openGL画直线、圆、椭圆

openGL画直线、圆、椭圆
openGL画直线、圆、椭圆

使用openGl画直线(DDA算法)、画圆、椭圆(Bresenham算法)

#include

#include

#include

/* initialization: */

void myinit(void)

{

/* attributes */

glClearColor(1.0, 1.0, 1.0, 0.0); /* white background */

glColor3f(1.0, 0.0, 0.0); /* draw in red */

/* set up viewing: */

/* 500 x 500 window with origin lower left */

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluOrtho2D(0.0, 500.0, 0.0, 500.0);

glMatrixMode(GL_MODELVIEW);

}

void plot_circle_points(int xc,int yc,int x,int y)//画圆

{

glBegin(GL_POINTS);

glV ertex3f(xc+x,yc+y,0);

glV ertex3f(xc-x,yc+y,0);

glV ertex3f(xc+x,yc-y,0);

glV ertex3f(xc-x,yc-y,0);

glV ertex3f(xc+y,yc+x,0);

glV ertex3f(xc-y,yc+x,0);

glV ertex3f(xc+y,yc-x,0);

glV ertex3f(xc-y,yc-x,0);

glEnd();

}

void drawcircle(int xc,int yc,int radius)

{

int x,y,p;

x=0;

y=radius;

p=3-2*radius;

glClear(GL_COLOR_BUFFER_BIT);

glBegin(GL_POINTS);

while(x

{

plot_circle_points(xc,yc,x,y);

if(p<0)

p=p+4*x+6;

else

{

p=p+4*(x-y)+10;

y-=1;

}

x+=1;

}

if(x==y)

plot_circle_points(xc,yc,x,y);

}

void putpixel(int xc,int yc,int x,int y)//画椭圆{

glBegin(GL_POINTS);

glV ertex3f(xc+x,yc+y,0);

glEnd();

}

void drawEllipse(int xc,int yc,int a,int b)

{

int x,y;

float d1,d2;

x=0;

y=b;

d1=b*b+a*a*(-b+0.25);

putpixel(xc,yc,x,y);

putpixel(xc,yc,-x,-y);

putpixel(xc,yc,-x,y);

putpixel(xc,yc,x,-y);

while(b*b*(x+1)

{

if(d1<0)

{

d1+=b*b*(2*x+3);

x++;

}

else

{

d1+=b*b*(2*x+3)+a*a*(-2*y+2);

x++;

y--;

}

putpixel(xc,yc,x,y);

putpixel(xc,yc,-x,-y);

putpixel(xc,yc,-x,y);

putpixel(xc,yc,x,-y);

}

d2=b*b*(x+0.5)*(x+0.5)+a*a*(y-1)*(y-1)-a*a*b*b;

while(y>0)

{

if(d2<=0)

{

d2+=b*b*(2*x+2)+a*a*(-2*y+3);

x++;

y--;

}

else

{

d2+=a*a*(-2*y+3);

y--;

}

putpixel(xc,yc,x,y);

putpixel(xc,yc,-x,-y);

putpixel(xc,yc,-x,y);

putpixel(xc,yc,x,-y);

}

}

void dda_line(int xa,int ya,int xb,int yb)//画直线

{

GLfloat delta_x,delta_y,x,y;

int dx,dy,steps;

dx=xb-xa;

dy=yb-ya;

if(abs(dx)>abs(dy))

steps=abs(dx);

else

steps=abs(dy);

delta_x=(GLfloat)dx/(GLfloat)steps;

delta_y=(GLfloat)dy/(GLfloat)steps;

x=xa;

y=ya;

glClear(GL_COLOR_BUFFER_BIT);

glBegin(GL_POINTS);

glV ertex3f(x,y,0);

for(int k=1;k<=steps;k++)

{

x+=delta_x;

y+=delta_y;

glBegin(GL_POINTS);

glV ertex3f(x,y,0);

glEnd();

}

}

/* the display callback: */

void display1() //画圆

{

glClear(GL_COLOR_BUFFER_BIT); /*clear the window */

/*----------------------------------------*/

/* viewport stuff */

/*----------------------------------------*/

/* set up a viewport in the screen window */

/* args to glV iewport are left, bottom, width, height */

glViewport(0, 0, 500, 500);

/* NB: default viewport has same coords as in myinit, */

/* so this could be omitted: */

dda_line(20,20,420,350);

/* and flush that buffer to the screen */

glFlush();

}

void display2() //画圆

{

glClear(GL_COLOR_BUFFER_BIT); /*clear the window */

/*----------------------------------------*/

/* viewport stuff */

/*----------------------------------------*/

/* set up a viewport in the screen window */

/* args to glV iewport are left, bottom, width, height */

glViewport(0, 0, 500, 500);

/* NB: default viewport has same coords as in myinit, */

/* so this could be omitted: */

drawcircle(250,250,100);

/* and flush that buffer to the screen */

glFlush();

}

void display3() //画圆

{

glClear(GL_COLOR_BUFFER_BIT); /*clear the window */

/*----------------------------------------*/

/* viewport stuff */

/*----------------------------------------*/

/* set up a viewport in the screen window */

/* args to glV iewport are left, bottom, width, height */

glViewport(0, 0, 500, 500);

/* NB: default viewport has same coords as in myinit, */

/* so this could be omitted: */

drawEllipse(250,250,60,40);

/* and flush that buffer to the screen */

glFlush();

}

int main(int argc, char** argv)

{

/* Standard GLUT initialization */

glutInit(&argc,argv);

glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); /* default, not needed */ glutInitWindowSize(500,500); /* 500 x 500 pixel window */

glutInitWindowPosition(0,0); /* place window top left on display */

cout<<"************************************************"<

cout<<"**** 请选择如下操作: *****"<

cout<<"**** 1.用DDA画线*****"<

cout<<"**** 2.用Bresenham算法画圆*****"<

cout<<"**** 3.用Bresenham算法画椭圆*****"<

cout<<"************************************************"<

cout<<"请选择如下操作:";

int choice;

cin>>choice;

switch(choice)

{

case 1:

glutCreateWindow("Bresenham circile"); /* window title */

glutDisplayFunc(display1); /* display callback invoked when window opened */ myinit(); /* set attributes */

glutMainLoop(); /* enter event loop */

break;

case 2:

glutCreateWindow("Digital Differential Analyser Line"); /* window title */ glutDisplayFunc(display2); /* display callback invoked when window opened */ myinit(); /* set attributes */

glutMainLoop(); /* enter event loop */

break;

case 3:

glutCreateWindow("MidBresenhamEllipse"); /* window title */

glutDisplayFunc(display3); /* display callback invoked when window opened */ myinit(); /* set attributes */

glutMainLoop(); /* enter event loop */

default: return 0;

}

return 0;

}

直线和圆、椭圆-单元测试卷

句容实高2015-2016学年高二年级第一学期 数学周练试卷一 考试时间:120分钟 命题范围:直线和圆、椭圆 命题人:裴贤喜 审核人:戴朝荣 姜顺根 一、填空题:本大题共14小题,每小题5分,共60分.不需要写出解答过程,请把答案直接填在答题卡...相应位置上..... . 1、圆心在),4,3(-C 且经过点(5,1)的圆的方程为 2、方程224250x y x y m ++-+=表示圆的条件是 3、自点)4,1(-A 作圆 1)3() 2(22=-+-y x 的切线,则切线长为 4、若点)11( -,在圆25)2()(22=++-y a x 外,则实数a 的取值范围是 5、椭圆22 125 x y m m +=-+的焦点坐标是 6、过点),(2-3且与椭圆36942 2=+y x 有相同焦点的椭圆的方程是 7、已知椭圆的中心在坐标原点,焦点在坐标轴上,离心率2 3= e ,且经过点)0,2(,则这个椭圆的方程为 8、已知圆1C :2224x y mx y +-++250m -=,圆2C : my x y x 222 2-+++230m -=,若圆1C 与圆2C 相外切,则m 的值 9、若圆422=+y x 与圆)0(06222>=-++a ay y x 的公共弦的长为23,则a =________ 10、若椭圆1322=+m y x 的离心率为2 1,则实数=m 11、已知122=+y x ,则2 y x +的取值范围是 12、若直线01=+-by ax 过圆0142:22=+-++y x y x C 的圆心,则ab 的取值范围是 13、若圆02222 2=++-+y kx y x 与两坐标轴无公共点,那么实数k 的取值范围为 14、在平面直角坐标系xOy 中,圆C 的方程为2240x y x +-=.若直线(1)y k x =+上存在一点P ,使过P 所作的圆的两条切线相互垂直,则实数k 的取值范围是 .

一种椭圆曲线快速生成算法

一种椭圆曲线参数生成的快速算法 谷勇浩 刘勇 (北京邮电大学通信网络综合技术研究所) 摘要:椭圆曲线密码体制是公钥密码中的研究热点。该文介绍了椭圆曲线密码体制的基本概念及相关知识,讨论了目前基于离散对数问题的椭圆曲线密码的研究动态。本文的创新点是针对目前椭圆曲线研究重点之一——椭圆曲线参数生成算法,给出了一种生成参数a 、b 的快速算法。这种算法利用了Jacobi 符号和二次剩余的理论,并且用matlab 计算出利用这种算法生成一个椭圆曲线的平均时间,最后我们分析了今后椭圆曲线密码系统的研究方向和重点。 关键词:椭圆曲线;离散对数问题;Jacobi 符号;二次剩余;阶 1976年Diffie 和Hellman 提出公钥密码思想以来,国际上提出了许多种公钥密码体制的实现方案。一些已经被攻破,一些被证明是不可行的。目前,只有3类公钥密码体制被认为是安全有效的,按照其所依据的数学难题划分为:基于大整数分解问题(IFP ),如RSA 体制和Rabin 体制;基于有限域离散对数问题(DLP ),如Diffie-Hellman 体制和ElGamal 体制;基于椭圆曲线离散对数问题(ECDLP ),如椭圆密码体制。椭圆曲线应用到密码学上最早是由Neal Koblitz 和Victor Miller 在1985年分别独立提出的。它是目前已知的公钥体制中,对每一比特所提供加密强度最高的一种体制。它具有安全性高、密钥量小、灵活性好的特点,受到了国际上的广泛关注。而SET(Secure Electronic Transaction)协议的制定者已把它作为下一代SET 协议中缺省的公钥密码算法。深入研究基于椭圆曲线离散对数问题的公钥密码具有很大的现实意义。 1建立椭圆曲线公钥密码体制 1.1椭圆曲线域的参数 在基于椭圆曲线的加解密和数字签名的实现方案中,首先要给出椭圆曲线域的参数来确定一条椭圆曲线。在 IEEE P1363标准中,定义其参数为一个七元组:T=(q,FR,a,b,G,n,h),其中q 代表有限域GF(q),q 为素数或 2 m ;FR 为域表示法,如f(x)为 2 m F 域元素的不可约 多项式的表示法;曲线的方程,当q 为素数时,方程为2 3 ax b y x =++,当q 为2m 时, 方程为 2 32 xy a b y x x +=++,a,b 是方程中的系数;G 为基点;n 为大素数并且等于点G 的阶,h 是小整数称为余因子且#()/q h E n F =。主要的安全性参数是n ,因此ECC 密钥 的长度就定义为n 的长度。 1.2椭圆曲线密码的密钥 选取了基域 q F 和椭圆曲线后,得到了在有限域 q F 上的曲线E 确定的具体形式,即 上述的椭圆曲线域参数的一个七元组。每个用户选取一个整数d(1≤d ≤n-1) 作为其私钥,而以点Q=dG(G 为基点)作其公钥,这样形成一个椭圆曲线公钥密码系统。在这个密码体制中,具体的曲线,基域 q F ,基点G 及其阶n ,以及每个用户的公钥都是该系统的公开参

高考数学-直线和椭圆(圆锥曲线)常考题型

高考数学 直线和圆锥曲线常考题型 运用的知识: 1、两条直线111222:,:l y k x b l y k x b =+=+垂直:则121k k =-;两条直线垂直,则直线所在的向量120v v =r r g 2、韦达定理:若一元二次方程2 0(0)ax bx c a ++=≠有两个不同的根12,x x ,则1212,b c x x x x a a +=-=。 3、中点坐标公式:1212,y 22 x x y y x ++= =,其中,x y 是点1122(,)(,)A x y B x y ,的中点坐标。 4、弦长公式:若点1122(,)(,)A x y B x y ,在直线(0)y kx b k =+≠上, 则1122y kx b y kx b =+=+,,这是同点纵横坐标变换,是两大坐标变换技巧之一, AB = 或者AB = 例题1、已知直线:1l y kx =+与椭圆22 : 14x y C m +=始终有交点,求m 的取值范围 解: 14m m ≤≠且。 例题2、过点T(-1,0)作直线l 与曲线N :2 y x =交于A 、B 两点,在x 轴上是否存在一点E(0x ,0),使得ABE ?是等边三角形,若存在,求出0x ;若不存在,请说明理由。 解:依题意知,直线的斜率存在,且不等于0。 设直线:(1)l y k x =+,0k ≠,11(,)A x y ,22(,)B x y 。 由2 (1)y k x y x =+?? =?消y 整理,得2222 (21)0k x k x k +-+= ① 由直线和抛物线交于两点,得 2242(21)4410k k k ?=--=-+> 即2 1 04 k << ② 由韦达定理,得:212221 ,k x x k -+=-121x x =。 则线段AB 的中点为22211 (,)22k k k -- 。 线段的垂直平分线方程为:2 21112()22k y x k k k --=--

直线、圆、椭圆的生成算法

计算机科学与技术学院 2012-2013学年第一学期《计算机图形学》实验报告 班级:100341C 学号:100341328 姓名:魏然 教师:惠康华 成绩:

实验项目:直线、圆、椭圆的生成算法 一、实验目的与要求 (1)了解Visual C++等编程环境中常用控件命令与绘图函数,初步掌握在实验设计集成环境(IDE)下进行图形处理程序的设计方法。 (2)熟练掌握直线的3种扫描转换算法:DDA算法,中点算法和Bresenham算法。 (3)掌握中点画圆算法、圆的Brensenham算法和椭圆的中点算法。 二、实验内容 (1)在Visual C++环境中设计MFC单文档程序,利用消息处理函数,搭建能运行图形算法程序的平台。(2)在平台中使用已有的点、线、圆等绘图函数,设计一个平面图形。Visual C++基本绘图函数可参考有关文献。 (3)根据教材中给定的算法,实现直线段的3种生成算法:DDA算法,中点法和Bresenham算法。(4)根据教材中给定的算法,实现圆与椭圆的生成算法。 三、重要算法分析 (一)、直线的生成 1、DDA算法 定义直线两端点和直线颜色:整型变量 x0=?, y0=?,x1=?,y1=?,c=颜色; 定义整型变量x,y,i;浮点数dx,dy,k; 根据数学算法得到斜率k, k=dy/dx,其中dx=(float)(x1-x0),dy=(float)(y1-y0); 定义x=x0;y=y0; 通过对x和y各增加一个小增量,计算下一步的x、y值。 当k的绝对值小于1的时候,标记一个像素点,像素点的坐标为(x,int(y+0.5),c),y=y+k,如果x=x i,则停止; 当k的绝对值大于或等于1的时候,标记一个像素点,像素点的坐标为(int(x+0.5),y,c),x=x+1/k,如果y=y i,则停止; 2、中点算法 定义直线两端点和直线颜色:整型变量 x0=?, y0=?,x1=?,y1=?,c=颜色; 定义浮点数:a,b,d1,d2,d,x,y;

快速判断直线与椭圆位置关系的方法

快速判断直线与椭圆位置关系的方法(原创) 四川省宜宾县第二中学 傅小力 在解决椭圆的选择、填空问题中需要快速判断与坐标轴不平行的直线0:=++C By Ax l 和椭圆)0(122 22 >>=+b a b y a x 的位置关系时,我建议我的学生: 第一步:找出直线与坐标轴的交点,判断是否在已知椭圆内部或在椭圆上, 否,则第二步:设椭圆上任一点P (θθsin ,cos b a ), C By Ax m ++=,则 C b B a A C Bb Aa m +++=++=)sin(sin cos 2222?θθθ, 其中R Bb Aa ∈=θ?,tan , 故],[22222222 b B a A C b B a A C m +++-∈。 结合线性规划的知识,结论如下: ① 若0>m 恒成立 即0>++C By Ax 恒成立,则椭圆上的点都在直线l 的同一侧,故直 线l 与椭圆相离;若0+- 的最大值或 b B a A C m b B a A C 即22222C b B a A +>时,直线与椭圆相离; ② 若0≥m 恒成立 即0≥++C By Ax 恒成立,则椭圆与直线l 有公共点,除公共点外, 其余的点都在直线l 的同一侧,故直线l 与椭圆相切;同理0≤m 恒成立 即 0≤++C By Ax 恒成立时。如图2。此时22222C b B a A +=,可用来求出切线方程。 ③ 若0022222222>++<+-b B a A C b B a A C 且 ,则椭圆上的点使 0>++C By Ax ,0=++C By Ax ,0<++C By Ax 三种情况都存在,故椭圆上的点有的在直线l 的两侧,有的在直线l 上,所以此时直线l 和椭圆相交。如图3。

直线与椭圆经典例题

【直线与椭圆】典例精讲 已知直线:1l y kx =+与椭圆2 2 :14y C x +=相交于两点,A B . (1)若AB 的中点的横坐标等于 14,求k 的值; (2)若AB 的中点在直线14x = 上,求k 的值; (3)若AB 的中点在直线12y = 上,求k 的值; (4)若AB 的中点的横坐标大于 15 ,求k 的取值范围;

(5)求AB 的中点横坐标的取值范围; (6)求A B x x 的取值范围; (7)若AB 的中点在圆2212 x y +=上,求k 的值; (8)若AB 的中点与短轴右顶点的连线斜率为1-,求k 的值;

(9)若0OA OB =,求k 的值; (10)设点(2,0)N ,若0NA NB =,求k 的值; (11)设点(2,0)N ,若ABN 为直角三角形,是否与(13)同解,为什么?

(12)设1(,0)2 P ,若PA PB =,求k 的值; (13)设过AB 的中点且与l 垂直的直线为m ,求直线m 与x 轴交点横坐标的取值范围; (14)设直线l 与y 轴交于点M ,若2AM MB =,求k 的值;

(15)若AB 求k的值; (16)求OAB面积的最大值及此时k的值;

1. 如图,,A B 是椭圆2 2:13 x W y +=的两个顶点,过点A 的直线与椭圆W 交于另一点C . (Ⅰ)当AC 的斜率为3 1时,求线段AC 的长; (Ⅱ)设D 是AC 的中点,且以AB 为直径的圆恰过点D . 求直线AC 的斜率. 2. 已知直线:l y x n =+与椭圆:G 22(3)(3)m x my m m -+=-交于两点,B C . (Ⅰ)若椭圆G 的焦点在y 轴上,求m 的取值范围; (Ⅱ)若(0,1)A 在椭圆上,且以BC 为直径的圆过点A ,求直线l 的方程. 3. 已知椭圆)0(12222>>=+b a b y a x 的长轴长为22,离心率22=e ,过右焦点F 的直线l 交椭圆于P ,Q 两点。(Ⅰ)求椭圆的方程;(Ⅱ)当直线l 的斜率为1时,求△POQ 的面积;(Ⅲ)若以OP ,OQ 为邻边的平行四边形是矩形,求满足该条件的直线l 的方程。 x y O A B C D

openGL画直线、圆、椭圆

使用openGl画直线(DDA算法)、画圆、椭圆(Bresenham算法) #include #include #include /* initialization: */ void myinit(void) { /* attributes */ glClearColor(1.0, 1.0, 1.0, 0.0); /* white background */ glColor3f(1.0, 0.0, 0.0); /* draw in red */ /* set up viewing: */ /* 500 x 500 window with origin lower left */ glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0, 500.0, 0.0, 500.0); glMatrixMode(GL_MODELVIEW); } void plot_circle_points(int xc,int yc,int x,int y)//画圆 { glBegin(GL_POINTS); glV ertex3f(xc+x,yc+y,0); glV ertex3f(xc-x,yc+y,0); glV ertex3f(xc+x,yc-y,0); glV ertex3f(xc-x,yc-y,0); glV ertex3f(xc+y,yc+x,0); glV ertex3f(xc-y,yc+x,0); glV ertex3f(xc+y,yc-x,0); glV ertex3f(xc-y,yc-x,0); glEnd(); } void drawcircle(int xc,int yc,int radius) { int x,y,p; x=0; y=radius; p=3-2*radius; glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_POINTS);

解析几何(直线与圆、椭圆、双曲线和抛物线)

2012届数学二轮复习专题十 考试范围:解析几何(直线与圆、椭圆、双曲线和抛物线) 一、选择题(本大题共10小题;每小题5分,共50分.在每小题给出的四个选项中,只有一项是符合题目要求的) 1.直线07 tan =+y x π 的倾斜角是 ( ) A .7 π - B . 7π C .75π D .7 6π 2.直线01:1=+-y x l 关于直线2:=x l 对称的直线2l 方程为 ( ) A .012=--y x B .072=-+y x C .042=--y x D .05=-+y x 3.“2-=a ”是直线()021:1=-++y x a l 与直线()0122:2=+++y a ax l 互相垂直的 ( ) A .充分不必要条件 B .必要不充分条件 C .充要条件 D .既不充分也不必要条件 4.直线0=+++b a by ax 与圆222=+y x 的位置关系为 ( ) A .相交 B .相切 C .相离 D .相交或相切 5.已知点P 在圆074422=+--+y x y x 上,点Q 在直线上kx y =上,若PQ 的最小值为122-,则k = ( ) A .1 B .1- C .0 D .2 6.若椭圆122=+my x 的离心率??? ? ??∈22, 33e ,则m 的取值范围是 ( ) A .?? ? ??32,21 B .()2,1 C .()2,132,21 ?? ? ?? D .??? ??2,21 7.已知中心在原点,焦点在坐标轴上的双曲线的一条渐近线方程为03=-y x ,则该双曲线的离心率为 ( ) A . 3 3 2 B . 3 C .2或3 3 2 D . 3 3 2或3 8.M 是抛物线x y 42 =上一点,且在x 轴上方,F 是抛物线的焦点,以x 轴的正半轴为始边,FM 为终边构成的最 小的角为60°,则=FM ( ) A .2 B .3 C .4 D .6 9.设抛物线x y 82 =的准线经过中心在原点,焦点在坐标轴上且离心率为 2 1 的椭圆的一个顶点,则此椭圆的方程为 ( ) A .1161222=+y x 或112 1622=+y x B .1644822=+y x 或1486422=+y x C .112 162 2=+y x 或 143 1622=+x y D .13 422=+y x 或143 1622=+x y 10.已知定点()0,21-F 、()0,22F ,动点N 满足1=ON (O 为坐标原点),NM M F 21=,()R MF MP ∈=λλ2,01=?PN M F , 则点P 的轨迹是 ( ) A .椭圆 B .双曲线 C .抛物线 D .圆 二、填空题(本大题共5小题;每小题5分,共25分.将答案填在题中的横线上) 11.以点()2,1-为圆心且与直线1-=x y 相切的圆的标准方程是 . 12.圆06442 2=++-+y x y x 上到直线05=--y x 的距离等于 2 2 的点有 个. 13.若点P 在直线03:1=++my x l 上,过点P 的直线2l 与曲线()165:2 2=+-y x C 只有一个公共点M ,且PM 的最小值为4,则=m .

直线生成算法的实现

实验二:直线生成算法 班级 13软件+道铁1班学号 20132110050115姓名丁益 1.实验目的 a)通过实验,进一步理解直线段扫描转换的DDA算法、中点画线自算法 及bresenham算法的基本原理,掌握以上算法生成直线段的基本过程。 b)通过编程,掌握在C/C++环境下完成用DDA算法、中点画线算法及 bresenham算法对任意直线段的扫描转换,以及在C/C++环境下完成用中 点画圆及椭圆的绘制方法。 2.实验内容 c)阅读《openGL三维程序设计》(电子书)第二部分第四章,掌握OpenGL 基本建模方法,并调试其中程序。 d)参考教材第6章,编程实现整数DDA算法、中点画线法和Bresenham 画线法,绘制直线(直线宽度和线型可自定)。 2.1 DDA直线生成 2.1.1算法原理 已知过端点P0(x0,y0),P1(x1,y1)的直线段L(P0,P1),斜率为k=(y1-y0)/(x1-x0),画线过程从x的左端点x0开始,向x右端点步进,步长为1个像素,计算相应的y坐标为y=kx+B。计算y i+1 = kx i+B =kx i +B+kx =y i +kx 当x=1,y i+1=y i+k,即当x每递增1,y递增k。由计算过程可知,y与k可能为浮点数,需要取y整数,源程序中round(y)=(int)(y+0.5)表示y四舍五入所得的整数值。 2.1.2 算法流程

2.1.3 算法实现关键代码 #include #include void Init() { glClearColor(1.0,1.0,1.0,0.0); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0,200.0,0.0,150.0); } void lineDDA(int x0,int y0,int xEnd,int yEnd) { int dx=xEnd-x0,dy=yEnd-y0,steps,k; float xIncrement, yIncrement, x=x0, y=y0; if(fabs(dx)>fabs(dy)) steps=fabs(dx); else steps=fabs(dy); xIncrement=float(dx)/float(steps); yIncrement=float(dy)/float(steps); for(k=0;k

第八讲:直线、圆、椭圆(学生)

1、圆x2y2 第十三讲:直线、圆、椭圆 ,此4上的一动点A到直线4x 3y12 0的最小距离为 时点A的坐标为。 2、已知直线3x 2y 30 与6x my 10互相平行,则它们之间的距离 为_____________ 。 3、直线y x 1与直线y /3x 5的夹角大小为_______________________________ 。 为__________________________ 。 5、直线7x 3y 21 0上到两坐标轴距离相等的点的个数为_______________________ 。 所在的直线方程为__________________________ 。 7、在ABC中,已知A(1,3), B( 2, 3),BAC的平分线的方程为y 3x,则AC所在 的直线方程为______________________________ 。 8、曲线3 |x| 1 (y 1)2与直线y kx 1有四个公共点,则k的取值范围 9、已知集合M {(x,y)|x2 y24}与N {(x,y)|(x 1)2 (y 1)2 r2, r 0}满足 M I N N,则r的取值范围是____________________________ 。 10、已知直线|的方程为x y 9 0,椭圆C的方程为x2 4y212,以椭圆C的焦点为焦点作椭圆,使其与I有公共点,求椭圆的长轴最小的椭圆方程。 11、如图所示,已知ABC的三个顶点在椭圆 2 2 —出1上,点A是短轴上的顶点,且三角形

20 16 的重心在右焦点上,求BC所在的直线方程。

12、椭圆ax2 by2 1与直线x y 1 0相交于A、B两点,C是AB的中点,若 | AB | 2 2 , O为坐标原点,OC的斜率为求a,b的值和椭圆方程。 x2 13、已知椭圆方程为— 16 2 y 25 1,过原点且倾斜 角为和(0 )的两条直线分别交椭 2

椭圆生成算法的研究

计算机图形学课程设计 题目名称: 椭圆生成算法的研究 2012 年 1 月

椭圆生成算法的研究 摘要 作为计算机图形学中基本几何元素之一的椭圆,其生成算法在几乎所有计算机图形学相关领域都要用到,尤其在计算机辅助设计中经常涉及。因此,研究椭圆生成对计算机图形系统十分重要。目前,已有大量的文献讨论了如何高效生成误差小的椭圆。文献一中方法之一在扫描转换的同时复制椭圆宽度数个像素,这种方法比较简单,但造成椭圆切线斜率接近-1处显得很细。文献一中方法之二扫描转换两个同心的椭圆,内椭圆的两个半径分别为a-w/2,b-w/2 ;外椭圆的两个半径为a +w/2 ,b + w/2;然后填充它们间的间隙,在微分几何中有一个结论:沿着垂直椭圆弧的方向,将此椭圆上的点移动w/2的距离所形成的曲线与原椭圆同心的椭圆,而是由一个8次方程所描述的曲线,因此这种算法也有较大误差,特别是a 的值接近于w时。然而,对这样8次函数进行扫描转换,计算量非常大。圆弧绘制生成宽椭圆算法与椭圆中点扫描转换算法复杂度相当,且生成的椭圆效果较好,视觉感受不到明显缺陷。 本文主要对计算机图形学、椭圆的生成算法的具体实现及其应用进行综述,并简要讨论。 关键词:计算机图形学椭圆生成算法并行生成算法宽椭圆

1 一种宽椭圆生成算法 计算机辅助设计领域常涉及宽椭圆生成,宽椭圆生成算法的优劣直接影响 设计效果。为了生成一个圆心在原点的标准宽椭圆,每次用单像素宽的椭圆中点扫描转换算法,得到一个单像素宽椭圆上的一个点,填充一个以该点为中心,椭圆宽为直径的圆弧,扫描转换结束后,生成一个无明显视觉缺陷的第一象限12宽椭圆。 作为计算机图形学中基本几何元素之一的椭圆,其生成算法在几乎所有计算机图形学相关领域都要用到,尤其在计算机辅助设计中经常涉及。因此,研究椭圆生成对计算机图形系统十分重要。目前,已有大量的文献讨论了如何高效生 成误差小的椭圆。椭圆的扫描转换法[1]就是其中之一,该算法基于Da Silva 的算法[2],运用二阶偏差分Pitteway[3],Van Aken[4]、KAppel[5]等所用的一些技术,该算法生成的椭圆都是单像素宽的,而现实中更多时候要生成宽椭圆,宽椭圆一般定义为沿着垂直两半径为a 、b 的椭圆弧的两方向,将此椭圆上的点移动2w 的距离所形成的两条曲线中间部分,为了生成宽椭圆,文献一中方法之一在扫描转换的同时复制椭圆宽度数个像素,这种方法比较简单,但造成椭圆切线斜率接近-1 处显得很细。文献一中方法之二扫描转换两个同心的椭圆,内椭圆的两个半径分别为2a ? w ,2b ? w ;外椭圆的两个半径为2a + w ,2b + w ;然后填充它们间的间隙,在微分何中有一个结论:沿着垂直椭圆弧的方向,将此椭圆上的点移动2w 的距离所形成的曲线与原椭圆同心的椭圆,而是由一个8 次方程所描述的曲线[6],因此这种算法也有较大误差,特别是a 的值接近于w 时。然而,对这样8 次函数进行扫描转换,计算量非常大。圆弧绘制生成宽椭圆算法与椭圆中点扫描转换算法复杂度相当,且生成的椭圆效果较好,视觉感受不到明显缺陷。 1.1 算法基本思想 主要考虑中心在原点的标准椭圆12222=+b y a x ,宽度w ,(a >b >w ,a ,b ,w ∈z );对于中心不在坐标原点的椭圆,可先作相应的平移变换,变换为中心在原点的椭圆,把所得的像素坐标加上一个位移即可得到所求的像素坐标。此外,只讨论椭圆在第一象限内的生成算法,其他象限内的点利用椭圆的四分对称性即可得到。在第一象限内的四分之一椭圆分为两个区域来处理.两个区域之间以斜率为-1 的点(即法向量两个分量相等的点)作为分界。对于区域I ,以点(0,b )为始点,x 方向单位长作为步长。向右生成曲线。假设当前扫描计算得到的点为批p 0(x ,y ),扫描转换的下一个点p 1 可能为s 1=(x+1,y )或s 2=(x +1,y -1), 判断s 1、s 2 的中间点)2 1,21(--y x m 在椭圆的内还是外,选择下一个扫描点。 如果中点m 在内(m 点代入椭圆方程值小于1),则下一个点p 1 为(x +1, y ),否则为(x +1, y -1);当斜率变为小于-l 时,转向区域Ⅱ,此时以(a ,0)为始点。y 方向作为单位步长,向左生成曲线。假设当前扫描计算得到的点为p 0′(x ,

直线与圆锥曲线位置关系(椭圆为例)

直线与圆锥曲线位置关系(椭圆为例) 【复习要点】直线与圆锥曲线问题常用知识点 1、两条直线111222:,:l y k x b l y k x b =+=+ 垂直:则12 1k k =-; 直线所在的向量1 20v v = 平行:斜率相等,截距不等。 2、韦达定理:若一元二次方程2 0(0)ax bx c a ++=≠有两个不同的根12,x x , 则1212,b c x x x x a a +=- =。 3、中点坐标公式: 点1122(,)(,)A x y B x y ,的中点坐标M (x,y )其中(1212 ,y 22 x x y y x ++==,)。 4、弦长公式: 若点1122(,)(,)A x y B x y ,在直线(0)y kx b k =+≠上, 则1 122y kx b y kx b =+=+,,这是同点纵横坐标变换,是两大坐标变换技巧之一, 222222 1212121212()()()()(1)()AB x x y y x x kx kx k x x =-+-=-+-=+-221212(1)[()4]k x x x x =++- 或者 2222212121212122111()()()()(1)()AB x x y y x x y y y y k k k =-+-=-+-=+-2121221 (1)[()4]y y y y k =++-。 【题型解析】直线和椭圆(圆锥曲线)常考题型 题型一:数形结合确定直线和圆锥曲线的位置关系 例题1、已知直线:1l y kx =+与椭圆22 : 14x y C m +=始终有交点,求m 的取值范围 解:数形结合,直线恒过(0,1)点,即此点在椭圆内即可。 14m m ≤≠且。 题型二:弦的垂直平分线问题 例题2、过点T(-1,0)作直线l 与曲线N :2 y x =交于A 、B 两点,在x 轴上是否存在一点E(0x ,0), 使得ABE ?是等边三角形,若存在,求出0x ;若不存在,请说明理由。

高中平面解析几何知识点总结(直线、圆、椭圆、曲线)

高中平面解析几何知识点总结 一.直线部分 1.直线的倾斜角与斜率: (1)直线的倾斜角:在平面直角坐标系中,对于一条与x 轴相交的直线,如果把x 轴绕着交点按逆时针方向旋转到和直线重合时所转的最小正角记为α叫做直线的倾斜角. 倾斜角)180,0[?∈α,?=90α斜率不存在. (2)直线的斜率: αtan ),(21121 2=≠--= k x x x x y y k .两点坐标为111(,)P x y 、222(,)P x y . 2.直线方程的五种形式: (1)点斜式:)(11x x k y y -=- (直线l 过点),(111y x P ,且斜率为k ). 注:当直线斜率不存在时,不能用点斜式表示,此时方程为0x x =. (2)斜截式:b kx y += (b 为直线l 在y 轴上的截距). (3)两点式:121121x x x x y y y y --= -- (12y y ≠,12x x ≠). 注:① 不能表示与x 轴和y 轴垂直的直线; ② 方程形式为:0))(())((112112=-----x x y y y y x x 时,方程可以表示任意直线. (4)截距式:1 =+b y a x (b a ,分别为x 轴y 轴上的截距,且0,0≠≠b a ). 注:不能表示与x 轴垂直的直线,也不能表示与y 轴垂直的直线,特别是不能表示过原点的直线. (5)一般式:0=++C By Ax (其中A 、B 不同时为0). 一般式化为斜截式: B C x B A y - - =,即,直线的斜率: B A k -=. 注:(1)已知直线纵截距b ,常设其方程为y kx b =+或0x =. 已知直线横截距0x ,常设其方程为0x my x =+(直线斜率k 存在时,m 为k 的倒数)或0y =. 已知直线过点00(,)x y ,常设其方程为00()y k x x y =-+或0x x =. (2)解析几何中研究两条直线位置关系时,两条直线有可能重合;立体几何中两条直 线一般不重合.

高中平面解析几何知识点总结直线圆椭圆曲线.docx

高 中 平 面 解 析 几 何 知 识 点 总 结 一. 直线部分 1.直线的倾斜角与斜率: (1)直线的倾斜角:在平面直角坐标系中,对于一条与 x 轴相交的直线,如果把 x 轴 绕着交点按逆时针方向旋转到和直线重合时所转的最小正角记为 叫做直线的倾斜角 . 倾斜角[0,180 ) , 90 斜率不存在 . k y 2 y 1 ( x 1 x 2 ), k tan (2)直线的斜率: x 2 x 1 .两点坐标为 P 1 ( x 1 , y 1 ) 、 P 2 (x 2 , y 2 ) . 2.直线方程的五种形式: (1)点斜式: y y 1 k (x x 1 ) ( 直线 l 过点 P 1 ( x 1 , y 1 ) ,且斜率为 k ) . 注:当直线斜率不存在时,不能用点斜式表示,此时方程为 x x 0 . (2)斜截式: y kx b (b 为直线 l 在 y 轴上的截距 ). y y 1 x x 1 (3)两点式: y 2 y 1 x 2 x 1 ( y 1 y 2 , x 1 x 2 ). 注:① 不能表示与 x 轴和 y 轴垂直的直线; ② 方程形式为: (x 2x 1 )( y y 1 ) ( y 2 y 1 )( x x 1 ) 时,方程可以表示任意 直线. x y (4)截距式: a b 注:不能表示与过原点的直线. 1 ( a, b 分别为 x 轴 y 轴上的截距,且 a 0, b 0 ). x 轴垂直的直线,也不能表示与 y 轴垂直的直线,特别是不能表示 (5)一般式: Ax By C ( 其中 A 、 B 不同时为 0) . y A x C k A 一般式化为斜截式: B B ,即,直线的斜率: B . 注:( 1)已知直线纵截距 b ,常设其方程为 y kx b 或 x 0 . 已知直线横截距 x 0 ,常设其方程为 x my x 0 ( 直线斜率 k 存在时, m 为 k 的倒数 ) 或 y 0 . 已知直线过点 ( x 0 , y 0 ) ,常设其方程为 y k( x x 0 ) y 0 或 x x 0 . ( 2)解析几何中研究两条直线位置关系时,两条直线有可能重合;立体几何 中两条直线一般不重合. 3.直线在坐标轴上的截矩可正,可负,也可为0. (1)直线在两坐标轴上的截距相等 直线的斜率为 1或直线过原点. (2)直线两截距互为相反数 直线的斜率为 1 或直线过原点. (3)直线两截距绝对值相等 直线的斜率为 1或直线过原点. 4.两条直线的平行和垂直: (1)若 l 1 : y k 1 x b 1 , l 2 : y k 2 x b 2 ,有

计算机图形学--Bresenham完整算法-画直线、椭圆和圆

计算机图形学--Bresenham完整算法-画直线、椭圆和圆

#include #include #include"stdio.h" int m_PointNumber = 0; //动画时绘制点的数目 int m_DrawMode = 1; //绘制模式 1 DDA算法画直线 // 2 中点Bresenham算法画直线 // 3 改进Bresenham算法画直线 // 4 八分法绘制圆 // 5 四分法绘制椭圆 //绘制坐标线 void DrawCordinateLine(void) { int i = -250 ; //坐标线为黑色 glColor3f(0.0f, 0.0f ,0.0f); glBegin(GL_LINES); for (i=-250;i<=250;i=i+10) { glVertex2f((float)(i), -250.0f); glVertex2f((float)(i), 250.0f); glVertex2f(-250.0f, (float)(i)); glVertex2f(250.0f, (float)(i)); } glEnd(); } //绘制一个点,这里用一个正方形表示一个点 void putpixel(GLsizei x, GLsizei y) { glRectf(10*x,10*y,10*x+10,10*y+10); } /////////////////////////////////////////////////////////////////// //DDA画线算法 // // // // // // // /////////////////////////////////////////////////////////////////// void DDACreateLine(GLsizei x0, GLsizei y0, GLsizei x1, GLsizei y1, GLsizei num) { //设置颜色 glColor3f(1.0f,0.0f,0.0f); //对画线动画进行控制 if(num == 1) printf("DDA画线算法:各点坐标\n"); else if(num==0) return; //画线算法的实现

直线,圆与椭圆的标准方程

高二上学期数学培优练习(一) 1.经过点M (1,3)的圆x 2+y 2=1的切线方程是________________ 2.由曲线422=+=y x x y 与所围成的图形的最小面积是 3.过点(-3,2)且与椭圆x 29+y 2 4 =1有相同焦点的椭圆的标准方程是________. 4.椭圆x 2-m +y 2 -n =1(m

10.已知定点)0,2(A ,P 点在圆12 2=+y x 上运动,AOP ∠的平分线交PA 于Q 点,其中O 为坐标原 点,求Q 点的轨迹方程. 11. 已知圆C :(x -3)2+y 2=100及点A (-3,0),P 是圆C 上任意一点,线段P A 的垂直平分线l 与PC 相交于点Q ,求点Q 的轨迹方程. 12. 已知圆2 2 :(1)5C x y +-=,直线:10l mx y m -+-=。(Ⅰ)求证:对m R ∈,直线l 与圆C 总有两个不同交点;(Ⅱ)设l 与圆C 交与不同两点A 、B ,求弦AB 的中点M 的轨迹方程; (Ⅲ)若定点P (1,1)分弦AB 为1 2 AP PB =,求此时直线l 的方程。 13. 已知圆a MN x a a A C 2)0)(,0(的长为轴上截得的弦,且在过定点> (1)求圆C 的圆心的轨迹方程 (2)设的方程的最大值及此时圆求C m n n m n AN m AM +==,,

圆、椭圆的生成算法

实验报告 学院:计算机科学与信息学院专业:计算机科学与技术班级:07软件2 姓名学号实验组实验时间2010-4-2 指导教师成绩 实验项目名称圆、椭圆的生成算法 实 验目的 通过本实验,使学生了解并掌握在光栅显示系统中园的生成和显示算法和椭圆的生成和显示算法。 实验要求1.实现在光栅显示系统中园的生成和显示算法和栅显示系统中椭圆的生成和显示算法,进一步熟悉相关开发平台。 2.掌握圆的几种算法(中点算法,二次差分算法以及Bresenham算法),并理解各种算法的优劣。 实验原理圆的中点算法算法原理: 画出第二个八分园(45°-90°),利用 八对称性画出其它八分园。 1.用中点算法画第二个八分园。 从当前已获得的象素递推出下一个象 素。 园弧的隐函数的形式为 F(x,y)=x2+y2-R2=0 则园弧的正负划分性为:F(x,y)>0,(x,y)在园 外;F(x,y)<0,(x,y)在园内; F(x,y)=0,(x,y)在园上。 设(xi,yi)为已确定的象素坐标,则下一个象素 只能是正右方的E点或右下方的SE点。设M是E 和SE的中点,则M=(xi+1,yi-0.5): F(x,y)>0 F(x,y)<0 F(x,y)=0 xi,yi M E SE

如F(M)<0,则M 在园内,说明E 距离圆弧更近,下一点取正右方E 点; 如F(M)>0,则M 在园外,说明SE 距离圆弧更近,下一点取右下方SE 点; 如F(M)=0,则M 在园上,下一点取E 点或SE 点。 构造判别式:d=F(M)=F(xi+1,yi-0.5)=(xi+1)2+(yi-0.5)2-R2 椭圆的中点算法原理: 中点算法可以推广到一般二次曲线如椭圆。 中心在原点的椭圆方程为: 隐函数的形式为: a=b 时,该方程表示的是圆。 椭圆具有四对称性,可只考虑第一象限的椭圆弧。 椭圆上任一点(x,y)处的法向量为: 如在p 点法线两分量相等,则p 点将椭圆第一象限分成两部份,上半部份法向量在y 方向的分量比x 方向的大,在下半部份相反。在p 点: 在当前中点处,法向量(2b2 (Xp+1),2a2 (Yp-0.5))的y 分量比x 分量大,即: b2 (Xp+1) < a2 (Yp-0.5) 而在下一中点,不等式改变方向,则说明椭圆弧从上部分转入下部分。 与圆弧中点算法类似:确定一个象素Pi 后,接着在下两个候选象素的中点计算一个判别 222 2 1 x y a b + =y x b a ()22222 ,()0 F x y b x a y ab =+-=22(,)22x y F F N x y i j f i f j b xi a y j x y ??=+=+=+?? 2 2 x y f f or b x a y ==x y p(x,y) N 上 下 B M T P i (x i,y i )

相关文档
最新文档