图形学:Opengl圆和多边形的绘制

1、采用中点Bresenham算法实现带颜色的圆绘制,同时采用OpenGL库函数实现带颜色的圆的绘制。

2、采用X-扫描线算法/改进的x-扫描线算法/边缘填充算法/教材或文献中其他算法实现六边形绘制,同时采用OpenGL库函数实现带颜色的六边形绘制。

在这里插入图片描述

// ConsoleApplication2.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#include "stdio.h"
#include <gl/glut.h>


void putpixel(int x, int y)
{


 glBegin(GL_POINTS);
 glVertex2f(876 + x, 876 + y);
 glEnd();
 glFlush();
}

void Circle(int x, int y)
{
 putpixel(x, y);
 glColor3f(1.0, 0.0, 0.0);
 putpixel(y, x);
 glColor3f(1.0, 0.0, 0.0);
 putpixel(-y, x);
 glColor3f(1.0, 0.0, 0.0);
 putpixel(-x, y);
 glColor3f(1.0, 0.0, 0.0);
 putpixel(-x, -y);
 glColor3f(1.0, 0.0, 0.0);
 putpixel(-y, -x);
 glColor3f(1.0, 0.0, 0.0);
 putpixel(y, -x);
 glColor3f(1.0, 0.0, 0.0);
 putpixel(x, -y);
 glColor3f(1.0, 0.0, 0.0);
}

void MidBresenhamCircle(int r)
{
 int x, y, d;
 x = 0;
 y = r;
 d = 1 - r;
 while (x <= y)
 {
  Circle(x, y);//⚪点定义
  
  if (d < 0)
   d += 2 * x + 3;
  else
  {
   d += 2 * (x - y) + 5;
   y--;
  }
  x++;
 }
}


void display()
{
 
 glClearColor(1.0, 1.0, 1.0, 1.0);
 gluOrtho2D(0.0, 1500.0, 0.0, 1500.0);
 glClear(GL_COLOR_BUFFER_BIT);
 MidBresenhamCircle(600);
}

int main(int argc, char** argv)
{
 glutInit(&argc, argv);
 glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
 glutInitWindowSize(500, 500);
 glutInitWindowPosition(100, 100);
 glutCreateWindow("圆形");
 glutDisplayFunc(display);
 glutMainLoop();
 return 0;
}





#include "stdafx.h"
#include<math.h>
#include "stdio.h"
#include <gl/glut.h>

#include <iostream>

using namespace std;

int n = 3600;  //圆绘制次数
float PI = 3.1415926f;
float R = 0.8f;  //半径

void myDisplay(void)
{
 //画圆
 
 glClearColor(1, 1, 1, 1);
 glColor4f(0, 0, 1, 0);
 glBegin(GL_LINE_LOOP);
 glClear(GL_COLOR_BUFFER_BIT);
 for (int i = 0; i < n; i++)
 {
  glVertex2f(R*sin(2 * PI*i / n), R*cos(2 * PI*i / n));   //定义顶点
 }
 glEnd();
 glFlush();
}
 int main(int argc, char *argv[])
 {
  glutInit(&argc, argv);   //初始化GLUT
  glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
  glutInitWindowPosition(100, 100);
  glutInitWindowSize(400, 400);
  glutCreateWindow("My first OpenGL program");
  glutDisplayFunc(&myDisplay);   //回调函数
  glutMainLoop();    //持续显示,当窗口改变会重新绘制图形
  return 0;
 }

在这里插入图片描述

#include"stdafx.h"
#include<windows.h> 
#include<GL/glut.h> 
const int POINTNUM = 6;      //多边形点数. 

        /******定义结构体用于活性边表AET和新边表NET***********************************/
typedef struct XET
{
 float x;
 float dx, ymax;
 XET* next;
} AET, NET;

/******定义点结构体point******************************************************/
struct point
{
 float x;
 float y;
} polypoint[POINTNUM] = { { 250,10 },{ 550,150 },{ 550,400 },{ 250,250 },{ 100,350 },{ 120,200 } }; //多边形顶点 

