OpenGL实现边缘填充算法

边缘填充的思想:枚举每一条边,对这条边右边的像素进行求补操作,就是有填充则去掉,无填充就进行填充

#include <GL/gl.h>
#include <GL/glut.h>
#include <iostream>
#include <cmath>
#include <cstring>
#include <string>
using namespace std;
int x[]= {10,70,70,60,40,30,20};
int y[]= {10,10,50,40,60,20,30};
int vis[500][500]; //判断该坐标的点是否存在
void init()
{
  glClearColor (0.0, 0.0, 0.0, 0.0);
  glMatrixMode (GL_PROJECTION);
  gluOrtho2D (0.0, 200.0, 0.0, 150.0);
}
void MidBresenhamCircle()
{
  memset(vis,0,sizeof(vis));
  glClear(GL_COLOR_BUFFER_BIT);
  glLineWidth(2);
  glBegin(GL_LINES); //绘制多边形形状
  for(int i=0; i<7; ++i)
  {
    glVertex2i(x[i],y[i]);
    glVertex2i(x[(i+1)%7],y[(i+1)%7]);
  }
  glEnd();
  glFlush();
  glPointSize(2);
  glBegin(GL_POINTS);
  for(int i=x[1],j=y[1]; i<300; ++i) //特殊处理k=0的边
  {
    if(!vis[i][j])
    {
      glColor3f(0.0f,1.0f,0.0f);
      glVertex2i(i,j);
      vis[i][j]=1;
    }
    else
    {
      glColor3f(0.0f,0.0f,0.0f);
      glVertex2i(i,j);
      vis[i][j]=1;
    }
  }
  for(int j=y[1]; j<=y[2]; ++j) //特殊处理k不存在的边
  {
    for(int i=x[1]; i<300; ++i)
    {
      if(!vis[i][j])
      {
        glColor3f(0.0f,1.0f,0.0f);
        glVertex2i(i,j);
        vis[i][j]=1;
      }
      else
      {
        glColor3f(0.0f,0.0f,0.0f);
        glVertex2i(i,j);
        vis[i][j]=1;
      }
    }
  }
  for(int p=2; p<7; ++p)
  {
    int k=(y[(p+1)%7]-y[p])/(x[(p+1)%7]-x[p]); //求出斜率
    int x1=x[(p+1)%7],x0=x[p],y1=y[(p+1)%7],y0=y[p]; //根据斜率推导出这条直线的各个点
    if(y1<y0)
    {
      swap(x1,x0);
      swap(y1,y0);
    }
    for(int j=y0; j<=y1; ++j)
    {
      int i=(j-y0+k*x0)/k;
      for(int px=i; px<300; ++px)
      {
        if(!vis[px][j])
        {
          glColor3f(0.0f,1.0f,0.0f);
          glVertex2i(px,j);
          vis[px][j]=1;
        }
        else
        {
          glColor3f(0.0f,0.0f,0.0f);
          glVertex2i(px,j);
          vis[px][j]=0;
        }
      }
    }
  }
  glEnd();
  glFlush();
}
int main(int argc, char *argv[])
{
  glutInit(&argc, argv);
  glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
  glutInitWindowPosition(100, 100);
  glutInitWindowSize(500, 500);
  glutCreateWindow("第一个opengl程序");
  init();
  glutDisplayFunc(MidBresenhamCircle);
  glutMainLoop();
  return 0;
}

