紫菜蛋花汤的做法简单:直线 和 圆 的程序
来源:百度文库 编辑:中科新闻网 时间:2024/10/05 10:51:33
请注名 语言类型 (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();/*关闭图形模式*/
}