《基于MFC的OpenGL编程》Part 3 Drawing Simple 2D Shapes
剪裁区域
In OpenGL when you create a window to draw in we must specify the coordinate system we want to use and how to map the specified coordinates into physical screen coordinates. We would be using the 2D Cartesian coordinate system with the origin 0,0 at the centre of the screen. Before we can start plotting points, lines and shapes in a window we must also specify how to translate coordinate pairs into screen coordinates, by specifying the clipping area i.e the region of Cartesian space that occupies the window.
视口
The clipping area height and width will rarely match the width and height of the window in pixels. The coordinate system must therefore be mapped from logical Cartesian coordinates to physical screen coordinates. This mapping is specified by a setting known as the viewport, which is the region within the window's client area that is used for drawing the clipping area.
顶点和基本图元
A vertex is nothing more than a coordinate in 2D or 3D space. In both 2D and 3D, when we draw an object we compose it with several smaller shapes called primitives which as 1 or 2 dimensional entities such as points, lines, and polygons. Each corner of an object composed of primitives is a vertex
BOOL m_bLine; //Status of Line
BOOL m_bPolygon; //Status of Polygon
BOOL m_bTriangle; //Status of Triangle
2,并且加入四个菜单项及其对应的事件处理程序。
{//画点
m_bPoint = TRUE;
m_bLine = FALSE;
m_bPolygon = FALSE;
m_bTriangle = FALSE;
InvalidateRect(NULL,FALSE);
}
void CCY457OpenGLView::OnShapesLine()
{//画线
m_bPoint = FALSE;
m_bLine = TRUE;
m_bPolygon = FALSE;
m_bTriangle = FALSE;
InvalidateRect(NULL,FALSE);
}
void CCY457OpenGLView::OnShapesPolygon()
{//画多边形
m_bPoint = FALSE;
m_bLine = FALSE;
m_bPolygon = TRUE;
m_bTriangle = FALSE;
InvalidateRect(NULL,FALSE);
}
void CCY457OpenGLView::OnShapesTriangle()
{//画三角形
m_bPoint = FALSE;
m_bLine = FALSE;
m_bPolygon = FALSE;
m_bTriangle = TRUE;
InvalidateRect(NULL,FALSE);
}
3,修改第二篇文章中的OnSize()函数,因为本文中只绘制2维图形.
{
CView::OnSize(nType, cx, cy);
GLdouble aspect_ratio; // width/height ratio
if ( 0 >= cx || 0 >= cy )
{
return;
}
// select the full client area
::glViewport(0, 0, cx, cy);
// compute the aspect ratio
// this will keep all dimension scales equal
aspect_ratio = (GLdouble)cx/(GLdouble)cy;
// select the projection matrix and clear it
::glMatrixMode(GL_PROJECTION);
::glLoadIdentity();
// select the viewing volume
//::gluPerspective(45.0f, aspect_ratio, .01f, 200.0f);
::gluOrtho2D(-10.0f, 10.0f, -10.0f, 10.0f);
// switch back to the modelview matrix and clear it
::glMatrixMode(GL_MODELVIEW);
::glLoadIdentity();
}
{//绘制函数
if(m_bPoint==TRUE)
{
glPointSize(3.0f);
glBegin(GL_POINTS);
glVertex2f(0.0f,0.0f);
glVertex2f(1.0f,0.0f);
glVertex2f(0.0f,1.0f);
glEnd();
}
else if(m_bLine==TRUE)
{
glBegin(GL_LINES);
glVertex2f(0.0f,0.0f);
glVertex2f(1.0f,0.0f);
glEnd();
}
else if(m_bTriangle==TRUE)
{
glBegin(GL_TRIANGLES);
glVertex2f(0.0f,0.0f);
glVertex2f(2.0f,0.0f);
glVertex2f(0.0f,2.0f);
glEnd();
}
else if(m_bPolygon==TRUE)
{
glBegin(GL_POLYGON);
glVertex2f(0.0f,0.0f);
glVertex2f(3.0f,0.0f);
glVertex2f(4.0f,3.0f);
glVertex2f(1.5f,6.0f);
glVertex2f(-1.0f,3.0f);
glEnd();
}
}
作者:洞庭散人
出处:http://phinecos.cnblogs.com/
posted on 2008-11-05 15:07 Phinecos(洞庭散人) 阅读(9354) 评论(10) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述