void PolyScan()
{
 /******计算最高点的y坐标(扫描到此结束)****************************************/
 int MaxY = 0;
 int i;
 for (i = 0; i<POINTNUM; i++)
  if (polypoint[i].y>MaxY)
   MaxY = polypoint[i].y;

 /*******初始化AET表***********************************************************/
 AET *pAET = new AET;
 pAET->next = NULL;

 /******初始化NET表************************************************************/
 NET *pNET[1024];
 for (i = 0; i <= MaxY; i++)
 {
  pNET[i] = new NET;
  pNET[i]->next = NULL;
 }
 glClear(GL_COLOR_BUFFER_BIT);        //赋值的窗口显示. 
 glColor3f(0.0, 0.0, 0.0);             //设置直线的颜色红色 
 glBegin(GL_POINTS);
 /******扫描并建立NET表*********************************************************/
 for (i = 0; i <= MaxY; i++)
 {
  for (int j = 0; j<POINTNUM; j++)
   if (polypoint[j].y == i)
   {
    //一个点跟前面的一个点形成一条线段,跟后面的点也形成线段 
    if (polypoint[(j - 1 + POINTNUM) % POINTNUM].y>polypoint[j].y)
    {
     NET *p = new NET;
     p->x = polypoint[j].x;
     p->ymax = polypoint[(j - 1 + POINTNUM) % POINTNUM].y;
     p->dx = (polypoint[(j - 1 + POINTNUM) % POINTNUM].x - polypoint[j].x) / (polypoint[(j - 1 + POINTNUM) % POINTNUM].y - polypoint[j].y);
     p->next = pNET[i]->next;
     pNET[i]->next = p;
    }
    if (polypoint[(j + 1 + POINTNUM) % POINTNUM].y>polypoint[j].y)
    {
     NET *p = new NET;
     p->x = polypoint[j].x;
     p->ymax = polypoint[(j + 1 + POINTNUM) % POINTNUM].y;
     p->dx = (polypoint[(j + 1 + POINTNUM) % POINTNUM].x - polypoint[j].x) / (polypoint[(j + 1 + POINTNUM) % POINTNUM].y - polypoint[j].y);
     p->next = pNET[i]->next;
     pNET[i]->next = p;
    }
   }
 }
 /******建立并更新活性边表AET*****************************************************/
 for (i = 0; i <= MaxY; i++)
 {
  //计算新的交点x,更新AET 
  NET *p = pAET->next;
  while (p)
  {
   p->x = p->x + p->dx;
   p = p->next;
  }
  //更新后新AET先排序*************************************************************/ 
  //断表排序,不再开辟空间 
  AET *tq = pAET;
  p = pAET->next;
  tq->next = NULL;
  while (p)
  {
   while (tq->next && p->x >= tq->next->x)
    tq = tq->next;
   NET *s = p->next;
   p->next = tq->next;
   tq->next = p;
   p = s;
   tq = pAET;
  }
  //(改进算法)先从AET表中删除ymax==i的结点****************************************/ 
  AET *q = pAET;
  p = q->next;
  while (p)
  {
   if (p->ymax == i)
   {
    q->next = p->next;
    delete p;
    p = q->next;
   }
   else
   {
    q = q->next;
    p = q->next;
   }
  }
  //将NET中的新点加入AET,并用插入法按X值递增排序**********************************/ 
  p = pNET[i]->next;
  q = pAET;
  while (p)
  {
   while (q->next && p->x >= q->next->x)
    q = q->next;
   NET *s = p->next;
   p->next = q->next;
   q->next = p;
   p = s;
   q = pAET;
  }
  /******配对填充颜色***************************************************************/

  p = pAET->next;
  while (p && p->next)
  {
   for (float j = p->x; j <= p->next->x; j++)
    glVertex2i(static_cast<int>(j), i);
   p = p->next->next;//考虑端点情况 
  }
 }
 glEnd();
 glFlush();
}

