[12] 扇形体(Fan)图形的生成算法
2013-11-09 08:45
323 查看
顶点数据的生成
bool YfBuildFunVertices ( Yreal radius, Yreal degree, Yreal height, Yuint slices, YeOriginPose originPose, Yuint vertexStriding, Yuint vertexPos, void* pVerticesBuffer ) { if (degree < 0 || degree > 360 || !pVerticesBuffer) { return false; } if (slices < 2 || !pVerticesBuffer) { return false; } Yuint numVertices = (slices + 1) * 2; char* vertexPtr = (char*)pVerticesBuffer + vertexPos; YsVector3* curVertexPtr = NULL; Yuint nOffset = 0; Yreal originOffsetY = 0.0f; if (originPose == YE_ORIGIN_POSE_TOP) { originOffsetY = -height; } else if (originPose == YE_ORIGIN_POSE_CENTER) { originOffsetY = -height * 0.5f; } // 柱顶顶点赋值 { nOffset = 0; curVertexPtr = (YsVector3*)(vertexPtr + nOffset); curVertexPtr->x = 0.0f; curVertexPtr->y = height + originOffsetY; curVertexPtr->z = 0.0f; } // 柱底顶点赋值 { nOffset = (numVertices - 1) * vertexStriding; curVertexPtr = (YsVector3*)(vertexPtr + nOffset); curVertexPtr->x = 0.0f; curVertexPtr->y = originOffsetY; curVertexPtr->z = 0.0f; } Yreal radian = YD_DEGREE_TO_RADIAN(degree); Yreal angleXZ; Yreal posX, posZ; for (Yuint i = 0; i < slices; i++) { angleXZ = radian * i / (slices - 1); posX = yf_sin(angleXZ); posZ = yf_cos(angleXZ); // 上顶点 { nOffset = (1 + i) * vertexStriding; curVertexPtr = (YsVector3*)(vertexPtr + nOffset); curVertexPtr->x = radius * posX; curVertexPtr->y = height + originOffsetY; curVertexPtr->z = radius * posZ; } // 下顶点 { nOffset = (1 + slices + i) * vertexStriding; curVertexPtr = (YsVector3*)(vertexPtr + nOffset); curVertexPtr->x = radius * posX; curVertexPtr->y = originOffsetY; curVertexPtr->z = radius * posZ; } } return true; }
三角形索引数据的生成
bool YfBuildFunTriIndices ( Yuint slices, YeIndexType indexType, Yuint indexStriding, Yuint indexPos, void* pTriIndicesBuffer ) { if (slices < 2 || !pTriIndicesBuffer) { return false; } Yuint numVertices = (slices + 1) * 2; Yuint numTriangles = slices * 4; if (indexType == YE_INDEX_16_BIT && numVertices > YD_MAX_UNSIGNED_INT16) { return false; } // 索引赋值 char* indexPtr = (char*)pTriIndicesBuffer + indexPos; Yuint nOffset = 0; if (indexType == YE_INDEX_16_BIT) { YsTriIndex16* triIndexPtr = NULL; for (Yuint i = 0; i < slices - 1; i++) { nOffset = (i * 4) * indexStriding; triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset); triIndexPtr->index0 = 0; triIndexPtr->index1 = 1 + i; triIndexPtr->index2 = 1 + i + 1; nOffset += indexStriding; triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset); triIndexPtr->index0 = numVertices - 1; triIndexPtr->index1 = 1 + slices + i + 1; triIndexPtr->index2 = 1 + slices + i; nOffset += indexStriding; triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset); triIndexPtr->index0 = 1 + i; triIndexPtr->index1 = 1 + slices + i; triIndexPtr->index2 = 1 + i + 1; nOffset += indexStriding; triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset); triIndexPtr->index0 = 1 + i + 1; triIndexPtr->index1 = 1 + slices + i; triIndexPtr->index2 = 1 + slices + i + 1; } nOffset = ((slices - 1) * 4) * indexStriding; triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset); triIndexPtr->index0 = 0; triIndexPtr->index1 = numVertices - 1; triIndexPtr->index2 = 1; nOffset += indexStriding; triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset); triIndexPtr->index0 = 1; triIndexPtr->index1 = numVertices - 1; triIndexPtr->index2 = 1 + slices; nOffset += indexStriding; triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset); triIndexPtr->index0 = 0; triIndexPtr->index1 = slices; triIndexPtr->index2 = numVertices - 1; nOffset += indexStriding; triIndexPtr = (YsTriIndex16*)(indexPtr + nOffset); triIndexPtr->index0 = slices; triIndexPtr->index1 = numVertices - 2; triIndexPtr->index2 = numVertices - 1; } else { YsTriIndex32* triIndexPtr = NULL; for (Yuint i = 0; i < slices - 1; i++) { nOffset = (i * 4) * indexStriding; triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset); triIndexPtr->index0 = 0; triIndexPtr->index1 = 1 + i; triIndexPtr->index2 = 1 + i + 1; nOffset += indexStriding; triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset); triIndexPtr->index0 = numVertices - 1; triIndexPtr->index1 = 1 + slices + i + 1; triIndexPtr->index2 = 1 + slices + i; nOffset += indexStriding; triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset); triIndexPtr->index0 = 1 + i; triIndexPtr->index1 = 1 + slices + i; triIndexPtr->index2 = 1 + i + 1; nOffset += indexStriding; triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset); triIndexPtr->index0 = 1 + i + 1; triIndexPtr->index1 = 1 + slices + i; triIndexPtr->index2 = 1 + slices + i + 1; } nOffset = ((slices - 1) * 4) * indexStriding; triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset); triIndexPtr->index0 = 0; triIndexPtr->index1 = numVertices - 1; triIndexPtr->index2 = 1; nOffset += indexStriding; triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset); triIndexPtr->index0 = 1; triIndexPtr->index1 = numVertices - 1; triIndexPtr->index2 = 1 + slices; nOffset += indexStriding; triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset); triIndexPtr->index0 = 0; triIndexPtr->index1 = slices; triIndexPtr->index2 = numVertices - 1; nOffset += indexStriding; triIndexPtr = (YsTriIndex32*)(indexPtr + nOffset); triIndexPtr->index0 = slices; triIndexPtr->index1 = numVertices - 2; triIndexPtr->index2 = numVertices - 1; } return true; }
线框索引数据的生成
bool YfBuildFunWireIndices ( Yuint slices, YeIndexType indexType, Yuint indexStriding, Yuint indexPos, void* pWireIndicesBuffer ) { if (slices < 2 || !pWireIndicesBuffer) { return false; } Yuint numVertices = (slices + 1) * 2; Yuint numLines = slices + (slices-1) * 2 + 5; if (indexType == YE_INDEX_16_BIT && numVertices > YD_MAX_UNSIGNED_INT16) { return false; } // 索引赋值 char* indexPtr = (char*)pWireIndicesBuffer + indexPos; Yuint nOffset = 0; if (indexType == YE_INDEX_16_BIT) { YsLineIndex16* lineIndexPtr = NULL; for (Yuint i = 0; i < slices - 1; i++) { nOffset = (i * 3) * indexStriding; lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset); lineIndexPtr->index0 = 1 + i; lineIndexPtr->index1 = 1 + slices + i; nOffset += indexStriding; lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset); lineIndexPtr->index0 = 1 + i; lineIndexPtr->index1 = 1 + i + 1; nOffset += indexStriding; lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset); lineIndexPtr->index0 = 1 + slices + i; lineIndexPtr->index1 = 1 + slices + i + 1; } nOffset += indexStriding; lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset); lineIndexPtr->index0 = slices; lineIndexPtr->index1 = 2*slices; nOffset += indexStriding; lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset); lineIndexPtr->index0 = 0; lineIndexPtr->index1 = 2*slices + 1; nOffset += indexStriding; lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset); lineIndexPtr->index0 = 0; lineIndexPtr->index1 = 1; nOffset += indexStriding; lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset); lineIndexPtr->index0 = 0; lineIndexPtr->index1 = slices; nOffset += indexStriding; lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset); lineIndexPtr->index0 = 2*slices + 1; lineIndexPtr->index1 = slices + 1; nOffset += indexStriding; lineIndexPtr = (YsLineIndex16*)(indexPtr + nOffset); lineIndexPtr->index0 = 2*slices + 1; lineIndexPtr->index1 = 2*slices; } else { YsLineIndex32* lineIndexPtr = NULL; for (Yuint i= 0; i < slices; i++) { YsLineIndex32* lineIndexPtr = NULL; for (Yuint i = 0; i < slices - 1; i++) { nOffset = (i * 3) * indexStriding; lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset); lineIndexPtr->index0 = 1 + i; lineIndexPtr->index1 = 1 + slices + i; nOffset += indexStriding; lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset); lineIndexPtr->index0 = 1 + i; lineIndexPtr->index1 = 1 + i + 1; nOffset += indexStriding; lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset); lineIndexPtr->index0 = 1 + slices + i; lineIndexPtr->index1 = 1 + slices + i + 1; } nOffset += indexStriding; lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset); lineIndexPtr->index0 = slices; lineIndexPtr->index1 = 2*slices; nOffset += indexStriding; lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset); lineIndexPtr->index0 = 0; lineIndexPtr->index1 = 2*slices + 1; nOffset += indexStriding; lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset); lineIndexPtr->index0 = 0; lineIndexPtr->index1 = 1; nOffset += indexStriding; lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset); lineIndexPtr->index0 = 0; lineIndexPtr->index1 = slices; nOffset += indexStriding; lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset); lineIndexPtr->index0 = 2*slices + 1; lineIndexPtr->index1 = slices + 1; nOffset += indexStriding; lineIndexPtr = (YsLineIndex32*)(indexPtr + nOffset); lineIndexPtr->index0 = 2*slices + 1; lineIndexPtr->index1 = 2*slices; } } return true; }
相关文章推荐
- [12] 扇形体(Fan)图形的生成算法
- [15] 星星(Star)图形的生成算法
- [6] 胶囊体(Capsule)图形的生成算法
- [7] 金字塔(Pyramid)图形的生成算法
- [13] 弧面(Arc)图形的生成算法
- 【计算机图形学】基本图形元素:圆的生成算法
- [16] 螺旋面(Spire)图形的生成算法
- [8] 圆面(Round)图形的生成算法
- [11] 楔形体(Wedge)图形的生成算法
- 渣渣用JavaScript开发的消消乐,由于没有按照正规消消乐形式生成,是随机产生图形,所以存在一个算法bug,具体看下面,高手想到可以告诉我
- 基本图形生成算法注记
- 图形生成算法:多边形的扫描转换与区域填充算法
- [17] 楼梯(Stairs)图形的生成算法
- [9] 圆环(Ring)图形的生成算法
- [4] 圆锥(Cone)图形的生成算法
- 基本图形生成算法注记
- [1] 平面(Plane)图形的生成算法
- [18] 螺旋楼梯(Spiral Stairs)图形的生成算法
- [9] 圆环(Ring)图形的生成算法
- [5] 柱台(Cylinder)图形的生成算法