using DevExpress.XtraBars.Docking.Paint;
|
using DevExpress.XtraEditors;
|
using SharpGL;
|
using System;
|
using System.Collections.Generic;
|
using System.ComponentModel;
|
using System.Data;
|
using System.Drawing;
|
using System.Linq;
|
using System.Text;
|
using System.Threading.Tasks;
|
using System.Windows.Forms;
|
using System.Windows.Media;
|
|
namespace Yw.WinFrmUI.HydroL3d
|
{
|
public partial class NetworkPanel : DevExpress.XtraEditors.XtraUserControl
|
{
|
public NetworkPanel()
|
{
|
InitializeComponent();
|
}
|
|
protected Network _network = null;//管网
|
protected BoundingBox3d _bounndingBox = null;//包围盒
|
protected Point3d _center = null;//中心
|
|
/// <summary>
|
/// 是否初始化
|
/// </summary>
|
public bool Initialized => _network != null;
|
|
|
/// <summary>
|
/// 初始化
|
/// </summary>
|
public virtual void Initial(Network network)
|
{
|
_network = network;
|
_bounndingBox = _network.GetBoundingBox();
|
_center = _bounndingBox.GetCenter();
|
}
|
|
private void openGLControl1_OpenGLDraw(object sender, RenderEventArgs args)
|
{
|
if (_network == null)
|
{
|
return;
|
}
|
SharpGL.OpenGL gl = this.openGLControl1.OpenGL;
|
//清除深度缓存
|
gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);
|
|
//重置当前指定的矩阵为单位矩阵,将当前的用户坐标系的原点移到了屏幕中心
|
gl.LoadIdentity();
|
|
gl.Translate(-_center.X, -_center.Y, -_bounndingBox.Max.Z);
|
|
foreach (var pipe in _network.Pipes)
|
{
|
var startPosition = pipe.StartPosition;
|
var endPosition = pipe.EndPosition;
|
gl.Begin(OpenGL.GL_LINES);
|
gl.Color(1.0f, 1.0f, 1.0f);
|
gl.Vertex(startPosition.X, startPosition.Y, startPosition.Z);//左顶点
|
gl.Vertex(endPosition.X, endPosition.Y, endPosition.Z);//右顶点
|
gl.End();
|
}
|
|
//坐标轴变换位置到(0.0f, 0.0f, -5.0f),这样我们的坐标轴就相当于往屏幕内走5个单位
|
//gl.Translate(0.0f, 0.0f, -5.0f);
|
|
//rotation_X += 1f;
|
//gl.Rotate(rotation_X, 1.0f, 0.0f, 0.0f);//rotationX:角度
|
//rotation_Y += 1f;
|
//gl.Rotate(rotation_Y, 0.0f, 1.0f, 0.0f);//rotationY:角度
|
//rotation_Z += 1f;
|
//gl.Rotate(rotation_Z, 0.0f, 0.0f, 1.0f);//rotationZ:角度
|
|
//#region 点到线
|
//gl.Begin(OpenGL.GL_LINES);
|
//gl.Color(1.0f, 1.0f, 1.0f);
|
//gl.Vertex(-2.0f, 0.0f, 0.0f);//左顶点
|
//gl.Vertex(2.0f, 2.0f, 0.0f);//右顶点
|
//gl.End();
|
//#endregion
|
//#region 线成面(三角形)
|
//gl.Begin(OpenGL.GL_TRIANGLES);//第一个面
|
//gl.Color(1.0f, 0.0f, 0.0f);
|
//gl.Vertex(0.0f, 1f, 0.0f);//顶点
|
//gl.Color(0.0f, 1.0f, 0.0f);
|
//gl.Vertex(-1.0f, -1.0f, 0.0f);//左顶点
|
//gl.Color(0.0f, 0.0f, 1.0f);
|
//gl.Vertex(1.0f, -1.0f, 0.0f);//右顶点
|
//gl.End();
|
//#endregion
|
//#region 面组合成体
|
//gl.Begin(OpenGL.GL_TRIANGLES);//第二个面
|
//gl.Color(1.0f, 1.0f, 1.0f);
|
//gl.Vertex(0.0f, 0.0f, -2.0f);//第四个点
|
//gl.Color(0.0f, 1.0f, 0.0f);
|
//gl.Vertex(-1.0f, -1.0f, 0.0f);//左顶点
|
//gl.Color(0.0f, 0.0f, 1.0f);
|
//gl.Vertex(1.0f, -1.0f, 0.0f);//右顶点
|
//gl.End();
|
//gl.Begin(OpenGL.GL_TRIANGLES);//第三个面
|
//gl.Color(1.0f, 1.0f, 1.0f);
|
//gl.Vertex(0.0f, 0.0f, -2.0f);//第四个点
|
//gl.Color(0.0f, 1.0f, 0.0f);
|
//gl.Vertex(-1.0f, -1.0f, 0.0f);//左顶点
|
//gl.Color(1.0f, 0.0f, 0.0f);
|
//gl.Vertex(0.0f, 1f, 0.0f);//顶点
|
//gl.End();
|
//gl.Begin(OpenGL.GL_TRIANGLES);//第四个面
|
//gl.Color(1.0f, 1.0f, 1.0f);
|
//gl.Vertex(0.0f, 0.0f, -2.0f);//第四个点
|
//gl.Color(0.0f, 0.0f, 1.0f);
|
//gl.Vertex(1.0f, -1.0f, 0.0f);//右顶点
|
//gl.Color(1.0f, 0.0f, 0.0f);
|
//gl.Vertex(0.0f, 1f, 0.0f);//顶点
|
//gl.End();
|
//#endregion
|
|
gl.Flush(); //强制刷新
|
|
}
|
|
private void openGLControl1_OpenGLInitialized(object sender, EventArgs e)
|
{
|
OpenGL gl = openGLControl1.OpenGL;
|
gl.ClearColor(0, 0, 0, 0);
|
}
|
|
|
private void openGLControl1_Resize(object sender, EventArgs e)
|
{
|
if (_network == null)
|
{
|
return;
|
}
|
OpenGL gl = openGLControl1.OpenGL;
|
|
// 设置当前矩阵模式,对投影矩阵应用随后的矩阵操作
|
gl.MatrixMode(OpenGL.GL_PROJECTION);
|
|
// 重置当前指定的矩阵为单位矩阵,将当前的用户坐标系的原点移到了屏幕中心
|
gl.LoadIdentity();
|
|
// 创建透视投影变换
|
//gl.Perspective(30.0f, (double)Width / (double)Height, 5, 100);
|
gl.Perspective(150, (double)Width / (double)Height, 5, _bounndingBox.Max.Z);
|
|
// 视点变换
|
//gl.LookAt(0, 5, 0, 0, 0, 0, 0, 1, 0);
|
gl.LookAt(_center.X, _center.Y, 0, _center.X, _center.Y, _center.Z, 0, 1, 0);
|
|
// 设置当前矩阵为模型视图矩阵
|
gl.MatrixMode(OpenGL.GL_MODELVIEW);
|
|
}
|
}
|
}
|