计算机图形学中的中点画线,中点画圆,Bresenham画线与画圆算法


#include<iostream>
#include<graphics.h>  // 这样引用 EasyX 图形库
#include<conio.h>
#include<time.h>
#include<math.h>
#include<stdlib.h>
using namespace std;
 
//Bresenham画线
void Bresenham_line(int x0,int y0,int x1,int y1)
{
 int x,y,dx,dy;
 float k,e;
 dx=x1-x0;
 dy=y1-y0;
 k=dy/dx;//这里是完成k值的初始化
 e=-0.5;
 x=x0;
 y=y0;
 //这里的i每次都是加一个格字,直到终点,y这是选择性的加一或者不加
 for(int i=0;i<=dx;i++)
 {
  //画点的函数
 putpixel(x,y,255);
 x=x+1;
 e=e+k;
 if(e>=0)
 {
 y=y+1;
 e=e-1;//如果e大于零了就要马上减一
 }
 }
}

//中点画线
void MidpointLine(int x0,int y0,int x1,int y1)
{
 int a,b,delta1,delta2,d,x,y;
 a=y0-y1;
 b=x1-x0;
 d=2*a+b;
 //这里的2是为了避免小数的计算
 delta1=2*a;
 delta2=2*(a+b);
 x=x0;
 y=y0;
 putpixel(x,y,255);
 while(x<x1){
  if(d<0){//这样的话就会选取上面一个点
  x++;y++;d+=delta2;
  }else{//否者就选取下面的一个点
  x++;d+=delta1;
  }
  putpixel(x,y,255);
 }
}

//中点画线

void MidpointLine2(int x1,int y1,int x2,int y2,COLORREF color)  //中点画线法
{
 int x = x1, y = y1; //初始化x,y
 int a = y1 - y2, b = x2 - x1;      //a,b分别为x和y的增量
 //考虑四种情况,分别计算增量
 int deltx = (b >= 0 ? 1 : (b = -b, -1)); 
 int delty = (a <= 0 ? 1 : (a = -a, -1));

for(int i=0;i<=400;i++)
 {putpixel(i, 200, color);putpixel(200, i, color);}
 putpixel(x+200, y+200, color);

int d, delt1, delt2;
 if (-a <= b)  // 斜率绝对值 <= 1
 {
  d = 2 * a + b;
  delt1 = 2 * a;
  delt2 = 2 * (a + b);
  while(x != x2)
  {
   if (d < 0)
    y += delty, d += delt2;
   else
    d += delt1;
   x += deltx;
   putpixel(x+200, y+200, color);
  }
 }
 else    // 斜率绝对值 > 1
 {
  d = 2 * b + a;
  delt1 = 2 * b;
  delt2 = 2 * (a + b);
  while(y != y2)
  {
   if(d < 0)
    d += delt1;
   else
    x += deltx, d += delt2;
   y += delty;
   putpixel(x+200, y+200, color);
  }
 }
}

//中点画圆
void MidpointCircle(int x0,int y0,int r,int color)

{
 int x=0,y=r;
 float d=5.0/4-r;
 while(x<=y){
 putpixel(x0+x,y0+y,color);
 putpixel(x0+x,y0-y,color);
 putpixel(x0-x,y0+y,color);
 putpixel(x0-x,y0-y,color);
 putpixel(x0+y,y0+x,color);
 putpixel(x0+y,y0-x,color);
 putpixel(x0-y,y0+x,color);
 putpixel(x0-y,y0-x,color);
 if(d<0)
 d+=x*2.0+3;
 else{
 d+=2.0*(x-y)+5;y--;
 }
 x++;
 }
}

//Bresenhem画圆

void BresenhemCircle(int centerx, int centery, int radius, int color)
{
 int x =0;
 int y = radius;
 int delta = 2*(1-radius);
 int direction;
 while (y >= 0) {
   putpixel(centerx+x, centery+y, color);
   putpixel(centerx-x, centery+y, color);
   putpixel(centerx-x, centery-y, color);
   putpixel(centerx+x, centery-y, color);
  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;
  }
 }
}

void main()
{
 int x0,y0,x1,y1;

initgraph(640, 480); 
 Bresenham_line(10,10,56,56);
 MidpointLine2(0,100,369,0,255);
  MidpointCircle(100,100,50,255);
 BresenhemCircle(100,100,100,255);

getch();    // 按任意键继续
 closegraph();   // 关闭图形界面
}

多的也不说了,源码直接可以使用,而且还是带有坐标轴的

时间: 06-03

计算机图形学中的中点画线,中点画圆,Bresenham画线与画圆算法的相关文章

计算机图形学DDA画线法+中点画线法+Bresenham画线法

#include <cstdio> #include <cstring> #include <conio.h> #include <graphics.h> void line1(){ line(100, 100, 200, 400); line(100, 400, 200, 100); line(0, 200, 300, 300); line(0, 300, 300, 200); } void lineDDA(int x0, int y0, int x1,

