計算機圖形學和OpenGL(二)座標系和繪製點線函數

這節開始前咱們先了解一下圖元的概念。圖形軟件包中用來描述各類圖形元素的函數稱爲圖形輸出原語,也稱圖元(primitive)。而描述對象幾何要素的輸出圖元通常稱爲幾何圖元。點和線是最簡單的幾何圖元,本節就會簡單介紹點和線段的繪製方法。
1、座標系統。
座標系統通常分爲屏幕座標和OpenGL中的繪圖座標
在上一節中咱們簡單的寫了個示例程序,程序中介紹了gluOrtho2D命令。咱們能夠利用該命令設定一個二維笛卡爾座標系。該函數的四個變量制定的是顯示圖形x和y座標範圍。因此咱們可使用下面代碼制定一個正交投影的二維座標系:
glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluOrtho2D(0.0, 800.0, 0.0, 600.0);

        在創建圖形的幾何描述時,全部OpenGL圖元的位置必須用gluOrtho2D函數定義的座標系統中的絕對座標給出。ios

       2、OpenGL畫點函數算法

       使用下面的函數能夠指定一個點的位置和座標:windows

glVertex* ();
       這裏*號表示該函數須要有後綴碼,這些後綴碼用來指明空間的尺寸、座標值的數據類型和可能的向量形式座標描述。

       在上一節咱們看到繪製圖形時使用以下代碼:緩存

glBegin(GL_POINTS);
		glVertex2i(700, 15);
		glVertex2i(100, 555);
	glEnd();
       glBegin();函數用來指定要顯示的圖元類型,在繪製點的時候,圖元類型常量是:GL_POINTS,begin和end之間必須有glVertex*();函數。用於指定數值的數據類型的後綴是:i(整數)、s(短整數)、f(浮點數)、d(雙精度浮點數)。下面例子中咱們繪製了三個點:

glBegin(GL_POINTS);
		glVertex2i(25, 25);
		glVertex2i(50, 50);
		glVertex2i(100, 100);
	glEnd();
       換一種方法,咱們能夠用矩陣來描述點:

int p1[]{25, 25};
	int p2[]{50, 50};
	int p3[]{100, 100};

	glBegin(GL_POINTS);
	glVertex2iv(p1);
	glVertex2iv(p2);
	glVertex2iv(p3);
	glEnd();
       最後,繪製點的完整代碼爲:

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>
#include <string>  

#include <windows.h>
#include <GL\glut.h>

using namespace std;

void piontSegment(void)
{
	glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(1.0, 0.0, 0.0);
	//經過點繪製
	glBegin(GL_POINTS);
		glVertex2i(25, 25);
		glVertex2i(50, 50);
		glVertex2i(100, 100);
	glEnd();

	//經過矩陣繪製
	/*int p1[]{25, 25};
	int p2[]{50, 50};
	int p3[]{100, 100};

	glBegin(GL_POINTS);
	glVertex2iv(p1);
	glVertex2iv(p2);
	glVertex2iv(p3);
	glEnd();*/

	glFlush();
}

int _tmain(int argc, char **argv)
{
	glutInit(&argc, argv);
	//設置窗口的緩存和顏色模型
	//下面指定的是:窗口使用單個緩存而且使用RGB顏色模型來設定顏色值。
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
	//設置窗口左上角的位置
	glutInitWindowPosition(400, 200);
	//設置窗口的寬高
	glutInitWindowSize(800, 600);
	glutCreateWindow("Test OpenGL Program");

	//設置顯示窗口的背景爲白色。參數順序爲:紅、綠、藍、透明度。
	glClearColor(1.0, 1.0, 1.0, 0.0);
	//設置投影類型:正投影
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	//觀察參數:x座標值從0到200,y是從0到150
	gluOrtho2D(0.0, 800.0, 0.0, 600.0);

	glutDisplayFunc(piontSegment);
	glutMainLoop(); 

	system("pause");
	return 0;
}
       3、畫線函數

       上節咱們就寫了個簡單的畫線函數GL_LINES,使用GL_LINES能夠鏈接一對相鄰端點完成一條直線段,若是描述端點的座標只有一個則社麼都不會顯示,若是端點數爲奇數那麼最後一個點將被捨棄。以下代碼:函數

glBegin(GL_LINES);
		glVertex2i(700, 15);
		glVertex2i(100, 555);
		glVertex2i(50, 150);
		glVertex2i(400, 500);
		glVertex2i(10, 400);
	glEnd();
       最後一個點(80,400)將會被捨棄,輸出的圖形將會以下:


       使用OpenGL的圖元常量GL_LINE_STRIP時,咱們能夠得到折線,即會按照端點順序進行鏈接,直到最後一個端點,代碼以下:oop

glBegin(GL_LINE_STRIP);
		glVertex2i(700, 15);
		glVertex2i(100, 555);
		glVertex2i(50, 150);
		glVertex2i(400, 500);
		glVertex2i(10, 400);
	glEnd();
       繪製的圖形以下:



       接着是最後一個常量參數:GL_LINE_LOOP和上一個不一樣點就是它會把最後一個點和第一個點相連,組成一個循環,代碼:
spa

glBegin(GL_LINE_LOOP);
		glVertex2i(700, 15);
		glVertex2i(100, 555);
		glVertex2i(50, 150);
		glVertex2i(400, 500);
		glVertex2i(10, 400);
	glEnd();
       生成的圖形以下:



       這樣點和線咱們都能繪製了,下節咱們將會介紹一下畫線算法.net

參考內容:《計算機圖形學(第三版)》 電子工業出版社
code

轉載請標明出處:http://blog.csdn.net/letthinking/article/details/39161019對象

相關文章
相關標籤/搜索