基於opengl的RoundBox繪製

來源:互聯網
上載者:User

實現了16種roundBox,見圖

 

核心繪製碼在RoundBox.h檔案:

 #ifndef ROUNDBOXRENDER_H<br />#define ROUNDBOXRENDER_H<br />// 7/8/2010 RYF<br />// QQ: 546952710<br />// Email: dizuo@126.com<br />struct RoundBoxRender<br />{<br />// 產生一個漸層的效果:<br />//shadetop疊加top<br />//shadedown疊加到down 可以為負<br />//rad為圓角的半徑<br />/* linear horizontal shade within button or in outline */<br />/* view2d scrollers use it */<br />static void gl_round_box_shade(int mode, float minx, float miny, float maxx, float maxy, float rad, float shadetop, float shadedown)<br />{<br />float vec[7][2]= {{0.195, 0.02}, {0.383, 0.067}, {0.55, 0.169}, {0.707, 0.293},<br />{0.831, 0.45}, {0.924, 0.617}, {0.98, 0.805}};<br />float div= maxy-miny;<br />float coltop[3], coldown[3], color[4];<br />int a;<br />/* mult */<br />for(a=0; a<7; a++) {<br />vec[a][0]*= rad; vec[a][1]*= rad;<br />}<br />/* get current color, needs to be outside of glBegin/End */<br />glGetFloatv(GL_CURRENT_COLOR, color);<br />/* 'shade' defines strength of shading */<br />coltop[0]= color[0]+shadetop; if(coltop[0]>1.0) coltop[0]= 1.0;<br />coltop[1]= color[1]+shadetop; if(coltop[1]>1.0) coltop[1]= 1.0;<br />coltop[2]= color[2]+shadetop; if(coltop[2]>1.0) coltop[2]= 1.0;<br />coldown[0]= color[0]+shadedown; if(coldown[0]<0.0) coldown[0]= 0.0;<br />coldown[1]= color[1]+shadedown; if(coldown[1]<0.0) coldown[1]= 0.0;<br />coldown[2]= color[2]+shadedown; if(coldown[2]<0.0) coldown[2]= 0.0;<br />glShadeModel(GL_SMOOTH);<br />glBegin(mode);<br />/* start with corner right-bottom */<br />if(roundboxtype & 4) {<br />round_box_shade_col(coltop, coldown, 0.0);<br />glVertex2f(maxx-rad, miny);<br />for(a=0; a<7; a++) {<br />round_box_shade_col(coltop, coldown, vec[a][1]/div);<br />glVertex2f(maxx-rad+vec[a][0], miny+vec[a][1]);<br />}<br />round_box_shade_col(coltop, coldown, rad/div);<br />glVertex2f(maxx, miny+rad);<br />}<br />else {<br />round_box_shade_col(coltop, coldown, 0.0);<br />glVertex2f(maxx, miny);<br />}<br />/* corner right-top */<br />if(roundboxtype & 2) {<br />round_box_shade_col(coltop, coldown, (div-rad)/div);<br />glVertex2f(maxx, maxy-rad);<br />for(a=0; a<7; a++) {<br />round_box_shade_col(coltop, coldown, (div-rad+vec[a][1])/div);<br />glVertex2f(maxx-vec[a][1], maxy-rad+vec[a][0]);<br />}<br />round_box_shade_col(coltop, coldown, 1.0);<br />glVertex2f(maxx-rad, maxy);<br />}<br />else {<br />round_box_shade_col(coltop, coldown, 1.0);<br />glVertex2f(maxx, maxy);<br />}<br />/* corner left-top */<br />if(roundboxtype & 1) {<br />round_box_shade_col(coltop, coldown, 1.0);<br />glVertex2f(minx+rad, maxy);<br />for(a=0; a<7; a++) {<br />round_box_shade_col(coltop, coldown, (div-vec[a][1])/div);<br />glVertex2f(minx+rad-vec[a][0], maxy-vec[a][1]);<br />}<br />round_box_shade_col(coltop, coldown, (div-rad)/div);<br />glVertex2f(minx, maxy-rad);<br />}<br />else {<br />round_box_shade_col(coltop, coldown, 1.0);<br />glVertex2f(minx, maxy);<br />}<br />/* corner left-bottom */<br />if(roundboxtype & 8) {<br />round_box_shade_col(coltop, coldown, rad/div);<br />glVertex2f(minx, miny+rad);<br />for(a=0; a<7; a++) {<br />round_box_shade_col(coltop, coldown, (rad-vec[a][1])/div);<br />glVertex2f(minx+vec[a][1], miny+rad-vec[a][0]);<br />}<br />round_box_shade_col(coltop, coldown, 0.0);<br />glVertex2f(minx+rad, miny);<br />}<br />else {<br />round_box_shade_col(coltop, coldown, 0.0);<br />glVertex2f(minx, miny);<br />}<br />glEnd();<br />glShadeModel(GL_FLAT);<br />}<br />static void setType(int nType){<br />roundboxtype = nType % 16;<br />}<br />protected:<br />static void round_box_shade_col(float *col1, float *col2, float fac)<br />{<br />float col[3];<br />col[0]= (fac*col1[0] + (1.0-fac)*col2[0]);<br />col[1]= (fac*col1[1] + (1.0-fac)*col2[1]);<br />col[2]= (fac*col1[2] + (1.0-fac)*col2[2]);<br />glColor3fv(col);<br />}<br />static int roundboxtype;<br />};<br />int RoundBoxRender::roundboxtype = 3;<br />#endif