效果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • OpenGL扫描线填充算法详解

    本文实例为大家分享了OpenGL扫描线填充算法,供大家参考,具体内容如下 说明 把最近一系列的图形学经典算法实现了一下.课业繁忙,关于该系列的推导随后再写.但是在注释里已经有较为充分的分析. 分情况讨论 注意对于横线需要特别讨论,但是对于垂直线却不必特别讨论.想一想为什么? 代码 #include <iostream> #include <GLUT/GLUT.h> #include <map> #include <vector> #include <l

  • OpenGL实现边缘填充算法

    边缘填充的思想:枚举每一条边,对这条边右边的像素进行求补操作,就是有填充则去掉,无填充就进行填充 #include <GL/gl.h> #include <GL/glut.h> #include <iostream> #include <cmath> #include <cstring> #include <string> using namespace std; int x[]= {10,70,70,60,40,30,20}; in

  • OpenGL实现不规则区域填充算法

    本文实例为大家分享了OpenGL实现不规则区域填充算法,供大家参考,具体内容如下 一.简单递归 利用Dfs实现简单递归填充. 核心代码: // 简单深度搜索填充 (四连通) void DfsFill(int x, int y) { if (x < 0 || y < 0 || x>23 || y>23) { return; } if (a[x][y] == 0) { a[x][y] = 2; DfsFill(x - 1, y); DfsFill(x + 1, y); DfsFill(

  • opengl实现直线扫描算法和区域填充算法

    本文实例为大家分享了opengl实现直线扫描算法和区域填充算法,供大家参考,具体内容如下 总体介绍 1.采用直线扫描算法绘制一条线段,直线由离散点组成 2.利用区域填充算法绘制多边形区域,区域由离散点组成 开发环境VS2012+OpenGL 开发平台 Intel core i5,Intel HD Graphics Family 设计思路 一.直线扫描算法 1.数值微分法(DDA) 已知过端点P0 (x0, y0), P1(x1, y1)的直线段L:y = kx + b,容易得知直线斜率为:k =

  • VB.NET中使用种子填充算法实现给图片着色的例子

    某人最近在使用C#写一个类似Windows的画图工具,在填色的部分卡住了.劳资要他使用种子填充算法着色(不要调用Windows提供的API,否则还锻炼个毛线),现在我把这个功能实现了,程序的效率很高.现在在这里大概写一下实现方法. 程序是用VB.NET写的,C#写法类似(而且还不需要使用Marshal类访问非托管资源,更加方便).程序的运行结果如下: 种子填充算法说白了就是宽度优先搜索算法(BFS),如果你不知道这是什么东西,那说明你数据结构根本就没有学,请自行补充相应的知识. 第一步:实现"铅

  • Opencv学习教程之漫水填充算法实例详解

    前言 基本思想是自动选中了和种子点相连的区域,接着将该区域替换成指定的颜色,经常用来标记或者分离图像的一部分进行处理或分析.漫水填充也可以用来从输入图像获取掩码区域,掩码会加速处理过程,或者只处理掩码指定的像素点.其中掩膜Mask用于进一步控制那些区域将被填充颜色(比如说当对同一图像进行多次填充时). int floodFill(inputoutputArray,inputoutputMask,seedPoint,Scalar newVal,Rect* rect=0,Scalar loDiff=

  • Python实现螺旋矩阵的填充算法示例

    本文实例讲述了Python实现螺旋矩阵的填充算法.分享给大家供大家参考,具体如下: afanty的分析: 关于矩阵(二维数组)填充问题自己动手推推,分析下两个下表的移动规律就很容易咯. 对于螺旋矩阵,不管它是什么鬼,反正就是依次向右.向下.向右.向上移动. 向右移动:横坐标不变,纵坐标加1 向下移动:纵坐标不变,横坐标加1 向右移动:横坐标不变,纵坐标减1 向上移动:纵坐标不变,横坐标减1 代码实现: #coding=utf-8 import numpy ''''' Author: afanty

  • Android图像处理之泛洪填充算法

    泛洪填充算法(Flood Fill Algorithm) 泛洪填充算法又称洪水填充算法是在很多图形绘制软件中常用的填充算法,最熟悉不过就是windows paint的油漆桶功能.算法的原理很简单,就是从一个点开始附近像素点,填充成新的颜色,直到封闭区域内的所有像素点都被填充新颜色为止.泛红填充实现最常见有四邻域像素填充法,八邻域像素填充法,基于扫描线的像素填充方法.根据实现又可以分为递归与非递归(基于栈). 在介绍算法的三种实现方式之前,首先来看一下测试该算法的UI实现.基本思路是选择一张要填充

  • Android多边形区域递归种子填充算法的示例代码

    平面区域填充算法是计算机图形学领域的一个很重要的算法,区域填充即给出一个区域的边界(也可以是没有边界,只是给出指定颜色),要求将边界范围内的所有象素单元都修改成指定的颜色(也可能是图案填充).区域填充中最常用的是多边形填色,本文中我们就讨论几种多边形区域填充算法. 一.种子填充算法(Seed Filling) 如果要填充的区域是以图像元数据方式给出的,通常使用种子填充算法(Seed Filling)进行区域填充.种子填充算法需要给出图像数据的区域,以及区域内的一个点,这种算法比较适合人机交互方式

  • Android多边形区域扫描线种子填充算法的示例

    1.3扫描线种子填充算法 1.1和1.2节介绍的两种种子填充算法的优点是非常简单,缺点是使用了递归算法,这不但需要大量栈空间来存储相邻的点,而且效率不高.为了减少算法中的递归调用,节省栈空间的使用,人们提出了很多改进算法,其中一种就是扫描线种子填充算法.扫描线种子填充算法不再采用递归的方式处理"4-联通"和"8-联通"的相邻点,而是通过沿水平扫描线填充像素段,一段一段地来处理"4-联通"和"8-联通"的相邻点.这样算法处理过程

随机推荐