⑴ 在线等opengl程序 。要求是用鼠标取两个点,然后用bresenham算法自动连成一条线。要可以运行的程序!!!
// 6.Bresenham画线算法.cpp
#pragma comment(lib, "openGL32.lib")
#pragma comment(lib, "glu32.lib")
#pragma comment(lib, "glaux.lib")
#include<iostream.h> // cout,cin
#include<math.h> // abs
#define GLUT_DISABLE_ATEXIT_HACK
#include<glut.h>
int x0,y01,xEnd,yEnd; // 全局变量(y0与math.h中的变量重名,故用y01代替)
int width=400,height=400;
void setPixel(GLint x,GLint y) // OpenGL画点函数
{
glBegin(GL_POINTS); // 开始画点
glVertex2i(x,y); // 根据2个整型值画1个点
glEnd(); // 结束画点
}
void lineBresenham()
{ // Bresenham画线算法。其中x0,y01,xEnd,yEnd是全局变量
int dx=xEnd-x0,dy=yEnd-y01; // Δx,Δy
int x,y,p;
int twoDy,twoDyMinusDx,twoDyAddDx; // 2Δy,2(Δy-Δx)
glClear(GL_COLOR_BUFFER_BIT); // 清除原显示窗口,让新显示窗口出现(颜色缓存)
if(dy==0) // m=0,水平线,x坐标每次增1,y不变
{
if(x0>xEnd) // (x0,y01)为右端点
{ // 交换两端的坐标,并令(x,y01)指示左端点
x=xEnd;
xEnd=x0;
x0=x;
}
else // (x0,y01)为左端点
x=x0; // 令(x,y01)指示左端点
while(x<=xEnd)
{
setPixel(x,y01);
x++;
}
}
else if(dx==0) // m=∞,垂直线,y坐标每次增1,x不变
{
if(y01>yEnd) // (x0,y01)为下端点
{ // 交换两端的坐标,并令(x0,y)指示上端点
y=yEnd;
yEnd=y01;
y01=y;
}
else // (x0,y01)为上端点
y=y01; // 令(x0,y)指示上端点
while(y<=yEnd)
{
setPixel(x0,y);
y++;
}
}
else if(dx==dy) // 45度(撇),m=1,x、y坐标每次各增1
{
if(x0>xEnd) // (x0,y01)为右端点
{ // 交换两端的坐标,并令(x,y)指示左端点
x=xEnd;
y=yEnd;
xEnd=x0;
yEnd=y01;
x0=x;
y01=y;
}
else // (x0,y01)为左端点
{ // 令(x,y)指示左端点
x=x0;
y=y01;
}
while(x<=xEnd)
{
setPixel(x,y);
x++;
y++;
}
}
else if(dx==-dy) // -45度(捺),m=-1,x坐标每次增1,y坐标每次减1
{
if(x0>xEnd) // (x0,y01)为右端点
{ // 交换两端的坐标,并令(x,y)指示左端点
x=xEnd;
y=yEnd;
xEnd=x0;
yEnd=y01;
x0=x;
y01=y;
}
else // (x0,y01)为左端点
{ // 令(x,y)指示左端点
x=x0;
y=y01;
}
while(x<=xEnd)
{
setPixel(x,y);
x++;
y--;
}
}
else if(abs(dx)>abs(dy)) // 0<|m|<1.0,x坐标每次增1
{
if(x0>xEnd) // (x0,y01)为右端点
{ // 交换两端的坐标,并令(x,y)指示左端点
x=xEnd;
y=yEnd;
xEnd=x0;
yEnd=y01;
x0=x;
y01=y;
dx=-dx; // Δx
dy=-dy; // Δy
}
else // (x0,y01)为左端点
{ // 令(x,y)指示左端点
x=x0;
y=y01;
}
twoDy=2*dy; // 2Δy
twoDyMinusDx=2*(dy-dx); // 2(Δy-Δx)
twoDyAddDx=2*(dy+dx); // 2(Δy+Δx)
if(dy>0) // 0<m<1.0
{
p=2*dy-dx; // p0=2Δy-Δx
while(x<=xEnd)
{
setPixel(x,y);
x++;
if(p<0)
p+=twoDy;
else
{
y++;
p+=twoDyMinusDx;
}
}
}
else // -1<m<0
{
p=2*dy+dx; // p0=2Δy+Δx
while(x<=xEnd)
{
setPixel(x,y);
x++;
if(p<0)
{
y--;
p+=twoDyAddDx;
}
else
p+=twoDy;
}
}
}
else if(abs(dx)<abs(dy)) // 1.0<|m|<∞,y坐标每次增1
{
if(y01>yEnd) // (x0,y01)为下端点
{ // 交换两端的坐标,并令(x,y)指示上端点
x=xEnd;
y=yEnd;
xEnd=x0;
yEnd=y01;
x0=x;
y01=y;
dx=-dx; // Δx
dy=-dy; // Δy
}
else // (x0,y01)为上端点
{ // 令(x,y)指示上端点
x=x0;
y=y01;
}
twoDy=2*dx; // 2Δx
twoDyMinusDx=2*(dx-dy); // 2(Δx-Δy)
twoDyAddDx=2*(dx+dy); // 2(Δx+Δy)
if(dx>0) // 1.0<m<∞
{
p=2*dx-dy; // p0=2Δx-Δy
while(y<=yEnd)
{
setPixel(x,y);
y++;
if(p<0)
p+=twoDy;
else
{
x++;
p+=twoDyMinusDx;
}
}
}
else // -1<m<0
{
p=2*dx+dy; // p0=2Δx+Δy
while(y<=yEnd)
{
setPixel(x,y);
y++;
if(p<0)
{
x--;
p+=twoDyAddDx;
}
else
p+=twoDy;
}
}
}
glFlush(); // 尽可能快地处理画图
}
void main(int argc,char** argv) // 可不输入参数
{
cout<<"请输入x0 y0 xEnd yEnd:"<<endl;
cin>>x0>>y01>>xEnd>>yEnd;
glutInit(&argc,argv); // 初始化GLUT
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); // 设置窗口的缓存和颜色模型
glutInitWindowPosition(0,0); // 设置窗口左上角的坐标(在屏幕左上角)
glutInitWindowSize(width,height); // 设置窗口的大小
glutCreateWindow("画线算法1"); // 创建窗口,并在标题栏显示字符串
glClearColor(1.0, 1.0, 1.0, 0.0); // 设置白色背景(R,G,B,透明),默认为黑色
glColor3f(1.0, 0.0, 0.0); // 用3个浮点数表示前景色(红),默认为白色
glMatrixMode(GL_PROJECTION); // 对三维图形作正投影
glLoadIdentity(); // 初始化模型变换矩阵
gluOrtho2D(0.0,width,0.0,height); // 二维笛卡尔坐标系,x和y的起止坐标
glutDisplayFunc(lineBresenham); // 显示画线函数lineBresenham()
glutMainLoop(); // 程序的最后一个函数,激活窗口及图形。使程序进入检查鼠标键盘的循环中
}
⑵ mfc中opengl画线问题
首先搭建MFC融合OpenGL的框架,比较复杂,见如下教程:
http://www.cnblogs.com/yanhuiw/archive/2010/08/06/1794462.html
要注意MFC单文档下的OpenGL刷新问题,见如下问答:
http://..com/question/149898045.html&__bd_tkn__=06ffaccbdc8d0ccd3427f44eaf
然后考虑MFC结合OpenGL交互式画线,见如下教程:
http://pcodenote.com/study-note/opengl-study-drawline/
将其中OpenGL交互操作部分改为MFC的交互操作即可,例如GLUT_LEFT_BUTTON改为OnLButtonDown的鼠标左键单击事件响应,GLUT_RIGHT_BUTTON改为OnRButtonDown的鼠标右键单击事件响应等等。
按照如上方式仔细学习尝试,肯定可以解决此问题。
⑶ opengl怎么实现鼠标拖拽着画直线
添加鼠标响应事件,用于触发旋转;
添加定时器(也可以在opengl的循环中)累加旋转量;
坐标旋转(glrotate)
⑷ opengl DDA 算法程序 为什画出的直线断断续续的
DDA是用好多点来表示的直线。。。
⑸ 如何在openGL的视图中用鼠标交互画线
这个需要进行点击测试,即输入一个二维屏幕坐标,返回一个三维点坐标,然后用两个三维点坐标画线。伪代码:
Point2
p1,
p2;
Vector3
pt1
=
HitTest(p1);
Vector3
pt2
=
HitTest(p2);
glBegin(
GL_LINE_STRIP);
glVertex3d(pt1.x,
pt1.y,
pt1.z);...
⑹ C++ 中OpenGL 画线的实现
问题应该就在lz贴出的这段代码中
lz设的是双缓存glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB)
用的却是glFlush,当然会出不来
在双缓存模式下应该用glutSwapBuffers
在单缓存模式下用glFlush
相互配套应该就能出来了
⑺ opengl交互画线程序代码
用两个全局变量point型的
保存第一个点 等待点击第二个点,然后画一条线
⑻ 怎么在opengl中画直线
#include <iostream>
#include <windows.h>
#include <GL/glut.h>
using namespace std ;
void init(void)
{
glClearColor(0.0, 0.0, 0.0, 0.0) ;
glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0) ;
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT) ;
glColor3f(1.0, 1.0, 1.0) ;
glBegin(GL_LINES) ;
glVertex3f(0.25, 0.25, 0.0) ;
glVertex3f(0.75, 0.25, 0.0) ;
glEnd() ;
glFlush() ;
}
int main(int argc, char **argv)
{
glutInit(&argc, argv) ;
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB) ;
glutInitWindowSize(200, 200) ;
glutCreateWindow("I love OpenGl") ;
init() ;
glutDisplayFunc(display) ;
glutMainLoop() ;
return 0 ;
}
⑼ Bresenham openGL画线算法
建议把环境配置的语句弄上来,画不出来不一定是算法问题。OPENGL有很多错误都是黑屏,看不到想要的画面
⑽ android opengl怎么画虚线
在OpenGL中画线是可以完全的控制,比如画虚线,用函数glLineStipple就可以控制画线的模式:
函数glLineStipple有两个参数,第一个是重复的次数,第二个是用一个16-bit的数来控制,0表示不画,1表示画;比如0000111100001111=0x0F0F表示“ — —”这个模式。
glLineWidth (1.0);
glLineStipple (1, 0x0F0F);
glBegin(GL_LINES);
glVertex2f (0.0,0.0); glVertex2f (100.0,100.0);
glEnd();
画出来的就是虚线。