计算机图形学中的边标志算法c++程序实现2

摘要: 讲一讲这个程序遇到的错误 1.就是最后一个点,当他只有一个点的时候,他就是吧后面的全部填充,这是因为标志填充算法一定要有两个边界才可以,我解决这个问题的办法是错开一个点 2.就是当有三个点的时候,第2和3点中间部分就不会被填充了,以上的解决办法就是错开一点,也就是把第二个点变成两个点 3,使用中点画圆方法画的圆,在这个算法中,由于他选择的点有可能不是下一个点,而是跟当前点平行的那一个,这个时候他就会填充的是这两个点,所以会有下面运行结果图中心形上方的填充空白,尤其是弧度比较水平的时候

#include<iostream>
#include<conio.h>
#include<stdio.h>
#include<graphics.h>
using namespace std;
int a[1000][1000];
int side[1000];

//中点画圆
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);
 a[x0+x][y0-y]=1;
 putpixel(x0-x,y0-y,color);
 a[x0-x][y0-y]=1;
 putpixel(x0+y,y0-x,color);
 a[x0+y][y0-x]=1;
 putpixel(x0-y,y0-x,color);
 a[x0-y][y0-x]=1;
 if(d<0)
 d+=x*2.0+3;
 else{
 d+=2.0*(x-y)+5;y--;
 }
 x++;
 }
}

void edge_mark_fill(int color){

int driver=VGA,mode=VGAHI;
  initgraph(&driver,&mode,"");
  setbkcolor(0);
  int x;
  int y;

MidpointCircle(100,100,100,255);
  MidpointCircle(301,100,100,255);//圆错开一点

//画图形
    for(x=0,y=100;x<=200 && y<=300;x++,y++)
  {
  putpixel(x,y,color); 
  a[x][y]=1;
  }
 //200错开一点
 for(x=201,y=300;x<=400 && y>=100;x++,y--)
  {
  putpixel(x,y,color); 
  a[x][y]=1;
  }
 
  bool inside=false;
  for(y=0;y<=300;y++)
  {
   inside=false;
  
   for(x=0;x<=400;x++)
   {
    if(side[y]==1)
     break;
    else
    {
    if(a[x][y]==1)
     inside=!(inside);
    if(inside!=false)
     putpixel(x,y,255)
    ;
    else
     putpixel(x,y,0)
    ;
    }
   }
  }
  getch();
}

int main()
{

/*
 讲一讲这个程序遇到的错误
 1.就是最后一个点,当他只有一个点的时候,他就是吧后面的全部填充,
 2.就是当有三个点的时候,2和3点中间部分就不会被填充了,以上的解决办法就是错开一点
 3,使用中点画圆方法的时候,由于他选择的点有可能不是下一个点,所以会有填充空白,尤其是弧度比较水平的时候
 */
      edge_mark_fill(255);
   return 0;
}

时间: 2024-08-01 10:02:48

计算机图形学中的边标志算法c++程序实现2的相关文章

计算机图形学中的种子填充算法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

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

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

计算机图形学 有效边表填充算法(6)

作者:卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/40154077 本文通过一个完整的实例,展示多边形有效边表填充算法. 1)创建CAET类 头文件:AET.h // AET.h: interface for the CAET class. // ////////////////////////////////////////////////////////////////////// #if !defined(AFX_AET_

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

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

计算机图形学 直线反走样Wu算法(4)

作者:卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/40048285 本文通过一个完整的实例来演示,直线反走样Wu算法. 1)创建CP2类 头文件:P2.h // P2.h: interface for the CP2 class. // ////////////////////////////////////////////////////////////////////// #if !defined(AFX_P2_H__DD2

计算机图形学 Cohen-Sutherland直线段裁剪算法

作者 : 卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/40822977 本文通过一个完整的实例演示Cohen-Sutherland直线段裁剪算法. 1)创建类CP2 头文件:P2.h // P2.h: interface for the CP2 class. // ////////////////////////////////////////////////////////////////////// #if !defined

计算机图形学中的中点画线,中点画圆,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,

数学之美--计算机图形学中的数学方法论

我的github: https://github.com/jackyblf 我的公众号: 早期研究3D程序开发的程序员最大的情怀就是从无到有,自己实现一个游戏引擎.当时的我也是充满着这种复古情怀!! 以前的demo大部分都用c++写的,现在尽力全部改成html5+canvas/webgl版本 正在改写demo,编写文章,敬请期待 09年台式机out of order了,一直到去年年底,买了个硬盘数据线,把以前的代码全部拷贝出来了,万幸没损坏!!! 08年的vs2005代码,在vs2015中,竟然

计算机图形学 - 线段裁剪 - Liang Barsky算法(梁友栋算法)

算法描述: Liang_Barsky算法的基本出发点是直线的参数方程.给出任意一条直线段,两端点分别为和,令, 则直线的参数方程为: 如果直线上任意一点位于窗口内,则必须满足下列关系式: 上述不等式可以表示为: 其中p和q定义为: 任何一条直线如果平行于某一条裁剪边界,则有,下标k 对应于直线段平行的窗口边界(,并且分别表示裁剪窗口的左.右.下.上边界).如果对于某一个k值,满足,那么直线完全在窗口的外面,可以抛弃.如果,则该直线在它所平行的窗口边界的内部,还需要进一步计算才能确定直线是否在窗口