河北省招标集团刘新民:直线 和 圆 的程序

来源:百度文库 编辑:神马品牌网 时间:2024/05/10 15:27:22
谁能 帮我编写 直线和 圆的程序?? (语言不限)
请注名 语言类型 (c,c++,vb....)

void line (x1, y1, x2, y2, c)

int x1, y1, x2, y2, c;

{

int dx;

int dy;

int x;

int y;

int p;

int const1;

int const2;

int inc;

int tmp;

dx=x2-x1;

dy=y2-y1;

if (dx*dy>=0) /*准备x或y的单位递变值。*/

inc=1;

else

inc=-1;

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

if(dx<0){

tmp=x1; /*将2a, 3a象限方向*/

x1=x2; /*的直线变换到1a, 4a*/

x2=tmp;

tmp=y1; /*象限方向去*/

y1=y2;

dx=-dy;

dy=-dy;

}

p=2*dy-dx;

const1=2*dy; /*注意此时误差的*/

const2=2*(dy-dy); /*变化参数取值. */

x=x1;

y=y1;

set_pixel(x, y, c);

while (x<x2){

x++;

if (p<0)

p+=const1;

else{

y+=inc;

p+=const2;

}

set_piexl(x, y, c);

}

}

else {

if (dy<0){

tmp=x1; /* 将3b, 4b象限方向的*/

x1=x2; /*直线变换到2b, 1b */

x2=tmp; /*象限方向去. */

tmp=y1;

y1=y2;

dx=-dy;

dy=-dy;

}

p=2*dx-dy; /*注意此时误差的*/

const1=2*dx; /*变化参数取值. */

const2=2*(dx-dy);

x=x1;

y=y1;

set_pixel (x, y, c);

while (y<y2){

y++;

if(p<0)

p+=const1;

else{

x+=inc;

p+=const2;

set_pixel (x, y, c);

}

}

}

直线的brenshenham算法。

circle (xc, yc, radius, c)

int xc, yc, radius, c;

{

int x, y, p;

x=0;

y=radius;

p=3-2*radius;

while (x<y){

plot_circle_points(xc, yc, x, y, c);

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, c);

}

plot_circle_points(xc, yc, x, y, c)

int xc, yc, x, y, c;

{

set_pixel(xc+x, yc+y, c);

set_pixel(xc+x, yc+y, c);

set_pixel(xc+x, yc-y, c);

set_pixel(xc-x, yc-y, c);

set_pixel(xc+y, yc+x, c);

set_pixel(xc-y, yc+x, c);

set_pixel(xc+y, yc-x, c);

set_pixel(xc-y, yc-x, c);

}

程序 Bresenham的圆生成算法

请参看下面的画圆的程序:
#include <math.h>
#include <graphics.h>
main()
{ double rad,te,ts,tsl,tel,deg,dte,ta,ct,st;
int x0,y0,x,y,n,r,i,gd,gm;
rad=0.0174533;/*1度的tg值*/
printf("Input roud(x0,y0):");
scanf("%d,%d",&x0,&y0);/*输入圆心值(x0,y0)*/
printf("input roud(r):");
scanf("%d",&r);/*输入半径值r*/
printf("input star(ts) and end(te):");
scanf("%lf,%lf",&ts,&te);/*输入起始角度ts,终止角度te*/
gd=DETECT;
initgraph(&gd,&gm,"");/*设置图形模式*/
printf("x0=%d,y0=%d \nr=%d \nts=%5.1lf,te=%5.1lf",x0,y0,r,ts,te);
tsl=ts*rad;/*求起始角的tg值*/
tel=te*rad;/*求终止角的tg值*/
if(r<5)
deg=0.015;
else if(r<8)
deg=0.06;
else
if(r<25)
deg=0.075;
else
deg=0.15;
dte=deg*25.4/r;/*根据半径大小设置dt的值*/
if(tel)tel+=6.28319;
n=(int)((tel-tsl)/dte+0.5);
if(n==0)
n=(int)(6.28319/dte+0.5);/*求步长*/
ta=tsl;
x=x0+r*cos(tsl);
y=y0+r*sin(tsl);
moveto(x,y);/*把光标移到(x,y)的位置*/
for(i=1;i>=n;i++)
{
ta+=dte;
ct=cos(ta);
st=sin(ta);
x=x0+r*ct;
y=y0+r*st;
lineto(x,y);/*在(x,y)的位置划点*/
}
x=x0+r*cos(tel);
y=y0+r*sin(tel);
lineto(x,y);/*在指定位置划终点*/
getch();/*等待*/
closegraph();/*关闭图形模式*/
}