精华内容
下载资源
问答
  • opengl 图形学 直线和多边形裁剪 C++
  • OpenGL 直线直线 直线和平面求交点

    千次阅读 2011-04-20 10:01:00
    OpenGL 直线直线 直线和平面求交点关于头文件myglbase.h 和 myglbase.cpp的链接http://blog.csdn.net/rorger/archive/2011/04/19/6334489.aspx或者点此下载:#include "myglbase.h" #include "iostream" using ...

                                  OpenGL 直线和直线   直线和平面求交点

    关于头文件myglbase.h 和 myglbase.cpp的链接

    http://blog.csdn.net/rorger/archive/2011/04/19/6334489.aspx

     

    或者点此下载:

    http://rorger.download.csdn.net/

     

    展开全文
  • MFC+OpenGL直线剪裁

    2017-11-08 16:35:22
    基于MFC+OpenGL直线剪裁小软件,在VS2013上编辑,使用编码剪裁算法,按'+'生成随机直线,然后用鼠标拖动画矩形框可以对直线进行剪裁。是我学习MFC做的第一个东西,可以参考之前博客学习MFC框架的使用以及菜单界面...
  • OpenGL直线剪裁

    2017-11-08 16:41:48
    这次是用MFC+OpenGL写的,代码没法全部贴上,上传到下载栏目里好了。点击打开下载链接(现在好像不能上传0积分下载的东西了QAQ)运行效果: 核心代码(剪裁的核心代码):int GraphyCut::getCode(const Point a...

    这次是用MFC+OpenGL写的,代码没法全部贴上,上传到下载栏目里好了。点击打开下载链接(现在好像不能上传0积分下载的东西了QAQ)


    运行效果:
    这里写图片描述
    这里写图片描述
    这里写图片描述


    核心代码(剪裁的核心代码):

    int GraphyCut::getCode(const Point a)       //得到编码
    {
        int code = 0;
        if (a.y > max(st.y, endd.y))
            code |= 8;
        if (a.y < min(st.y, endd.y))
            code |= 4;
        if (a.x > max(st.x, endd.x))
            code |= 2;
        if (a.x < min(st.x, endd.x))
            code |= 1;
        return code;
    }
    
    bool GraphyCut::isLinesAcross(const Line a, const Line b)       //跨立试验
    {
        int num1 = (a.b.x - a.a.x)*(b.a.y - a.a.y) - (a.b.y - a.a.y)*(b.a.x - a.a.x);
        int num2 = (a.b.x - a.a.x)*(b.b.y-a.a.y) - (a.b.y - a.a.y)*(b.b.x - a.a.x);
        if (num1/abs(num1)*num2 <= 0)       //这里不能用乘法计算,因为可能出现溢出(难查的bug)
            return true;
        return false;
    }
    
    bool GraphyCut::isRemain(Line &line)
    {
        int code1 = getCode(line.a);
        int code2 = getCode(line.b);
        if (code1 == 0 && code2 == 0)       //在中间,保留
            return true;
        else if (code1&code2)       //边界外,舍去
            return false;
        else if (!(isLinesAcross(line, Line(st, endd)) || isLinesAcross(line, Line(Point(st.x, endd.y), Point(endd.x, st.y)))))
        {
            //进行跨立试验,如果不通过则表示在框外
            return false;
        }
        else
        {
            if (fabs(line.a.x - line.b.x) <= 2)
            {
                if (line.a.y > max(st.y, endd.y))
                    line.a.y = max(st.y, endd.y);
                else if (line.a.y < min(st.y, endd.y))
                    line.a.y = min(st.y, endd.y);
    
                if (line.b.y > max(st.y, endd.y))
                    line.b.y = max(st.y, endd.y);
                else if (line.b.y < min(st.y, endd.y))
                    line.b.y = min(st.y, endd.y);
                return true;
            }
    
            do
            {
                if (code1 == 0 && code2 == 0)
                    break;
                int code = code1 == 0 ? code2 : code1;
                double x, y;
                if (code&1)
                {
                    y = line.a.y + (line.b.y - line.a.y)*(min(st.x,endd.x) - line.a.x) / (line.b.x - line.a.x);
                    x = (double)min(st.x,endd.x);
                }
                else if (code&2)
                {
                    y = line.a.y + (line.b.y - line.a.y)*(max(st.x,endd.x) - line.a.x) / (line.b.x - line.a.x);
                    x = (double)max(st.x,endd.x);
                }
                else if (code&4)
                {
                    x = line.a.x + (line.b.x - line.a.x)*(min(st.y,endd.y) - line.a.y) / (line.b.y - line.a.y);
                    y = (double)min(st.y,endd.y);
                }
                else if (code&8){
                    x = line.a.x + (line.b.x - line.a.x)*(max(st.y,endd.y) - line.a.y) / (line.b.y - line.a.y);
                    y = (double)max(st.y,endd.y);
                }
    
                if (code == code1)
                {
                    line.a.x = x;
                    line.a.y = y;
                    code1 = getCode(line.a);
                }
                else
                {
                    line.b.x = x;
                    line.b.y = y;
                    code2 = getCode(line.b);
                }
            } while (true);
            return true;
        }
    }
    
    void GraphyCut::CutLines()
    {
        for (int i = 0; i < lines.size(); i++)
        {
            if (!isRemain(lines[i]))
            {
                lines.erase(lines.begin() + i);
                i--;
            }
        }
    }
    展开全文
  • OpenGl绘制直线并且实现剪裁,在VC6.0环境下可以直接运行
  • opengl 直线拾取

    2013-05-22 11:25:00
    http://files.cnblogs.com/dragon2012/Opengl%E6%8B%BE%E5%8F%96.rar 贴上关键拾取函数代码 void WALL::pick(GLfloat xpos,GLfloat ypos) { xpos,ypos; GLint viewport[4]; GLdouble mvmatrix[16],...

    http://files.cnblogs.com/dragon2012/Opengl%E6%8B%BE%E5%8F%96.rar

     

    贴上关键拾取函数代码

     void WALL::pick(GLfloat xpos,GLfloat ypos)
    {
    xpos,ypos;
    GLint viewport[4];
    GLdouble mvmatrix[16],projmatrix[16];
    float realy;
    GLdouble wx,wy,wz;
    
    glGetIntegerv(GL_VIEWPORT,viewport);
    glGetDoublev(GL_MODELVIEW_MATRIX,mvmatrix);
    glGetDoublev(GL_PROJECTION_MATRIX,projmatrix);
    
    
    realy =ypos;
    printf("%f %f \n",xpos,realy);
    gluUnProject((GLdouble)xpos,(GLdouble)realy,0.0,mvmatrix,projmatrix,viewport,&wx,&wy,&wz);
    float g_nearxyz[3];
        g_nearxyz[0] = (GLfloat)wx;
    g_nearxyz[1] = (GLfloat)wy;
    g_nearxyz[2] = (GLfloat)wz;
    
    gluUnProject((GLdouble)xpos,(GLdouble)realy,1.0,mvmatrix,projmatrix,viewport,&wx,&wy,&wz);
    
    float g_farxyz[3];
        g_farxyz[0] = (GLfloat)wx;
    g_farxyz[1] = (GLfloat)wy;
    g_farxyz[2] = (GLfloat)wz;
    
    float m_fangxiang[3];
    
    for(int i=0 ;i<3 ;i++)
    {
    	m_fangxiang[i] =g_farxyz[i] -g_nearxyz[i];
    
    }
    float noml =1/sqrtf(m_fangxiang[0]*m_fangxiang[0]+m_fangxiang[1]*m_fangxiang[1]+m_fangxiang[2]*m_fangxiang[2]);
    for(int i=0 ;i<3 ;i++)
    {
    	m_fangxiang[i]*=noml;
    }
    
    	
    float distens =-g_nearxyz[1]/m_fangxiang[1];
    float onefangxiang[3];
    for(int i=0; i<3 ;i++)
    {
    	onefangxiang[i] =distens*m_fangxiang[i]+g_nearxyz[i];
    
    }
    
    for(int i=0 ;i<400 ;i++)
    {
    	pic[i].select =false;
    	if(abs(onefangxiang[0]-pic[i].x)<4&&abs(onefangxiang[2]-pic[i].y)<4)
    	{
    		pic[i].select =true;
    	}
    
    
    
    
    }
    //printf("%f  %f %f \n",onefangxiang[0],onefangxiang[1],onefangxiang[2]);
    
    //printf("line:%f,%f ,%f --->%f ,%f,%f\n",g_nearxyz[0],g_nearxyz[1],g_nearxyz[2],g_farxyz[0],g_farxyz[1],g_farxyz[2]);
    
    }
    

     

     

    转载于:https://www.cnblogs.com/dragon2012/archive/2013/05/22/3092434.html

    展开全文
  • OpenGL直线拾取

    2013-05-22 11:23:37
    void WALL::pick(GLfloat xpos,GLfloat ypos) { xpos,ypos; GLint viewport[4]; GLdouble mvmatrix[16],projmatrix[16]; float realy; GLdouble wx,wy,wz;...glGetIntegerv(GL_VIEWPORT,viewport);...
     void WALL::pick(GLfloat xpos,GLfloat ypos)
    {
    xpos,ypos;
    GLint viewport[4];
    GLdouble mvmatrix[16],projmatrix[16];
    float realy;
    GLdouble wx,wy,wz;
    
    glGetIntegerv(GL_VIEWPORT,viewport);
    glGetDoublev(GL_MODELVIEW_MATRIX,mvmatrix);
    glGetDoublev(GL_PROJECTION_MATRIX,projmatrix);
    
    
    realy =ypos;
    printf("%f %f \n",xpos,realy);
    gluUnProject((GLdouble)xpos,(GLdouble)realy,0.0,mvmatrix,projmatrix,viewport,&wx,&wy,&wz);
    float g_nearxyz[3];
        g_nearxyz[0] = (GLfloat)wx;
    g_nearxyz[1] = (GLfloat)wy;
    g_nearxyz[2] = (GLfloat)wz;
    
    gluUnProject((GLdouble)xpos,(GLdouble)realy,1.0,mvmatrix,projmatrix,viewport,&wx,&wy,&wz);
    
    float g_farxyz[3];
        g_farxyz[0] = (GLfloat)wx;
    g_farxyz[1] = (GLfloat)wy;
    g_farxyz[2] = (GLfloat)wz;
    
    float m_fangxiang[3];
    
    for(int i=0 ;i<3 ;i++)
    {
    	m_fangxiang[i] =g_farxyz[i] -g_nearxyz[i];
    
    }
    float noml =1/sqrtf(m_fangxiang[0]*m_fangxiang[0]+m_fangxiang[1]*m_fangxiang[1]+m_fangxiang[2]*m_fangxiang[2]);
    for(int i=0 ;i<3 ;i++)
    {
    	m_fangxiang[i]*=noml;
    }
    
    	
    float distens =-g_nearxyz[1]/m_fangxiang[1];
    float onefangxiang[3];
    for(int i=0; i<3 ;i++)
    {
    	onefangxiang[i] =distens*m_fangxiang[i]+g_nearxyz[i];
    
    }
    
    for(int i=0 ;i<400 ;i++)
    {
    	pic[i].select =false;
    	if(abs(onefangxiang[0]-pic[i].x)<4&&abs(onefangxiang[2]-pic[i].y)<4)
    	{
    		pic[i].select =true;
    	}
    
    
    
    
    }
    //printf("%f  %f %f \n",onefangxiang[0],onefangxiang[1],onefangxiang[2]);
    
    //printf("line:%f,%f ,%f --->%f ,%f,%f\n",g_nearxyz[0],g_nearxyz[1],g_nearxyz[2],g_farxyz[0],g_farxyz[1],g_farxyz[2]);
    
    }

    展开全文
  • CS算法简单易实现,通过将包括裁剪窗口在内的区域...后为0,此时则根据编码来分别用y=ymin等直线求交后选择求交或保留 但是这个算法的主要问题是,在某些复杂的情况,要进行四次乘法和除法,而且在没有交点的...
  • opengl 直线裁剪Cohen-Sutherland算法

    千次阅读 2016-11-11 18:47:57
    #include #include ...第二步: 创建3条直线,一个穿过裁剪区域,一个在裁剪区域内,一个在裁剪区域外。 第三部:注册键盘事件,即回车调用裁剪函数,裁剪部分转换为红色。 效果图:
  • 1.Bresenham.cpp #include #include void Bres_Line(int x1, int y1, int x2, int y2) { glColor3f(0.0f, 0.0f, 1.0f);//设置颜色,蓝色 glPointSize...//处理永不结束的循环监听 } 以上是Opengl的学习笔记,仅供参考呀
  • opengl 直线的线型(各种虚线)

    千次阅读 2012-09-12 22:04:02
    除了直线的宽度可以根据需要进行改变外,直线的线型也可以改变。glLineStipple就可以提供不同于常规的连续线段的中心线、虚线、点划线等等。其函数原型如下   void glLineStipple(  GLint factor,  GLushort ...
  • opengl直线

    2016-01-06 01:48:57
    opengl直线原理及方法,里面大多属于基础知识,自学起来方便好用。
  • OpenGL动态直线

    2013-11-13 11:24:02
    采用OpenGL画出动态的直线直线一直在旋转
  • OpenGL直线生成算法DDA+Bresenham

    千次阅读 2016-09-20 22:20:57
    OpenGL 直线生成算法 DDA + Bresenham
  • openGL直线 代码

    2011-12-25 22:51:42
    基于openGL的画直线的c语言代码
  • opengl直线和圆

    2019-01-21 16:08:01
    实现了MFC框架下,基于opengl的DDA直线生成算法以及Bresenham圆弧生成算法。
  • OpenGL 渲染直线

    2021-08-10 14:13:18
    说明 渲染线段的时候指定使用GL_LINES,而不是GL_LINE,线段的宽度跟点的尺寸一样,都有一个最大的限制,如果要渲染一条100像素宽的线段只能够采用渲染填充矩形的方式 代码 #include <windows.h>...
  • opengl实现直线裁剪

    热门讨论 2012-10-16 11:56:22
    下面的程序段在windows控制台下实现按住鼠标右键绘制一个矩形,按住鼠标左键,绘制直线段,并利用Cohen-Sutherland算法实现直线裁剪。
  • opengl绘制直线的源代码,两点坐标可以自己输入更改
  • OpenGL直线 WIN7 VS2012

    2013-10-10 01:05:14
    OpenGL直线 WIN7 VS2012
  • OpenGL直线算法

    2012-10-10 14:11:55
    计算机图形学在OpenGL上画直线的算法,绝对可行
  • OpenGL绘制直线

    万次阅读 2017-11-10 15:18:11
    // opengl_ animationRect_0002 // // Created by ch_soft on 12-1-16. // Copyright (c) 2012年 __MyCompanyName__. All rights reserved. // #include #include #include #include //用于绘制窗口需要的
  • 源_opengl_直线_源码

    2021-10-01 15:56:17
    掌握OpenGL绘制三维曲线的基本步骤。掌握de Casteljau算法。实验内容(必做)在屏幕上绘制以P0(1010)P1(4896)P2(120120)P3(21672)为控制顶点的Bezier曲线先绘制控制多边形再用分段直线段绘制Bezier曲线.(选做)实现...
  • opengl实现直线扫描和区域填充
  • 本文实例为大家分享了opengl实现直线扫描算法和区域填充算法,供大家参考,具体内容如下 总体介绍 1、采用直线扫描算法绘制一条线段,直线由离散点组成 2、利用区域填充算法绘制多边形区域,区域由离散点组成 开发...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,300
精华内容 2,920
关键字:

opengl直线