gl_round_box_shade中mode支援:GL_LINE_LOOP,GL_POLYGON,GL_TRIANGLE_FAN

round_box_shade_col:col1顏色和col2顏色,根據混合因子fac進行混合,產生中間顏色。

 

主程式基於glut:

#include <cstdio><br />#include <cstdlib><br />#include <GL/glut.h><br />#include <cmath><br />#include <ctime><br />//#include "BezierLinkRender.h"<br />#include "RoundBoxRender.h"<br />//////////////////////////////////////////////////<br />//global<br />GLuint gColorStable[] =<br />{<br />(0xFF0000),//red<br />(0xDC143C),//crimson<br />(0x9400D3),//violet<br />(0xFFA000),//orange<br />(0xFFFF00),//yellow<br />(0xFFD700),//glod<br />(0x00FF00),//green<br />(0x90FF90),//lightgreen<br />(0x006400),//darkgreen<br />(0x556B2F),//olivegreen//very good color綠橄欖<br />(0x0000FF),//blue<br />(0x00008B),//darkblue<br />(0x4169E1),//royalblue<br />(0x5555FF),//skyblue<br />(0x191970),//midnightbue<br />(0xFF00FF),//fuchsia<br />(0x00FFFF),//aqua<br />(0xffb6c1),//pink<br />(0xFF91A4),//salmonpink<br />(0x30D5C8),//turquoise<br />(0x008080),//darkturpuoise<br />(0xA9A9A9),//gray<br />(0xD3D3D3),//lightgray<br />(0x808080)//darkgray<br />};<br />float g_fWidth = 500;<br />float g_fHeight = 500;<br />float g_fDepth = 100;<br />float g_fAngle = .0;<br />intgRoundboxtype = 0;<br />//////////////////////////////////////////////////////////////////////////<br />void renderBitmapString2D(float x, float y, void *font, char *string);<br />void getColorFromTable(GLuint rgb, float vec[3]);<br />void init(void)<br />{<br />RoundBoxRender::setType(gRoundboxtype);<br />printf("%d/n", gRoundboxtype);<br />glClearColor (0.9, 0.9, 0.9, 0.0);<br />glShadeModel (GL_SMOOTH);<br />}<br />void display(void)<br />{<br />const float slotSize = 30.f;<br />const float slotColor[] = {0.8f, 0.8f, 0.8f};<br />const float slotShadowSize = 2.0f;<br />const float slotShadowAlpha = 0.7;<br />glClear (GL_COLOR_BUFFER_BIT);<br />glColor3f (1.0, 1.0, 1.0);<br />glMatrixMode(GL_PROJECTION);<br />glLoadIdentity();<br />glOrtho(0, g_fWidth, 0, g_fHeight, 0, g_fDepth);<br />glMatrixMode(GL_MODELVIEW);<br />glLoadIdentity();<br />glTranslatef(80.f, 80.f, 0.f);//整體平移</p><p>int xPos(0);<br />int yPos(0);<br />int xOffset(0);<br />int yOffset(0);<br />for (int i=0; i<16; i++)<br />{<br />char buffer[10] = {'/0'};<br />itoa (i,buffer,10);<br />int fontWidOffset = i>10 ? 12 : 5;//估算量<br />int fontHghOffset = 10;//估算量<br />int boxSize = 60;</p><p>float colorVec[3];<br />getColorFromTable(gColorStable[i], colorVec);<br />glColor3fv(colorVec);<br />RoundBoxRender::setType(i);<br />yOffset = i/4;<br />xOffset = i%4;<br />glPushMatrix();<br />{<br />glTranslatef(xPos+xOffset*100, yPos+yOffset*100, 0.f);<br />RoundBoxRender::gl_round_box_shade(GL_POLYGON, 0, 0, boxSize, boxSize, 10, 0.3, 0);<br />glColor3f(0.f, 0.f, 0.0f);<br />renderBitmapString2D(boxSize/2-fontWidOffset, boxSize/2-fontHghOffset, GLUT_BITMAP_TIMES_ROMAN_24, buffer);<br />}glPopMatrix();<br />}<br />//glColor3f(1.0f, 1.0f, 0.0f);<br />//ui_draw_link_bezier(&gRect);<br />glutSwapBuffers();<br />}<br />void reshape (int w, int h)<br />{<br />glViewport (0, 0, (GLsizei) w, (GLsizei) h);<br />glMatrixMode (GL_PROJECTION);<br />glLoadIdentity ();<br />gluPerspective(60,1.0,1.5,20);<br />glMatrixMode (GL_MODELVIEW);<br />}<br />void keyboard(unsigned char key, int x, int y)<br />{<br />switch (key)<br />{<br />case 27:<br />exit(0);<br />break;<br />}<br />glutPostRedisplay();<br />}<br />void mouse(int button, int state, int x, int y)<br />{<br />if(button==GLUT_LEFT_BUTTON)<br />switch(state)<br />{<br />case GLUT_DOWN:<br />break;<br />case GLUT_UP:<br />break;<br />}<br />glutPostRedisplay();<br />}<br />int main(int argc, char** argv)<br />{<br />glutInit(&argc, argv);<br />glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);<br />glutInitWindowSize (500, 500);<br />glutInitWindowPosition (100, 100);<br />glutCreateWindow (argv[0]);<br />init ();<br />glutDisplayFunc(display);<br />glutReshapeFunc(reshape);<br />glutKeyboardFunc(keyboard);<br />glutMouseFunc( mouse );<br />glutMainLoop();<br />return 0;<br />}<br />void renderBitmapString2D(float x, float y, void *font, char *string)<br />{<br />char *c;<br />// set position to start drawing fonts<br />glRasterPos2f(x, y);<br />// loop all the characters in the string<br />for (c=string; *c != '/0'; c++) {<br />glutBitmapCharacter(font, *c);<br />}<br />}<br />void getColorFromTable(GLuint rgb, float vec[3])<br />{<br />GLubyte r = GLubyte ((rgb >> 16) & 0xFF);<br />GLubyte g = GLubyte ((rgb >> 8) & 0xFF);<br />GLubyte b = GLubyte (rgb & 0xFF);<br />vec[0] = r / 255.0f;<br />vec[1] = g / 255.0f;<br />vec[2] = b / 255.0f;<br />}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.