/*
文件: 中点划线.cpp
内部函数: 见函数原型定义
功能: 用中点划线算法绘制直线
创作日期: 2008-9-18
修改: 2008-9-30 2008-10-1
作者: lh121x@163.com
*/
#include "stdlib.h"
#include "math.h"
#include <gl/glut.h>
#include <iostream.h>
void Te_draw(GLint x0,GLint y0,GLint x1,GLint y1); //对特殊线进行描绘(k=0,+1,-1,无穷)
int K_com(GLint x0,GLint y0,GLint x1,GLint y1); //把一般情况下的直线分为四种情况(0<k<1,k>1,-1<k<0,k<-1)
void K_draw(GLint x0,GLint y0,GLint x1,GLint y1); //对一般情况下的四种直线进行描绘
void setPixel(GLint xCoord, GLint yCoord); //绘点函数
void ChangeSize(GLsizei width, GLsizei Height); //当窗口大小改变时由GLUT函数调用
void RenderScene(void); //用于绘制场景
void SetupRC(void); // 用于设置渲染状态
void Te_draw(GLint x0,GLint y0,GLint x1,GLint y1)
{
GLint a1,b1;
int i,j;
GLint x,y;
a1=y1-y0;
b1=x1-x0;
x=x0;
y=y0;
if(a1==0) j=1;
if(b1==0) j=2;
if(a1==b1) j=3;
if(a1==-b1) j=4;
switch(j)
{
case 1: for(i=1;i<=fabs(b1);i++)
{
if(x0>x1){
x--;
}
else{
x++;
}
setPixel(x,y);
}
break;
case 2: for(i=1;i<=fabs(a1);i++)
{
if(y0>y1){
y--;
}
else{
y++;
}
setPixel(x,y);
}
break;
case 3: for(i=1;i<=fabs(a1);i++)
{
if(x0>x1){
x--;
y--;
}
else{
x++;
y++;
}
setPixel(x,y);
}
break;
case 4: for(i=1;i<=fabs(b1);i++)
{
if(x0>x1){
x--;
y++;
}
else{
x++;
y--;
}
setPixel(x,y);
}
break;
default: K_draw(x0,y0,x1,y1);
break;
}
}
int K_com(GLint x0,GLint y0,GLint x1,GLint y1)
{
float a1,b1;
double k;
a1=float(y1-y0);
b1=float(x1-x0);
k=a1/b1;
if(k>0) {
if(k<1) {
return 1;
}
else {
return 2;
}
}
else {
if(fabs(k)<1) {
return 3;
}
else {
return 4;
}
}
return 0;
}
void K_draw(GLint x0,GLint y0,GLint x1,GLint y1)
{
GLint a,b,d,d1,d2;
GLint x,y,t;
int i;
switch(K_com(x0,y0,x1,y1))
{
case 1:
{
if(x0>x1)
{
t=x0;
x0=x1;
x1=t;
t=y0;
y0=y1;
y1=t;
}
x=x0;
y=y0;
a=y0-y1;
b=x1-x0;
d=2*a+b;
d1=2*a;
d2=2*(a+b);
for(i=1;i<fabs(b);i++){
if(d<0) {
x++;
y++;
d+=d2;
}
else
{
x++;
d+=d1;
}
setPixel(x,y);
}
break;
}
case 2:
{
if(x0>x1)
{
t=x0;
x0=x1;
x1=t;
t=y0;
y0=y1;
y1=t;
}
x=x0;
y=y0;
a=y0-y1;
b=x1-x0;
d=2*b+a;
d1=2*(a+b);
d2=2*b;
for(i=1;i<fabs(a);i++){
if(d<0) {
y++;
d+=d2;
}
else
{
x++;
y++;
d+=d1;
}
setPixel(x,y);
}
break;
}
case 3:
{
if(x0>x1)
{
t=x0;
x0=x1;
x1=t;
t=y0;
y0=y1;
y1=t;
}
x=x0;
y=y0;
a=y0-y1;
b=x1-x0;
d=2*a-b;
d1=2*(a-b);
d2=2*a;
for(i=1;i<fabs(b);i++){
if(d<0) {
x++;
d+=d2;
}
else
{
x++;
y--;
d+=d1;
}
setPixel(x,y);
}
break;
}
case 4:
{
if(x0>x1)
{
t=x0;
x0=x1;
x1=t;
t=y0;
y0=y1;
y1=t;
}
x=x0;
y=y0;
a=y0-y1;
b=x1-x0;
d=a-2*b;
d1=-2*b;
d2=2*(a-b);
for(i=1;i<fabs(a);i++){
if(d<0) {
x++;
y--;
d+=d2;
}
else
{
y--;
d+=d1;
}
setPixel(x,y);
}
break;
}
default: break;
}
}
void setPixel(GLint xCoord, GLint yCoord){
glBegin(GL_POINTS);
glVertex2i(xCoord, yCoord);
glEnd();
}
//该函数用于绘制场景
void RenderScene(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.9f, 0.3f, 0.3f);
glPointSize(3);
Te_draw(10,10,45,10); //测试数据
Te_draw(45,10,70,70);
Te_draw(10,10,70,70);
Te_draw(10,10,10,45);
Te_draw(10,45,70,70);
Te_draw(10,-10,45,-10);
Te_draw(45,-10,70,-70);
Te_draw(10,-10,70,-70);
Te_draw(10,-10,10,-45);
Te_draw(10,-45,70,-70);
Te_draw(-10,10,-45,10);
Te_draw(-10,10,-70,70);
Te_draw(-45,10,-70,70);
Te_draw(-10,10,-10,45);
Te_draw(-70,70,-10,45);
Te_draw(-10,-10,-45,-10);
Te_draw(-70,-70,-45,-10);
Te_draw(-70,-70,-10,-10);
Te_draw(-10,-45,-10,-10);
Te_draw(-70,-70,-10,-45);
Te_draw(45,10,65,0);
Te_draw(45,-10,65,0);
Te_draw(-45,10,-65,0);
Te_draw(-45,-10,-65,0);
Te_draw(10,45,0,65);
Te_draw(-10,45,0,65);
Te_draw(10,-45,0,-65);
Te_draw(-10,-45,0,-65);
glFlush();
}
//该函数用于设置渲染状态
void SetupRC(void)
{
glClearColor(1.0f, 1.0f, 1.0f,1.0f);
}
//当窗口大小改变时由GLUT函数调用
void ChangeSize(GLsizei width, GLsizei Height)
{
GLfloat aspectRatio;
if (Height == 0) {
Height = 1;
}
glViewport(0, 0, width, Height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
aspectRatio = (GLfloat)width / (GLfloat) Height;
if (width <= Height) {
glOrtho(-100.0, 100.0, -100.0 / aspectRatio, 100.0 / aspectRatio, 1.0, -1.0);
}
else{
glOrtho(-100.0 * aspectRatio, 100.0 * aspectRatio, -100.0, 100.0, 1.0, -1.0);
}
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
//主程序入口
void main(void)
{
cout<<"文件: 中点划线.cpp\n"
<< "内部函数: 见函数原型定义\n"
<<"功能: 用中点划线算法绘制直线\n"
<<"创作日期: 2008-9-18\n"
<<"修改: 2008-9-30 2008-10-1\n"
<<"作者: lh121x@163.com\n";
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutCreateWindow("中点划线法");
glutDisplayFunc(RenderScene);
glutReshapeFunc(ChangeSize);
SetupRC();
glutMainLoop();
}
- 1
- 2
- 3
前往页