图形学--(中点画线法+Bresenham画线算法)

编程环境:codeblocks+EGE库 用到的函数:putpixel(int x1,int y1,int color)  用某种颜色打亮一个坐标点. 这俩种算法都是用来在计算机上画一条直线的,那么我们为什么不直接用直线方程分别带点再打亮呢,这是因为,计算机中每个坐标点都是整数,而直线是由一个个像素点组合而成的,那么,直接将坐标点再进行四舍五入整数化就好了啊,的确,这是一种方法,但计算机中进行浮点数的四舍五入会使运算效率变差,因此真正画直线时是用到上边这俩种方法的. 1.中点画线法 只考虑当直线

计算机图形学(二)输出图元_6_OpenGL曲线函数_2_中点画圆算法

中点画圆算法 如同光栅画线算法,我们在每个步中以单位间隔取样并确定离指定圆最近的像素位置.对于给定半径r和屏幕中心(xc,yc),可以先使用算法计算圆心在坐标原点(0, 0)的圆的像素位置,然后通过将xc加到x且yc加到y.从而把计算出的每个位置(x,y)移动到其适当的屏幕位置.在第一象限中,圆弧段从x = 0到x = y,曲线的斜率从0变化到-1.0.因此,可以在该八分圆上的正x方向取单位步长,并使用决策参数来确定每一步两个可能的y位置中,哪一个更接近于圆的位置.然后,其他七个八分圆中的位置可

计算机图形学中的经常使用模型

今天在网上搜了一下图形学里面比較经常使用的模型.认为挺有意思,把它们收集起来,总结一下. 1.Lena/Lenna 这个模型是一个美女,名字叫Lena,是1972年11月<Playboy>(国内译为:花花公子)杂志的一个插图. 不知道花花公子杂志为何物的请自己去百度. Lena是瑞典人.依据英语标准发音,译为Lenna. 以下来张截图: 花花公子中的原图:http://www.ee.cityu.edu.hk/~lmpo/lenna/len_full.jpg 1973年6月.美国南加州大学的信号

计算机图形学中的常用模型

今天在网上搜了一下图形学里面比较常用的模型,觉得挺有意思,把它们收集起来,总结一下. 1.Lena/Lenna 这个模型是一个美女,名字叫Lena,是1972年11月<Playboy>(国内译为:花花公子)杂志的一个插图.不知道花花公子杂志为何物的请自己去百度. Lena是瑞典人,根据英语标准发音,译为Lenna.下面来张截图: 花花公子中的原图:http://www.ee.cityu.edu.hk/~lmpo/lenna/len_full.jpg 1973年6月,美国南加州大学的信号图像处理

计算机图形学中的种子填充算法c++程序实现

种子填充其实很简单,计算机图形学中介绍的使用栈,感觉作者是不是脑子进水了,直接使用一个队列用广搜就可以了啊,但是我就懒得写了,直接一个递归算了,有兴趣的同学自己试一试 #include<graphics.h>#include<conio.h>  #include<stdio.h>#include<math.h>int Graph[500][500] ; void scanline_seed_fill(int color,int sx,int sy){ Gra

计算机图形学-mac系统下Xcode中OpenGL开发环境配置。

mac系统下Xcode中OpenGL开发环境配置. 这学期有计算机图形学的课程,需要用到OpenGL,最近着手开始配置开发环境了,老师上课给的安装包都是基于windows系统的.网上也是windows上配置的教程比较多,Mac版的比较少.我综合了几个教程并自己总结,实践成功.特来分享配置过程.希望能帮到大家! 介绍 OpenGL(Open Graphics Library)是定义了一个跨编程语言,跨平台的编程接口规格的专业的图形程序接口.它用于三维图像(二维亦可),是一个功能强大,与硬件无关,调

图形学中的画线算法之 &quot;DDA&quot;算法

DDA算法画直线,其理论依据:如 m 表示直线斜率, 那么有斜率 m  =  (y2 - y1) / (x2 - x1), ∴ m = Δy / Δx ,   从而有对于沿直线给定的 x 任何增量Δx,计算出对应的y的增量  Δy = m • Δx :  同理: Δx = Δy / m: 假设斜率  |m| <= 1:即 x 的长度大于  y的长度.现以 x 单位间距为增量,逐个计算  y 值, 有: yk+1 = yk + m; 同理,对于|m| > 1; 我们有: xK+1 = yK +

千兆网络中——使用五类线、超五类线和六类线的区别

去年入手了一台Seagate的Central.一直没时间好好研究,直接插上就用了.内网速度一直维持在10M-15M左右.今年618换了款千兆路由器,速度瞬间提升到了50M-70M.线缆用的都是五类,心中就产生疑问:如果换成超五类线或者六类线,性能是不是能再提高点??于是网上搜到一个哥们十分专业的回答,忍不住粘下来跟大家共享: 原帖地址:http://we.poppur.com/thread-1098485-1-1.html 5类线的传输频率标准是100MHz  超5一般是125MHz  6类标准