c# - 如何缩放图形?
问题描述
渲染三角形:
private void OpenGLControl_OpenGLDraw(object sender, SharpGL.SceneGraph.OpenGLEventArgs args)
{
OpenGL gL = GLControl.OpenGL;
gL.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);
gL.LoadIdentity();
maxX = Math.Max(AX, Math.Max(BX, CX));
maxY = Math.Max(AY, Math.Max(BY, CY));
minX = Math.Min(AX, Math.Min(BX, CX));
minY = Math.Min(AX, Math.Min(BX, CX));
maxZ = Math.Max(AZ, Math.Max(BZ, CZ));
minZ = Math.Min(AZ, Math.Min(BZ, CZ));
double figureWidht = maxX - minX;
double figureHeight = maxY - minY;
double figureSquare = figureWidht * figureHeight;
double viewPortSquare = GLControl.Width * GLControl.Height;
gL.Translate(-figureWidht / 2, -figureHeight / 2, -6);
gL.Begin(OpenGL.GL_LINES);
gL.Color(1.0F, 1.0F, 1.0F);
gL.Vertex((float)AX, (float)AY, (float)AZ);
gL.Vertex((float)BX, (float)BY, (float)BZ);
gL.Vertex((float)BX, (float)BY, (float)BZ);
gL.Vertex((float)CX, (float)CY, (float)CZ);
gL.Vertex((float)CX, (float)CY, (float)CZ);
gL.Vertex((float)AX, (float)AY, (float)AZ);
gL.End();
}
如何使图形始终适合OpenGLControl的视口?即如果图形大于opengl窗口,则调整到这个窗口,使所有轴的间距大致相同,如果小于,则相应变大。
解决方案
精神错乱
我会创建一个边界框(计算顶点的 minX、maxX、minY、maxY、minZ、maxZ)
然后检查每个轴的最大增量 Max(maxX-minX, maxY-minY, maxZ- minZ)
使用此最大增量在所有轴上使用相同的增量缩小对象(创建比例矩阵) scale(1/maxDelta, 1/maxDelta, 1/maxDelta)
现在您的对象在 1, 1, 1 范围内。现在您可以将其缩放到当前视口大小。
推荐阅读
- javascript - 密码不应以数字开头
- jquery - JQuery 将名称的第一个字母放在圆圈中
- php - GET Route Laravel 中的 URL 参数
- python - 匹配列表中任意位置的字段的“if”条件
- kubernetes - Kubernetes 中节点和命名空间之间的关系是什么?
- git - 来自远程分叉存储库的 Gitlab 合并请求通过命令行不创建任何合并提交
- python - 如何在 python 中启用 sqlite3 FTS5 扩展(在 Windows 上)?
- c# - 什么是最有效的方法 - 检查标签或 GetComponent
- python - 将 Matlab fminsearch 翻译成 Python
- javascript - 在 iOS 模拟器上运行 react-native 应用程序