直线段的裁剪算法
‘壹’ 直线段的裁剪的c语言程序解释
不是为了赶作业吧?
如果是自学的话,推荐你去看一下:有一本叫《计算机图形学》的书,上面有这个程序的讲解和解释。
‘贰’ 计算机图形学裁剪试验报告怎么写
不知你的要求是什么我把我报告的一部分关于裁剪的粘给你 裁剪(clipping)是裁去窗口之外物体或物体部分的一种操作。 2.1 直线的剪裁 Cohen-Sutherland算法;2.2 多边形的剪裁 Sutlerland_Hodgman算法2.3 字符串的剪裁 裁剪:确定图形中哪些部分落在显示区之内,哪些落在显示区之外,以便只显示落在显示区内的那部分图形。这个选择过程称为裁剪。窗口:画面上对应于屏幕显示的那部分区域成为窗口。一般定义为矩形。 2.1 直线的剪裁 直线和窗口的关系可以分为如下3类(图2.20): ⑴ 整条直线在窗口内。此时,不需剪裁,显示整条直线。 ⑵ 整条直线在窗口外,此时,不需剪裁,不显示整条直线。 ⑶ 部分直线在窗口内,部分直线在窗口外。此时,需要求出直线与窗框的交点,并将窗口外的直线部分剪裁掉,显示窗口内的直线部分。 直线剪裁算法有两个主要步骤。首先将不需剪裁的直线挑出,即删去在窗外的直线。然后,对其余直线,逐条与窗框求交点,并将窗口外的 部分删去。 Cohen-Sutherland直线剪裁算法以区域编码为基础,将窗口及其周围的8个方向以4 bit的二进制数进行编码。各编码分别代表窗外上下右左空间的编码 图2.21所示的编码方法将窗口及其邻域分为5个区域: ⑴ 内域:区域(0000)。 ⑵ 上域:区域(1001, 1000, 1010)。 ⑶ 下域:区域(0101, 0100, 0110)。 ⑷ 左域:区域(1001, 0001, 0101)。 ⑸ 右域:区域(1010, 0010, 0110)。 当线段的两个端点的编码的逻辑“与”非零时 ,线段为显然不可见的 对某线段的两个端点的区号进行位与运算,可知这两个端点是否同在视区的上、下、左、右; 算法的主要思想是,对每条直线P1P2: ⑴ 对直线两端点P1、P2编码分别记为C1(P1)={a1, b1, c1, d1},C2(P2)={a2, </p><p>b2, c2, d2}其中,ai、bi、ci、di取值范围为{1, 0},i∈{1, 2}。⑵ 如果ai=bi=ci=di=0,则显示整条直线,取出下一条直线,返步骤(1)。否则,进入步骤(3)。⑶如果|a1-a2|=1,则求直线与窗上边(y=yw-max)的交点,并删去交点以上部分。如果|b1-b2|=1,|c1-c2= |=1,|d1-d2|=1,作类似处理。⑷ 返步骤(1)。 Cohen-Sutherland算法——C语言程序 #define LEFT 1 #define RIGHT 2 #define BOTTOM 4 #define TOP 8 int encode(float x,float y) { int c=0; if(x<XL) c|=LEFT; if(x>XR) c|=RIGHT; if(x<YB) c|=BOTTOM; if(x>YT) c|=TOP; retrun c; } void CS_LineClip(x1,y1,x2,y2,XL,XR,YB,YT) float x1,y1,x2,y2,XL,XR,YB,YT;//(x1,y1)(x2,y2)为线段的端点坐标,其他四个参数定义窗口的边界 { int code1,code2,code; code1=encode(x1,y1); code2=encode(x2,y2); while(code1!=0 ||code2!=0) { if(code1&code2 !=0) return; //位于窗口外 code = code1; if(code1==0) code = code2; if(LEFT&code !=0) //求线段与窗口边界 //的交点 { x=XL; //左 y=y1+(y2-y1)*(XL-x1)/(x2-x1); } else if(RIGHT&code !=0) { x=XR; //右 y=y1+(y2-y1)*(XR-x1)/(x2-x1); } else if(BOTTOM&code !=0) { y=YB; //下 x=x1+(x2-x1)*(YB-y1)/(y2-y1); } else if(TOP & code !=0) { y=YT; //上 x=x1+(x2-x1)*(YT-y1)/(y2-y1); } if(code ==code1) { x1=x;y1=y; code1 =encode(x,y);} else { x2=x;y2=y; code2 =encode(x,y);} } displayline(x1,y1,x2,y2); //线段位于窗口内 } 2.6.2 多边形的剪裁 多边形剪裁算法的关键在于,通过剪裁,要保持窗口内多边形的边界部分,而且要将窗框的有关部分按一定次序插入多边形的保留边界之间,从而使剪裁后的多边形的边仍然保持封闭状态,以便填色算法得以正确实现(图2.22(c))。 Sutherland-Hodgeman算法—逐次多边形裁剪算法 基本思想:通过简单地一次用窗口的一条边裁剪多边形 算法:(1) 将多边形表示为顶点表,即{P1,P2,… … Pn-1,Pn }, 并生成边表P1P2, P2P3, … … Pn-1Pn, PnP1, (2) 用窗口边裁剪原多边形,生成中间多边形(3) 对中间多边形重复步骤(2), 直至被窗口所有边裁剪完为止 关键:根据多边形的边表,逐次对每一段边与裁剪线(窗口边)比较,判别输入顶点的个数和坐标,并联结成封闭多边形 实现方法:①设置二个表 输入顶点表(向量)—用于存放被裁剪多边形的顶点p1-pm。 输出顶点表(线性链表)—用于存放裁剪过程中及结果的顶点 q1-qn。②输入顶点表中各顶点要求按一定顺序排列,一般可采用顺时针或逆时针方向。③相对于裁剪窗口的各条边界,按顶点表中的顺序,逐边进行裁剪。 具体操作: Pi 若位于边界线的可见一侧,则 Pi 送输出顶点表 Pi 若位于边界线的不可见一侧,则将其舍弃。 除第一个顶点外,还要检查每一个 Pi 和前一顶点 Pi-1是否位于窗口边界的同一侧,若不在同一侧,则需计算出交点送输出顶点表。最后一个顶点 Pn则还要与 P1 一起进行同样的检查。 裁剪前: 裁剪后:输入顶点表:p1p2p3p4p5 输入顶点表: 不变输出顶点表:空 输出顶点表: q1q2p3q7q8q5q6q4q3 �6�1考虑窗口的一条边以及延长线构成的裁剪线该线把平面分成两个部分:可见一侧;不可见一侧�6�1多边形的各条边的两端点S、P。它们与裁剪线的位置关系只有四种 2.3 字符串的剪裁 字符串剪裁有3种可选择的方法。 ⒈ 字符串的有或无剪裁 (all-or-none-text) ⒉ 字符的有或无剪裁 (all-or-none-character) ⒊ 字符的精密剪裁
‘叁’ 请问怎样用Cohen-SutherLand算法做个矩形直线段裁剪的vc++程序
#include <Windows.h>
#include <gl/glut.h>
//////////////////////////////////////////////////////////////////////////
//区域码
const GLint leftBitCode=0x1;
const GLint rightBitCode=0x2;
const GLint buttonBitCode=0x4;
const GLint topBitCode=0x8;
GLint winWidth=640,winHeight=480;
class screenPT
{
public:
GLfloat x,y;
};
inline GLint inside(GLint code){return GLint(!code);} //判断点是否在裁剪区内
inline GLint reject(GLint code1,GLint code2){return GLint(code1&code2);} //判断能否完全排除一条线段
inline GLint accept(GLint code1,GLint code2){return GLint(!(code1 | code2));} //判断能否完全接受一条线段
inline void swapPT(screenPT& a,screenPT& b){screenPT t=a;a=b;b=t;} //交换两个点
inline void swapCode(GLubyte& a,GLubyte& b){GLubyte t=a;a=b;b=t;} //交换两个区域码
//确定一个点所在位置的区域码
GLubyte encode(const screenPT& p,const screenPT& winMin,const screenPT& winMax)
{
GLubyte code=0x00;
if(p.x<winMin.x)
code |= leftBitCode;
if(p.x>winMax.x)
code |= rightBitCode;
if(p.y<winMin.y)
code |= buttonBitCode;
if(p.y>winMax.y)
code |= topBitCode;
return code;
}
//在屏幕上画一条未裁剪的线,由裁剪函数调用
void drawOneLine(const screenPT& a,const screenPT& b)
{
glBegin(GL_LINES);
glVertex2f(a.x,a.y);
glVertex2f(b.x,b.y);
glEnd();
}
//裁剪函数
void lineClip(screenPT winMin,screenPT winMax,screenPT lineBegin,screenPT lineEnd)
{
GLubyte code1,code2; //保存两个端点的区域码
GLboolean done=false,plotLine=false; //判断裁剪是否结束和是否要绘制直线
GLfloat k; //斜率
while(!done)
{
code1 = encode(lineBegin,winMin,winMax);
code2 = encode(lineEnd,winMin,winMax);
if(accept(code1,code2)) //当前直线能完全绘制
{
done=true;
plotLine=true;
}
else
{
if(reject(code1,code2)) //当前直线能完全排除
done = true;
else
{
if(inside(code1)) //若lineBegin端点在裁剪区内则交换两个端点使它在裁剪区外
{
swapPT(lineBegin,lineEnd);
swapCode(code1,code2);
}
//计算斜率
if(lineBegin.x != lineEnd.x)
k = (lineEnd.y-lineBegin.y)/(lineEnd.x-lineBegin.x);
//开始裁剪,以下与运算若结果为真,
//则lineBegin在边界外,此时将lineBegin移向直线与该边界的交点
if(code1 & leftBitCode)
{
lineBegin.y += (winMin.x-lineBegin.x)*k;
lineBegin.x = winMin.x;
}
else if(code1 & rightBitCode)
{
lineBegin.y += (winMax.x-lineBegin.x)*k;
lineBegin.x = winMax.x;
}
else if(code1 & buttonBitCode)
{
if(lineBegin.x != lineEnd.x)
lineBegin.x += (winMin.y-lineBegin.y)/k;
lineBegin.y = winMin.y;
}
else if(code1 & topBitCode)
{
if(lineBegin.x != lineEnd.x)
lineBegin.x += (winMax.y-lineBegin.y)/k;
lineBegin.y = winMax.y;
}
}
}
}
if(plotLine)
drawOneLine(lineBegin,lineEnd); //绘制裁剪好的直线
}
//////////////////////////////////////////////////////////////////////////
void rect(screenPT winMin,screenPT winMax)
{
glBegin(GL_LINE_LOOP);
glVertex2f(winMin.x,winMin.y);
glVertex2f(winMax.x,winMin.y);
glVertex2f(winMax.x,winMax.y);
glVertex2f(winMin.x,winMax.y);
glEnd();
}
void init()
{
glViewport(0,0,winWidth,winHeight);
glClearColor(1.0,1.0,1.0,0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0,winWidth,0,winHeight);
glMatrixMode(GL_MODELVIEW);
}
void display()
{
screenPT winMin,winMax,lineBegin,lineEnd;
winMin.x=100.0; winMin.y=50.0;
winMax.x=400.0; winMax.y=300.0;
lineBegin.x=0.0; lineBegin.y=0.0;
lineEnd.x=winWidth; lineEnd.y=winHeight;
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0,0.0,0.0);
rect(winMin,winMax); //为裁剪区域绘制一个边框
lineClip(winMin,winMax,lineBegin,lineEnd);
lineBegin.y=240.0; lineEnd.y=240.0;
lineClip(winMin,winMax,lineBegin,lineEnd);
lineBegin.x=320.0; lineBegin.y=0.0;
lineEnd.x=320.0; lineEnd.y=winHeight;
lineClip(winMin,winMax,lineBegin,lineEnd);
glFlush();
}
int main(int argc,char** argv)
{
glutInit(&argc,argv);
glutInitWindowPosition(100,100);
glutInitWindowSize(winWidth,winHeight);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutCreateWindow("my app");
init();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
‘肆’ 推广裁剪直线段的Cohen-Sutherland算法,处理裁剪窗口为正六边形的情况.
参考:
blog.csdn.net/pleasecallmewhy/article/details/8393445
推广区域码:
考虑:
矩形窗口区域,可以认为是两条相互垂直的条带区域的交集。
使用四位区域编码,其中每个位用于标记该点是否位于某个条带的某一侧。
符号位的判断表达式是把端点坐标代入对应条带边界方程后化简得到的。
推广:
正六边形区域,可以认为是三条互相成60度的条带区域的交集。
使用六位区域编码,其中每个位用于标记该点是否位于某个条带的某一侧。
符号位的判断表达式同样是把端点坐标代入对应条带边界方程后化简得到。
推广区域码裁剪:
两端点区域码全为0,则在区域内,整体保留。
两端点区域码有为1的相同位,则在对应条带的同一侧,整体丢弃。
剩余情况与矩形的情况类同,分侧截去区域外线段。
复杂度分析:
原边界方程平行于坐标轴,计算每位区域码仅需一次减法运算或无需运算直接比较;推广后边界斜率为无理数,需要一次乘法三次减法运算。
原区域码仅有4位;推广后有6位。
原区域裁剪计算截点时,x、y其中一个可直接得出,故可以使用两点式直接推算;推广后必须解二元一次方程组。
原区域裁剪需要对四个方向分别检测;推广后需要对六个方向分别检测。
‘伍’ 计算机图形学中有几种直线裁剪算法
计算机图形学(Computer Graphics,简称CG)是一种使用数学算法将二维或三维图形转化为计算机显示器的栅格形式的科学。
简单地说,计算机图形学的主要研究内容就是研究如何在计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法。图形通常由点、线、面、体等几何元素和灰度、色彩、线型、线宽等非几何属性组成。从处理技术上来看,图形主要分为两类,一类是基于线条信息表示的,如工程图、等高线地图、曲面的线框图等,另一类是明暗图,也就是通常所说的真实感图形。
计算机图形学一个主要的目的就是要利用计算机产生令人赏心悦目的真实感图形。为此,必须建立图形所描述的场景的几何表示,再用某种光照模型,计算在假想的光源、纹理、材质属性下的光照明效果。所以计算机图形学与另一门学科计算机辅助几何设计有着密切的关系。事实上,图形学也把可以表示几何场景的曲线曲面造型技术和实体造型技术作为其主要的研究内容。同时,真实感图形计算的结果是以数字图像的方式提供的,计算机图形学也就和图像处理有着密切的关系。
图形与图像两个概念间的区别越来越模糊,但还是有区别的:图像纯指计算机内以位图形式存在的灰度信息,而图形含有几何属性,或者说更强调场景的几何表示,是由场景的几何模型和景物的物理属性共同组成的。
计算机图形学的研究内容非常广泛,如图形硬件、图形标准、图形交互技术、光栅图形生成算法、曲线曲面造型、实体造型、真实感图形计算与显示算法、非真实感绘制,以及科学计算可视化、计算机动画、自然景物仿真、虚拟现实等。
‘陆’ 使用VC++实现两个算法: (1) 直线段扫描的Brensenham算法; (2) 直线段裁剪的Cohen-Sutherland算法.
最佳答案0.0036*0.004 0.0036*400
0.4/0.002 4/0.07
小数点的,先按整数算,然后在结果前面加0,凑够小数的位数即可
如0.0036*0.004
先按照36*4=144
共有7位小数,
所以结果为0.000144
0.0036*400
36*4=144
结果有两位小数,
所以为1.44
0.4/0.002
除数的,可以上下同乘以10的n次方,消
‘柒’ 简述梁友栋-Barsky线段裁剪算法的基本思想
利用线段的参数表达形式直接判别落在窗口内的部分线段。
大体上有以下几步,有些步骤依据中间的判断结果可以省略或跳转。
第一步:计算出Qi和Di(i=L,R,B,T)
第二步:看Qi的符号进行判断
第三步:计算tL=max(0,ti(始边参数)), tU=min(1,ti(终边参数))
如果,tU>tL,则可见线段区间[tL,tU]
第四步:利用tL和tU计算端点坐标
实际上很简单,不要想象的太难。网上有很多博客有介绍,可以看看。
‘捌’ 如果要用Liang-Barskey算法实现裁剪,如何修改程序
给你一个完整的Liang-Barskey直线段裁剪算法的C语言程序
#include "graphics.h"
#include "stdio.h"
#define LINE_COLOR 10
#define WINDOW_COLOR 4
int ClipT(float p,float q,float *u1,float *u2)
{
int flag=1;
float r;
if(p<0.0)
{
r=q/p;
if(r>*u2) flag=0;
else if(r>*u1)
*u1=r;
}
else if(p>0.0)
{
r=q/p;
if(r<*u1) flag=0;
else if(r<*u2)
*u2=r;
}
else if(q<0.0) flag=0;
return flag;
}
void Liang_Barsky(int xL,int yT,int xR,int yB,int x1,int y1,int x2,int y2)
{
float dx,dy,u1,u2;
u1=0.0;u2=1.0;
dx=x2-x1;
if(ClipT(-dx,x1-xL,&u1,&u2))
if(ClipT(dx,xR-x1,&u1,&u2))
{
dy=y2-y1;
if(ClipT(-dy,y1-yT,&u1,&u2))
if(ClipT(dy,yB-y1,&u1,&u2))
{
if(u2<1.0)
{
x2=x1+u2*dx;
y2=y1+u2*dy;
}
if(u1>0.0)
{
x1=x1+u1*dx;
y1=y1+u1*dy;
}
line(x1,y1,x2,y2);
}
}
}
void main(void)
{
int gdriver=DETECT,gmode;
int XL,XR,YB,YT;
int x0,y0,x1,y1;
do
{
registerbgidriver(EGAVGA_driver);
initgraph(&gdriver,&gmode,"");
cleardevice();
printf("\nLiang_Barsky\n");
printf("\n");
printf("Please input the line node(x0,y0,x1,y1):\n");
scanf("%d,%d,%d,%d",&x0,&y0,&x1,&y1);
printf("\n");
cleardevice();
setcolor(LINE_COLOR);
line(x0,y0,x1,y1);
getch();
printf("\nLiang_Barsky\n");
printf("\n");
printf("Please input the rectangle point(XL,YT,XR,YB):\n");
scanf("%d,%d,%d,%d",&XL,&YT,&XR,&YB);
printf("\n");
cleardevice();
line(x0,y0,x1,y1);
setcolor(WINDOW_COLOR);
rectangle(XL,YT,XR,YB);
getch();
cleardevice();
rectangle(XL,YT,XR,YB);
setcolor(LINE_COLOR);
Liang_Barsky(XL,YT,XR,YB,x0,y0,x1,y1);
getch();
printf("\n\n Continue?(y|n?)");
getchar();
}while(getchar()=='y'||getchar()=='Y');
printf("\n");
printf("press any key to end!");
getch();
closegraph();
}
‘玖’ 计算机图形学直线段裁剪算法或二维基本变换算法,能复制运行的来啊,谢谢大侠们了 啊
#include"graphics.h"
#include"math.h"
typedef struct Point /* 点 */
{
int x;
int y;
}Point;
/* 点的平移变换 */
void PinYi(int * x,int * y,int tx,int ty)
{
*x = *x + tx;
*y = *y + ty;
}
/* 点的旋转变换 */
void XuanZhuan(int * x,int * y,float q)
{
int m ;
int n;
float Q;
Q = (3.1415926/180)*q;
m = (*x);
n = (*y);
*x = m * cos(Q) - n * sin(Q);
*y = m * sin(Q) + n * cos(Q);
}
void XuanZhuan_RY(int m,int n,int * x,int * y,float q)/* 绕(m,n)的旋转*/
{
PinYi(x,y,-m,-n);
XuanZhuan(x,y,q);
PinYi(x,y,m,n);
}
void line_dda(int x1,int y1,int x2,int y2 ,COLORREF color)
{
float x = 0.0;
float y = 0.0;
float x3 = ( float )x1;
float y3 = ( float )y1;
float n;
n=( float )( abs( x2-x1 ) >= abs( y2-y1 ) ? abs( x2-x1 ) : abs( y2-y1 ) );
if( n != 0.0 )
{
x=( ( float )( x2-x1 ) ) / n;
y=( ( float )( y2-y1 ) ) / n;
}
while( n >= 0 )
{
putpixel( ( int )x3 , ( int )y3 , color );
x3 += x ;y3 += y ;n -= 1.0;
}
}
void line(Point i,Point j,COLORREF color){
line_dda(i.x,i.y,j.x,j.y,color);
}
Point p[4]={-50,50,50,50,-50,-50,50,-50};
int PY[2]={0,0},XZ=0;
void main()
{
int width=600,height=480;
int zbx=200,zby=200;
COLORREF color=0x00ff00;
char ch;
initgraph(width, height);
ch=getch();
for(int o=0;o<4;o++)
PinYi(&p[o].x,&p[o].y,zbx,zby);
while(ch=getch())
{
PY[0]=0;PY[1]=0;
XZ=0;
switch(ch){
case 'q': XZ--;break;
case 'e': XZ++;break;
case 'w': PY[1]--;break;
case 's': PY[1]++;break;
case 'a': PY[0]--;break;
case 'd': PY[0]++;break;
//default :return 0;
}
for(int o=0;o<4;o++)
{
PinYi(&p[o].x,&p[o].y,PY[0],PY[1]);
PinYi(&zbx,&zby,PY[0],PY[1]);
XuanZhuan_RY(zbx,zby,&p[o].x,&p[o].y,XZ);
}
cleardevice();
line(p[0],p[1],color);
line(p[1],p[2],color);
line(p[2],p[3],color);
line(p[3],p[0],color);
}
}
有个问题是,,旋转的时候因为π取的3.1415926七位,所以越转越小!!!
需要改动!!就不弄了,要睡了!!
‘拾’ 计算机图形学:线段剪裁中点分割算法,要求用C++做,急求源代码啊,谢谢! 752512212
#include <GL/glut.h>#include <stdlib.h>#include "iostream.h"int x0,y0,x1,y1;int Max(int a,int b,int c){ if(a>b) { if(a>c) return a; else return c; } else { if(b>c) return b; else return c; }}int Min(int a,int b,int c){ if(a<b) { if(a<c) return a; else return c; } else { if(b<c) return b; else return c; }}void DrawLine1(int x0,int y0,int x1,int y1){ int d,temp; temp=y0; d=2*(y1-y0)-(x1-x0); glBegin(GL_POINTS); glVertex2d(x0,y0); glEnd(); for(int k=x0+1;k<x1;k++) { if(d>=0) { glBegin(GL_POINTS); glVertex2d(k,temp+1); glEnd(); d=d+2*(y1-y0)-2*(x1-x0); temp=temp+1; } else { glBegin(GL_POINTS); glVertex2d(k,temp); glEnd(); d=d+2*(y1-y0); temp=temp; } } glBegin(GL_POINTS); glVertex2d(x1,y1); glEnd();}void DrawLine2(int x0,int y0,int x1,int y1){ int d,temp; temp=x0; d=2*(x1-x0)-(y1-y0); glBegin(GL_POINTS); glVertex2d(x0,y0); glEnd(); for(int k=y0+1;k<y1;k++) { if(d>=0) { glBegin(GL_POINTS); glVertex2d(temp+1,k); glEnd(); d=d+2*(x1-x0)-2*(y1-y0); temp=temp+1; } else { glBegin(GL_POINTS); glVertex2d(temp,k); glEnd(); d=d+2*(x1-x0); temp=temp; } } glBegin(GL_POINTS); glVertex2d(x1,y1); glEnd();}void DrawTriangle(int x0,int y0,int x1,int y1,int x2,int y2){ int xmin,xmax,ymin,ymax; float a,b,c; xmin=Min(x0,x1,x2); xmax=Max(x0,x1,x2); ymin=Min(y0,y1,y2); ymax=Max(y0,y1,y2); glColor3f(1.0f,0.0f,0.0f); glBegin(GL_POINTS); glVertex2d(x0,y0); glEnd(); glColor3f(0.0f,1.0f,0.0f); glBegin(GL_POINTS); glVertex2d(x1,y1); glEnd(); glColor3f(0.0f,0.0f,1.0f); glBegin(GL_POINTS); glVertex2d(x2,y2); glEnd(); for(float n=ymin;n<=ymax;n++) for(float m=xmin;m<xmax;m++) { a=((y1-y2)*m+(x2-x1)*n+x1*y2-x2*y1)/((y1-y2)*x0+(x2-x1)*y0+x1*y2-x2*y1); b=((y2-y0)*m+(x0-x2)*n+x2*y0-x0*y2)/((y2-y0)*x1+(x0-x2)*y1+x2*y0-x0*y2); c=((y0-y1)*m+(x1-x0)*n+x0*y1-x1*y0)/((y0-y1)*x2+(x1-x0)*y2+x0*y1-x1*y0); if(a>0 && b>0 && c>0) { float color0=a*1.0; float color1=b*1.0; float color2=c*1.0; glColor3f(color0,color1,color2); glBegin(GL_POINTS); glVertex2d(m,n); glEnd(); } } }void display(){/* clear all pixels */ glClear (GL_COLOR_BUFFER_BIT); glColor3f (1.0, 1.0, 1.0); glBegin(GL_POINTS); glVertex2d(x,y); 中间是点的坐标 glEnd(); */ /*下面的语句是画一个白色的正方形*/ if((y1-y0)/(x1-x0)<=1) { DrawLine1(x0,y0,x1,y1); } else { DrawLine2(x0,y0,x1,y1); } DrawTriangle(35,35,135,185,235,35);/* don't wait! * start processing buffered OpenGL routines */ glFlush ();}void init (void) {/* select clearing color */ glClearColor (0.0, 0.0, 0.0, 0.0);/* initialize viewing values */ glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0, 600, 0, 600);}/* * Declare initial window size, position, and display mode * (single buffer and RGBA). Open window with "hello" * in its title bar. Call initialization routines. * Register callback function to display graphics. * Enter main loop and process events. */int main(int argc, char** argv){ cout<<"input x0,y0,x1,y1 :"<<endl; cin>>x0>>y0>>x1>>y1; glutInit(&argc, argv); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); //设置窗口大小,以像素为单位 glutInitWindowSize (600, 600); glutInitWindowPosition (100, 100); glutCreateWindow ("hello");
希望能够帮助到你,望采纳,谢谢!