导航:首页 > 源码编译 > 程序实现中点画圆算法

程序实现中点画圆算法

发布时间:2024-01-07 23:12:06

㈠ 怎样用利用Turbo C实现圆生成的中点画圆算法

#include <glut.h>
#include <math.h>
#include <stdlib.h>
#include <gl/GL.h>
#include <gl/GLU.h>
#include <gl/glaux.h>
#include <Windows.h>

#pragma comment(lib,"glaux.lib")
#pragma comment(lib,"glu32.lib")
#pragma comment(lib,"glut32.lib")
#pragma comment(lib,"opengl32.lib")

class scrpt
{
public:
GLint x,y;
};

void myinit(void);
void display(void);
void setPixel(GLint x,GLint y);
void circlePlotPoint(scrpt circCtr,scrpt circpt);
void circleMidpoint(scrpt circCtr,GLint radius);

void setPixel(GLint x,GLint y)
{
glBegin(GL_POINTS);
glVertex2i(x,y);
glEnd();
}

void myinit(void)
{
glClearColor(0.0,0.0,0.0,0.0);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0,800.0,0.0,600.0);
}

void circleMidpoint(scrpt circCtr,GLint radius)
{
scrpt circpt;
GLint p=1-radius;
circpt.x=0;
circpt.y=radius;
void circlePlotPoints(scrpt,scrpt);
circlePlotPoints(circCtr,circpt);
while(circpt.x<circpt.y)
{
circpt.x++;
if(p<0)
p+=2*circpt.x+1;
else
{
circpt.y--;
p+=2*(circpt.x-circpt.y)+1;
}
circlePlotPoints(circCtr,circpt);
}
}

void circlePlotPoints(scrpt circCtr,scrpt circpt)
{
setPixel(circCtr.x+circpt.x,circCtr.y+circpt.y);
setPixel(circCtr.x-circpt.x,circCtr.y-circpt.y);
setPixel(circCtr.x+circpt.x,circCtr.y-circpt.y);
setPixel(circCtr.x-circpt.x,circCtr.y+circpt.y);
setPixel(circCtr.x+circpt.y,circCtr.y+circpt.x);
setPixel(circCtr.x+circpt.y,circCtr.y-circpt.x);
setPixel(circCtr.x-circpt.y,circCtr.y+circpt.x);
setPixel(circCtr.x-circpt.y,circCtr.y-circpt.x);
}
void display(void)
{ scrpt point;
point.x=200;
point.y=210;
int radius=20;
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.5,0.6,1.0);
circleMidpoint(point,radius);
glFlush();
}
void main(int argc,char **argv)
{

glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowPosition(100,100);
glutInitWindowSize(400,400);
glutCreateWindow("pointcircle");
myinit();
glutDisplayFunc(display);
glutMainLoop();
}

㈡ C语言用Bresenham算法画圆,哪位高手教教,主要是算法里的内容,谢谢!

的确哈,关键在于对delta的理解
可以看到,都是delta=2*(1-radius)这样的,起作用应该是判断要画的点x、y坐标的变化趋势,先把我注释了的代码贴下,加了getch();可以看到画的过程
-----------------------------------------------------------------
#include<graphics.h>
#include<stdio.h>

void BresenhemCircle(int centerx, int centery, int radius, int color, int type);

void main()
{
int drive=DETECT,mode;
int i,j;
initgraph(&drive,&mode,"");
BresenhemCircle(300,200,100,15,0);
getch();
}

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)
{
getch();
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);
getch();
}
else/*不执行*/
{
line(centerx+x, centery+y, centerx+x, centery-y);
line(centerx-x, centery+y, centerx-x, centery-y);
getch();
}
/*以下代码设置下次四点的位置,圆是对称的,且此方法相当于同时画四个圆弧
观察右上方圆弧可知,前一半是x增的要快些,后一半是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 = 3; /*选择纵向减*/
else
direction = 2;
}
else
direction=2;

switch(direction)
{
case 1:
x++;/*只横坐标远离原点*/
delta += (2*x+1); /*小执行到这,所以加*/
break;
case 2:
x++;
y--;/*横向远离,同时纵向靠近*/
delta += 2*(x-y+1); /*即(2*x+1)+(-2*y+1)*/
break;
case 3:
y--;/*只纵坐标靠近原点*/
delta += (-2*y+1); /*大执行到这,所以减*/
break;
}
}
}

python中点圆画法

