线框多边形

线框多边形


更多有趣示例 尽在 知屋安砖社区

示例

在这里插入图片描述

HTML



CSS

body {
  background: #111;
  margin: 0;
  padding: 0;
}


canvas { width: 100%; height: 100% }

JS

var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera( 75, window.innerWidth/window.innerHeight, 0.6, 100000 );


var renderer = new THREE.WebGLRenderer();
renderer.setSize( window.innerWidth, window.innerHeight );
document.body.appendChild( renderer.domElement );


var pointLight = new THREE.PointLight( 0xFF00FF, 2);
pointLight.position.set( 200, 250, 600 );
pointLight.castShadow = true;
scene.add( pointLight );


var controls = new THREE.OrbitControls( camera, renderer.domElement );


var geometry = new THREE.CylinderGeometry( 10, 10, 6, 8, 2 );
var material = new THREE.MeshBasicMaterial( { color: 0xffff00, wireframe: true } );
var cube = new THREE.Mesh( geometry, material );
scene.add( cube );


camera.position.z = 50;
controls.update();


var animate = function () {
  requestAnimationFrame( animate );
  renderer.render( scene, camera );
  controls.update();
};


animate();

这里提供一个基于OpenGL和GLUT的简单程序,实现了画直线、画多边形、画圆、画字符、多边形填充、图形裁剪和图形的几何变换,并带有菜单界面,可以根据需要进行修改和扩展。 ```c++ #include <GL/glut.h> // 存储多边形顶点的数组 GLfloat vertices[][3] = { {-1.0,-1.0,-1.0},{1.0,-1.0,-1.0}, {1.0,1.0,-1.0},{-1.0,1.0,-1.0}, {-1.0,-1.0,1.0},{1.0,-1.0,1.0}, {1.0,1.0,1.0},{-1.0,1.0,1.0} }; // 存储多边形的面的索引 GLint faces[][4] = { {0,1,2,3},{4,5,6,7},{0,4,5,1}, {1,5,6,2},{2,6,7,3},{3,7,4,0} }; // 定义菜单项的ID enum MENU_ID { MENU_LINE = 1, MENU_POLYGON, MENU_CIRCLE, MENU_FILL, MENU_CLIP, MENU_TRANSLATE, MENU_ROTATE, MENU_SCALE, MENU_EXIT }; // 定义多边形的填充模式 enum POLYGON_MODE { POLYGON_FILL, POLYGON_LINE }; // 当前多边形的填充模式 POLYGON_MODE polygon_mode = POLYGON_FILL; // 定义图形的裁剪范围 GLfloat clip_xmin = -0.5, clip_xmax = 0.5, clip_ymin = -0.5, clip_ymax = 0.5; // 定义图形的平移、旋转和缩放参数 GLfloat translate_x = 0.0, translate_y = 0.0, translate_z = 0.0; GLfloat rotate_x = 0.0, rotate_y = 0.0, rotate_z = 0.0; GLfloat scale_x = 1.0, scale_y = 1.0, scale_z = 1.0; // 绘制一个直线 void drawLine() { glBegin(GL_LINES); glVertex2f(-0.5, 0.0); glVertex2f(0.5, 0.0); glEnd(); } // 绘制一个多边形 void drawPolygon() { int i, j; glBegin(GL_POLYGON); for (i = 0; i < 6; i++) { for (j = 0; j < 4; j++) { glVertex3fv(vertices[faces[i][j]]); } } glEnd(); } // 绘制一个圆 void drawCircle() { GLfloat radius = 0.5; GLfloat angle; int i; glBegin(GL_POLYGON); for (i = 0; i < 360; i++) { angle = i * 3.1415926 / 180; glVertex2f(radius*cos(angle), radius*sin(angle)); } glEnd(); } // 绘制一个字符 void drawText() { char* str = "Hello, OpenGL!"; glRasterPos2f(-0.5, 0.0); while (*str) { glutBitmapCharacter(GLUT_BITMAP_HELVETICA_18, *str++); } } // 绘制一个填充的多边形 void drawFilledPolygon() { int i, j; glBegin(GL_POLYGON); for (i = 0; i < 6; i++) { for (j = 0; j < 4; j++) { glVertex3fv(vertices[faces[i][j]]); } } glEnd(); } // 绘制一个线框多边形 void drawWireframePolygon() { int i, j; glBegin(GL_LINES); for (i = 0; i < 6; i++) { for (j = 0; j < 4; j++) { glVertex3fv(vertices[faces[i][j]]); glVertex3fv(vertices[faces[i][(j + 1) % 4]]); } } glEnd(); } // 绘制图形 void draw() { glClear(GL_COLOR_BUFFER_BIT); // 应用图形变换 glTranslatef(translate_x, translate_y, translate_z); glRotatef(rotate_x, 1.0, 0.0, 0.0); glRotatef(rotate_y, 0.0, 1.0, 0.0); glRotatef(rotate_z, 0.0, 0.0, 1.0); glScalef(scale_x, scale_y, scale_z); // 绘制图形 switch (polygon_mode) { case POLYGON_FILL: drawFilledPolygon(); break; case POLYGON_LINE: drawWireframePolygon(); break; } glFlush(); } // 处理菜单事件 void menu(int id) { switch (id) { case MENU_LINE: glutDisplayFunc(drawLine); break; case MENU_POLYGON: glutDisplayFunc(drawPolygon); break; case MENU_CIRCLE: glutDisplayFunc(drawCircle); break; case MENU_FILL: polygon_mode = POLYGON_FILL; glutPostRedisplay(); break; case MENU_CLIP: glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(clip_xmin, clip_xmax, clip_ymin, clip_ymax); glMatrixMode(GL_MODELVIEW); glutPostRedisplay(); break; case MENU_TRANSLATE: translate_x += 0.1; glutPostRedisplay(); break; case MENU_ROTATE: rotate_z += 10.0; glutPostRedisplay(); break; case MENU_SCALE: scale_x *= 1.2; scale_y *= 1.2; glutPostRedisplay(); break; case MENU_EXIT: exit(0); break; } } // 初始化OpenGL void init() { glClearColor(0.0, 0.0, 0.0, 0.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(-1.0, 1.0, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); // 创建菜单 glutCreateMenu(menu); glutAddMenuEntry("Draw Line", MENU_LINE); glutAddMenuEntry("Draw Polygon", MENU_POLYGON); glutAddMenuEntry("Draw Circle", MENU_CIRCLE); glutAddMenuEntry("Fill Polygon", MENU_FILL); glutAddMenuEntry("Clip Graphics", MENU_CLIP); glutAddMenuEntry("Translate", MENU_TRANSLATE); glutAddMenuEntry("Rotate", MENU_ROTATE); glutAddMenuEntry("Scale", MENU_SCALE); glutAddMenuEntry("Exit", MENU_EXIT); glutAttachMenu(GLUT_RIGHT_BUTTON); } // 主函数 int main(int argc, char* argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); glutInitWindowSize(500, 500); glutCreateWindow("OpenGL Example"); init(); glutDisplayFunc(draw); glutMainLoop(); return 0; } ``` 在菜单中选择相应的功能可以进行直线、多边形、圆、填充、裁剪和变换等操作。可以根据需要进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值