void init(int argc, char** argv)
{
 glutInit(&argc, argv);  //I初始化 GLUT. 
 glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);  //设置显示模式:单个缓存和使用RGB模型 
 glutInitWindowPosition(50, 100);  //设置窗口的顶部和左边位置 
 glutInitWindowSize(400, 300);  //设置窗口的高度和宽度 
 glutCreateWindow("Scan Program");

 glClearColor(1.0, 1.0, 1.0, 0); //窗口背景颜色为白色 
 glMatrixMode(GL_PROJECTION);
 gluOrtho2D(0, 600, 0, 450);
}

void myDisplay(void)
{
 glClear(GL_COLOR_BUFFER_BIT);
 glColor3f(0.0, 0.4, 0.2);
 glPointSize(1);
 glBegin(GL_POINTS);
 PolyScan();
 glEnd();
 glFlush();
}

int main(int argc, char** argv)
{
 init(argc, argv);
 glutDisplayFunc(myDisplay);        //图形的定义传递给我window. 
 glutMainLoop();
 return 0;
}

在这里插入图片描述

#include "stdafx.h"
#include<math.h>
#include "stdio.h"
#include <gl/glut.h>

#include <iostream>
const int n = 6;

const GLfloat R = 0.5f;

const GLfloat pi = 3.1415926536f;

void display()

{

 int i = 0;

 glClear(GL_COLOR_BUFFER_BIT);
 glColor3f(1, 0, 1);
 glBegin(GL_POLYGON);

 for (i = 0; i < n; i++)

 {

  glVertex2f(R*cos(2 * pi / n*i), R*sin(2 * pi / n*i));

 }

 glEnd();

 glFlush();

}

int main(int argc, char **argv)

{

 glutInit(&argc, argv);

 glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);

 glutInitWindowPosition(100, 100);

 glutInitWindowSize(400, 400);

 glutCreateWindow("opengl 3d view");

 glutDisplayFunc(display);

 glutMainLoop();

 return 0;

}
  • 7
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用OpenGL绘制国旗可以通过以下步骤实现: 1. 创建OpenGL上下文和窗口。 2. 设置绘制区域和视口。 3. 设置绘制颜色和深度缓冲区。 4. 绘制国旗的红色背景。 5. 绘制五颗黄色的五角星。可以使用OpenGL绘制多边形功能来绘制五角星,也可以使用纹理映射来贴上五角星的图案。 6. 交换前后缓冲区,显示绘制结果。 以下是一个简单的OpenGL绘制国旗的示例代码: ``` #include <GL/glut.h> void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glColor3f(1.0, 0.0, 0.0); // 设置绘制颜色为红色 glBegin(GL_QUADS); glVertex2f(-1.0, 1.0); glVertex2f(-1.0, -1.0); glVertex2f(1.0, -1.0); glVertex2f(1.0, 1.0); // 绘制国旗的红色背景 glEnd(); glColor3f(1.0, 1.0, 0.0); // 设置绘制颜色为黄色 glBegin(GL_POLYGON); glVertex2f(-0.5, 0.5); glVertex2f(-0.25, 0.25); glVertex2f(0.0, 0.5); glVertex2f(0.25, 0.25); glVertex2f(0.5, 0.5); glVertex2f(0.375, 0.25); glVertex2f(0.5, 0.0); glVertex2f(0.375, -0.25); glVertex2f(0.5, -0.5); glVertex2f(0.25, -0.375); glVertex2f(0.0, -0.5); glVertex2f(-0.25, -0.375); glVertex2f(-0.5, -0.5); glVertex2f(-0.375, -0.25); glVertex2f(-0.5, 0.0); glVertex2f(-0.375, 0.25); // 绘制五角星 glEnd(); glutSwapBuffers(); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH); glutInitWindowSize(800, 600); glutInitWindowPosition(100, 100); glutCreateWindow("OpenGL Flag"); glutDisplayFunc(display); glutMainLoop(); return 0; } ``` 该示例代码使用了OpenGL的基本绘图功能,通过绘制红色背景和黄色五角星实现了绘制国旗的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值