1、我们的电脑上要安装有Python,我们找到安装的Python并打开。
2、在打开的Python窗口中执行文件菜单的新建命令,新建一个idle的文件项目。
3、在新建的idle项目中输入下面代码:importturtle、turtle.color("blue")turtle.circle(100)绘制出第一个大圆出来。
4、下面执行第一个带蔽大圆的填充命令,执行下面代码:importturtle、裤行配turtle.color("blue")、turtle.begin_fill()、turtle.circle(100)、turtle.end_fill()、通过turtle.begin_fill()与turtle.endfill()。
5、下面来画第二个小圆,需要先跳转画笔,并更改画笔颜色,画出第胡指二个小圆。跳转画笔使用goto命令。
6、最后画中间的小圆操作和大圆一样,执行填充命令即可。这样一个圆中圆的效果就完成了。

㈣ 用C实现Bresenham算法生成直线和圆的程序(要求具体步骤有必要解述)

Bresenham算法生成直线
假定直线从(x1,y1)到(x2,y2),
令dx=x2-x1,dy=y2-y1
不妨设(dx,dy)在第一象限,并且直线的斜率不大于1

画线过程中有三个循环变量
x,y,d
初值
x=x1,y=y1,d=2*dy-dx

循环,直到x==x2为止
{
如果d>=0,y++,d+=2*(dy-dx)
如果d<0 ,x++,d+=2*dy
}

如果(dx,dy)不在第一象限,要做变换,即先把第一象限的画出来
如果斜率大于1,x,y交换

非常简单的,很容易实现
圆的算法:

int Bres(int x0,int y0,double r,int color)

{
int x,y,d;
x=0;
y=(int)r;
d=(int)(3-2*r);
while(x<y)
{
cirpot(x0,y0,x,y,color);
if(d<0)
d+=4*x+6;
else
{
d+=4*(x-y)+10;
y--;
}
x++;
}
if(x==y)
cirpot(x0,y0,x,y,color);
return(0);
}
int cirpot(int x0,int y0,int x,int y,int color)
{
setcolor(color);
putxicl((x0+x),(y0+y));
putxicl((x0+y),(y0+x));
putxicl((x0+y),(y0-x));
putxicl((x0+x),(y0-y));
putxicl((x0-x),(y0-y));
putxicl((x0-y),(y0-x));
putxicl((x0-y),(y0+x));
putxicl((x0-x),(y0+y));
setcolor(color);
return(0);
}

这是圆的算法,你若要整个程序,把你的电邮给我,我给你发过去、
运行环境是Turboc 2.0
int Bresline(int x1,inty1,int x2,int y2,int color)
{
int color,itag;
int dx,dy,tx,ty,inc1,inc2,d,curx,cury;
setcolor(color);
putxicl(x1,y1);
if(x1==x2&&y1==y2)
{
setcolor(color);
return(1);
}
itag=0;
dx=abs(x2-x1);
dy=abs(y2-y1);
if(dx<dy)
{
itag=1;]
iswap(&x1,&y1);
iswap(&x2,&y2);
iswap(&dx,&dy);
}
tx=(x2-x1)>0? 1:-1;
ty=(y2-y1)>0? 1:-1;
curx=x1;
cury=y1;
inc1=2*dy;
inc2=2*(dy-dx);
d=inc1-dx;
while(curx!x2)
{
if(d<0)
{
d+=inc1;
}
else
{
cury+=ty;
d+=inc2;
}
if(itag)
setpixel(cury,curx);
else
setpixel(curx,cury);
curxd+=tx;
}
setcolor(color);
return(0);
}
iswap(int*a,int*b)
{
int tmp;
tmp=*a;
*a=*b;
*b=tmp;
}

这是直线的算法:和圆的差不多,你可以参考一下:)

阅读全文

与程序实现中点画圆算法相关的资料

热点内容
性用社app怎么样转成什么了 浏览:521
app平板怎么用 浏览:641
android条形码zbar 浏览:380
深入dos编程书值得看嘛 浏览:250
薯仔app下载了怎么注册 浏览:843
云服务器一般租多大 浏览:469
屏幕录制app怎么样 浏览:686
义乌市联DNS服务器地址 浏览:669
App二级页面怎么做 浏览:956
提高pdf清晰度 浏览:979
服务器网卡mac地址怎么查 浏览:114
裁决之地服务器为什么这么卡 浏览:597
民生app怎么查保险 浏览:467
单片机蓝牙驱动代码 浏览:467
php实现多选后公开 浏览:645
map中的值为数组的怎么编程 浏览:261
加密货币怎么登录 浏览:1002
如何看本机服务器实例名 浏览:388
变频器加密密码 浏览:796
美国银行加密市场 浏览:384