/***************************************************************************
* Copyright (C) 2008 by frazer *
* frazer@frazer *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#include <qrect.h>
#include <cmath>
#include <iostream>
using namespace std;
#include <qmessagebox.h>
#include <qstring.h>
#include <qfiledialog.h>
#include "zjyvisualGL.h"
#include "zjybasicparamdialog.h"
#include "ZJYSetProcessSumDialog.h"
#include <sys/times.h>
#include <sys/wait.h>
ZJYVisualGL::ZJYVisualGL(QWidget *parent,char *name)
:QGLWidget(parent,name)
{
setFormat(QGLFormat(DoubleBuffer | DepthBuffer));
m_vEye.x=0;m_vEye.y=0;m_vEye.z=300;//初始化视点的坐标
m_vUp.x=0;m_vUp.y=1;m_vUp.z=0;//初始化视点的向上坐标
m_vInitEye.x=0;m_vInitEye.y=0;m_vInitEye.z=300;
m_vInitUp.x=0;m_vInitUp.y=1;m_vInitUp.z=0;
m_xRotate=0.0;m_yRotate=0.0;
m_imageWidth=400;m_imageHeight=400;
m_iLineSum=251;m_iPointSum=387;m_iSampleSum=19;
m_dVolInterval=1.0;m_dImgInterval=1.0;m_dRayStep=1.0;
m_pSetCADlg=new SetColorAlphaDialog(this);
connect(m_pSetCADlg,SIGNAL(applyToGL(QColor *,double *)),
this,SLOT(getAlphaValue(QColor *,double *)));
m_pRaycasting=new Raycasting();
m_pImage=0;
m_bDrawImage=false;
m_bDoingParallel=false;
m_iSemIDOut=0;m_iShmIDOut=0;m_iSemIDIn=0;m_iShmIDIn=0;m_pShmBufferOut=0;m_pShmBufferIn=0;
m_iProcessSum=4;
m_bIsNormal=true;
m_bIsParallel=false;
m_bDoingRendering=false;
m_iMPIPid=0;
m_iChildPid=0;
m_bFileOpened=false;
}
ZJYVisualGL::~ZJYVisualGL()
{
//delete
if(m_pRaycasting)delete m_pRaycasting;
if(m_pSetCADlg)delete m_pSetCADlg;
if(m_pImage)delete[] m_pImage;
if(m_bDoingParallel)//如果关闭窗口时,并行进程还在运行,则先终止并行进程
{
if(m_iMPIPid==0 || m_iChildPid==0)return;
while(m_bDoingRendering);//避免在并行进程正在进行体绘制计算时终止
kill(m_iMPIPid,SIGTERM);
waitpid(-1,NULL,0);
deleteSema();
detachShm();
m_bDoingParallel=false;
}
}
void ZJYVisualGL::initializeGL()
{
glClearColor(0.0,0.0,0.0,0.0);
glFrontFace(GL_CCW);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
}
void ZJYVisualGL::paintGL()
{
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
drawAxis();
if(m_pImage && m_bDrawImage)
{
drawVolImage();
}
drawFrame();
}
///////////////////////////////////////////////////////////////////////////////////////
//drawAxis: 绘制坐标轴,于viewport左下角
//////////////////////////////////////////////////////////////////////////////////////
void ZJYVisualGL::drawAxis()
{
int len=min(width(),height());
len=(int)len/5;
glViewport(0,0,len,len);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(-1,1,-1,1,-1,10000);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
gluLookAt(m_vEye.x,m_vEye.y,m_vEye.z,0.0,0.0,0.0,m_vUp.x,m_vUp.y,m_vUp.z);
glBegin(GL_LINES);
// yellow x axis arrow
glColor3f(1.0f,1.0f,0.0f);
glVertex3f(0.0f,0.0f,0.0f);
glVertex3f(1.0f,0.0f,0.0f);
glVertex3f(1.0f,0.0f,0.0f);
glVertex3f(0.9f,0.1f,0.0f);
glVertex3f(1.0f,0.0f,0.0f);
glVertex3f(0.9f,-0.1f,0.0f);
// cyan y axis arrow
glColor3f(0.0f,1.0f,1.0f);
glVertex3f(0.0f,0.0f,0.0f);
glVertex3f(0.0f,1.0f,0.0f);
glVertex3f(0.0f,1.0f,0.0f);
glVertex3f(0.1f,0.9f,0.0f);
glVertex3f(0.0f,1.0f,0.0f);
glVertex3f(-0.1f,0.9f,0.0f);
// magenta z axis arrow
glColor3f(1.0f,0.0f,1.0f);
glVertex3f(0.0f,0.0f,0.0f);
glVertex3f(0.0f,0.0f,1.0f);
glVertex3f(0.0f,0.0f,1.0f);
glVertex3f(0.0f,0.1f,0.9f);
glVertex3f(0.0f,0.0f,1.0f);
glVertex3f(0.0f,-0.1f,0.9f);
glEnd();
glPopMatrix();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
}
//////////////////////////////////////////////////////////////////////
//drawFrame: 绘制三维数据体所在的长方体边框
//////////////////////////////////////////////////////////////////////
void ZJYVisualGL::drawFrame()
{
int w=width();
int h=height();
glViewport((w-m_imageWidth*m_dVolInterval/m_dImgInterval)/2.0,(h-m_imageHeight*m_dVolInterval/m_dImgInterval)/2.0,m_imageWidth*m_dVolInterval/m_dImgInterval,m_imageHeight*m_dVolInterval/m_dImgInterval);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(-(GLdouble)m_imageWidth/2,(GLdouble)m_imageWidth/2,-(GLdouble)m_imageHeight/2,(GLdouble)m_imageHeight/2,-1.0,10000.0);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
gluLookAt(m_vEye.x,m_vEye.y,m_vEye.z,0.0,0.0,0.0,m_vUp.x,m_vUp.y,m_vUp.z);
glColor3f(1.0,1.0,1.0);
glBegin(GL_QUADS);
//glEdgeFlag(TRUE);
glVertex3f(m_pRaycasting->m_vVolVertex[0].x,m_pRaycasting->m_vVolVertex[0].y,m_pRaycasting->m_vVolVertex[0].z);
glVertex3f(m_pRaycasting->m_vVolVertex[1].x,m_pRaycasting->m_vVolVertex[1].y,m_pRaycasting->m_vVolVertex[1].z);
glVertex3f(m_pRaycasting->m_vVolVertex[2].x,m_pRaycasting->m_vVolVertex[2].y,m_pRaycasting->m_vVolVertex[2].z);
glVertex3f(m_pRaycasting->m_vVolVertex[3].x,m_pRaycasting->m_vVolVertex[3].y,m_pRaycasting->m_vVolVertex[3].z);
glVertex3f(m_pRaycasting->m_vVolVertex[4].x,m_pRaycasting->m_vVolVertex[4].y,m_pRaycasting->m_vVolVertex[4].z);
glVertex3f(m_pRaycasting->m_vVolVertex[7].x,m_pRaycasting->m_vVolVertex[7].y,m_pRaycasting->m_vVolVertex[7].z);
glVertex3f(m_pRaycasting->m_vVolVertex[6].x,m_pRaycasting->m_vVolVertex[6].y,m_pRaycasting->m_vVolVertex[6].z);
glVertex3f(m_pRaycasting->m_vVolVertex[5].x,m_pRaycasting->m_vVolVertex[5].y,m_pRaycasting->m_vVolVertex[5].z);
glVertex3f(m_pRaycasting->m_vVolVertex[0].x,m_pRaycasting->m_vVolVertex[0].y,m_pRaycasting->m_vVolVertex[0].z);
glVertex3f(m_pRaycasting->m_vVolVertex[3].x,m_pRaycasting->m_vVolVertex[3].y,m_pRaycasting->m_vVolVertex[3].z);
glVertex3f(m_pRaycasting->m_vVolVertex[7].x,m_pRaycasting->m_vVolVertex[7].y,m_pRaycasting->m_vVolVertex[7].z);
glVertex3f(m_pRaycasting->m_vVolVertex[4].x,m_pRaycasting->m_vVolVertex[4].y,m_pRaycasting->m_vVolVertex[4].z);
glVertex3f(m_pRaycasting->m_vVolVertex[1].x,m_pRaycasting->m_vVolVertex[1].y,m_pRaycasting->m_vVolVertex[1].z);
glVertex3f(m_pRaycasting->m_vVolVertex[5].x,m_pRaycasting->m_vVolVertex[5].y,m_pRaycasting->m_vVolVertex[5].z);
glVertex3f(m_pRaycasting->m_vVolVertex[6].x,m_pRaycasting->m_vVolVertex[6].y,m_pRaycasting->m_vVolVertex[6].z);
glVertex3f(m_pRaycasting->m_vV
zjyvisualparallel.rar_Qt 并行_qt 三维_地震_地震数据
版权申诉
199 浏览量
2022-07-14
01:51:40
上传
评论
收藏 306KB RAR 举报
小贝德罗
- 粉丝: 69
- 资源: 1万+
最新资源
- ZEND解密dezender12
- sony 索尼IMX334摄像头模组电路板AD版硬件PCB图(6层板).zip
- 基于flask和echarts融合交易策略的bitfinex可视化微服务.zip
- 包含了wvp-assist.tar wvp-talk.tar zlmediakit.tar .
- 3r4efgh53wgrf43tw
- 2024新版Java基础从入门到精通全套视频+资料下载
- Spring AI大模型视频教程+ChatGPT视频教程+OpenAI大模型视频教程(资料+视频教程)
- ABB工业机器人教程PDF版本
- 123321123323211
- 三相桥式全桥整流电路MATALB Simulink仿真文件
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