QT - qwtplot3d-3D图标

这篇具有很好参考价值的文章主要介绍了QT - qwtplot3d-3D图标。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一、演示效果

QT - qwtplot3d-3D图标,qt,3d,数据库
QT - qwtplot3d-3D图标,qt,3d,数据库
QT - qwtplot3d-3D图标,qt,3d,数据库
QT - qwtplot3d-3D图标,qt,3d,数据库
QT - qwtplot3d-3D图标,qt,3d,数据库
QT - qwtplot3d-3D图标,qt,3d,数据库
QT - qwtplot3d-3D图标,qt,3d,数据库
QT - qwtplot3d-3D图标,qt,3d,数据库
QT - qwtplot3d-3D图标,qt,3d,数据库
QT - qwtplot3d-3D图标,qt,3d,数据库

二、关键程序

#include "qwt3d_axis.h"

using namespace Qwt3D;

Axis::Axis()
{
  init();
};

Axis::~Axis()
{
}

Axis::Axis(Triple beg, Triple end)
{
 	init();
	setPosition(beg,end);
}

void Axis::init()
{
	detachAll();

  scale_ = qwt3d_ptr<Scale>(new LinearScale);

  beg_ = Triple(0.0, 0.0, 0.0);  
  end_ = beg_;
	
	majorintervals_ = 0;
	minorintervals_ = 0;
	setMajors(1);	
	setMinors(1);	
	setLimits(0,0);

	setTicOrientation(0.0, 0.0, 0.0);
	setTicLength(0.0, 0.0);
	setColor(0.0, 0.0, 0.0);
	setLineWidth(1.0);
	symtics_ = false;
	drawNumbers_ = false;
	drawLabel_ = false;

	drawTics_ = false;
	autoscale_ = true;
	markerLabel_.clear();
	numberfont_ = QFont("Courier",12);
	setLabelFont(QFont("Courier",14));

  numbercolor_ = RGBA(0,0,0,0);

	setNumberAnchor(Center);

	numbergap_ = 0;
	labelgap_ = 0;
}

void Axis::setPosition(const Triple& beg, const Triple& end)
{
	beg_ = beg;
	end_ = end;
}

void Axis::setMajors(int val)
{
	if (val == majorintervals_)
		return;
	
	majorintervals_ = (val<=0) ? 1 : val; // always >= 1
}

/*!
\see LogScale::setMinors().
*/
void Axis::setMinors(int val)
{
	if (val == minorintervals_)
		return;

	minorintervals_ = (val<=0) ? 1 : val; // always >= 1
}

void Axis::setTicLength(double majorl, double minorl)
{
	lmaj_ = majorl;
	lmin_ = minorl;
}

void Axis::setTicOrientation(double tx, double ty, double tz)
{
	setTicOrientation(Triple(tx,ty,tz));
}

void Axis::setTicOrientation(const Triple& val)
{
	orientation_ = val;
	orientation_.normalize();
}

/**
\param val thickness for axis base line
\param majfac relative thickness for axis major tics (majfac*val)
\param minfac relative thickness for axis minor tics (minfac*val)
*/
void Axis::setLineWidth(double val, double majfac, double minfac)
{
	lineWidth_ = val;
	majLineWidth_ = majfac * lineWidth_;
	minLineWidth_ = minfac * lineWidth_;
}

void Axis::draw()
{
	Drawable::draw();

	saveGLState();

//	GLStateBewarer sb(GL_LINE_SMOOTH, true);
//	glBlendFunc(GL_ONE, GL_ZERO);
	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
	glColor4d(color.r,color.g,color.b,color.a);		

	drawBase();
	drawTics();
	drawLabel();	

	restoreGLState();
}

/**
Always use AFTER drawNumbers() ! (Needs length of number string)
*/
void Axis::drawLabel()
{
	if (!drawLabel_)
		return;

  Triple diff = end() - begin();
	Triple center = begin() + diff/2;
	
	Triple bnumber = biggestNumberString(); 
//	double fac = 6*(second()-first()).length() / 100;
	
	switch (scaleNumberAnchor_) 
	{
		case BottomLeft:
		case TopLeft:
		case CenterLeft:
			bnumber.y = 0;
			break;
		case BottomRight:
		case TopRight:
		case CenterRight:
			bnumber.x = -bnumber.x;
			bnumber.y = 0;
			break;
		case TopCenter:
			bnumber.x = 0;
			bnumber.y = -bnumber.y;
			break;
		case BottomCenter:
			bnumber.x = 0;
			break;
		default:
			break;
	}
	
	Triple pos = ViewPort2World(World2ViewPort(center + ticOrientation() * lmaj_) + bnumber);
	setLabelPosition(pos, scaleNumberAnchor_);

	label_.adjust(labelgap_);
	label_.draw();
}

void Axis::drawBase()
{
	setDeviceLineWidth( lineWidth_ );
	glBegin( GL_LINES );
		glVertex3d( beg_.x, beg_.y, beg_.z); 
		glVertex3d( end_.x, end_.y, end_.z);
	glEnd();
}	

bool Axis::prepTicCalculation(Triple& startpoint)
{
  if (isPracticallyZero(start_, stop_))
		return false;

	autostart_ = start_;
	autostop_ = stop_;

 	if (autoScale()) 
  {  
    setMajors(scale_->autoscale(autostart_, autostop_, start_, stop_, majors()));
    if (isPracticallyZero(autostart_, autostop_))
		  return false;
  }
  
  scale_->setLimits(start_,stop_);
  scale_->setMajors(majors());
  scale_->setMinors(minors());
  scale_->setMajorLimits(autostart_,autostop_);
  scale_->calculate();

	Triple normal = (end_ - beg_);
	//normal.normalize();
	Triple beg = beg_ + ((autostart_ - start_) / (stop_ - start_)) * normal;
	Triple end = end_ - ((stop_ - autostop_) / (stop_ - start_))* normal;

	startpoint = end_ - beg_;

	majorpos_.clear();
	minorpos_.clear();

  return true;
}

void Axis::recalculateTics()
{
  Triple runningpoint;
  if (false==prepTicCalculation(runningpoint))
    return;

	unsigned int i;
	
	for (i = 0; i != scale_->majors_p.size(); ++i) 
	{
		double t = (scale_->majors_p[i] - start_) / (stop_-start_);
		majorpos_.push_back(beg_ + t * runningpoint);
	}
	for (i = 0; i != scale_->minors_p.size(); ++i) 
	{
		double t = (scale_->minors_p[i] - start_) / (stop_-start_);
		minorpos_.push_back(beg_ + t * runningpoint);
	}
}

void Axis::drawTics()
{
	Triple runningpoint;
  if (!drawTics_ || false==prepTicCalculation(runningpoint))
		return;
  
	unsigned int i;
  Triple nadir;
	
  markerLabel_.resize(scale_->majors_p.size());
	setDeviceLineWidth(majLineWidth_);
	for (i = 0; i != scale_->majors_p.size(); ++i) 
	{
		double t = (scale_->majors_p[i] - start_) / (stop_-start_);
    nadir = beg_ + t * runningpoint;
    majorpos_.push_back(drawTic(nadir, lmaj_));
		drawTicLabel(nadir + 1.2 * lmaj_ * orientation_, i);
  }
	setDeviceLineWidth(minLineWidth_);
	for (i = 0; i != scale_->minors_p.size(); ++i) 
	{
		double t = (scale_->minors_p[i] - start_) / (stop_-start_);
		nadir = beg_ + t * runningpoint;
    minorpos_.push_back(drawTic(nadir, lmin_));
  }
}

void Axis::drawTicLabel(Triple pos, int mtic)
{
	if (!drawNumbers_ || (mtic < 0))
		return;
	
	markerLabel_[mtic].setFont(numberfont_.family(), numberfont_.pointSize(), numberfont_.weight(), numberfont_.italic());
	markerLabel_[mtic].setColor(numbercolor_);
  markerLabel_[mtic].setString(scale_->ticLabel(mtic));	  
  markerLabel_[mtic].setPosition(pos, scaleNumberAnchor_);
	markerLabel_[mtic].adjust(numbergap_);
	markerLabel_[mtic].draw();
}

Triple Axis::drawTic(Triple nadir, double length)
{
	double ilength = (symtics_) ? -length : 0.0;

	glBegin( GL_LINES );
	glVertex3d( nadir.x  + ilength * orientation_.x,
				      nadir.y  + ilength * orientation_.y,
							nadir.z  + ilength * orientation_.z) ; 
	glVertex3d( nadir.x  + length * orientation_.x,
							nadir.y  + length * orientation_.y,
							nadir.z  + length * orientation_.z);
	glEnd();
	return nadir;
}

void Axis::setNumberFont(QString const& family, int pointSize, int weight, bool italic)
{
	numberfont_ = QFont(family, pointSize, weight, italic );
}

void Axis::setNumberFont(QFont const& font)
{
	numberfont_ = font;
}

void Axis::setNumberColor(RGBA col)
{
	numbercolor_ = col;
}

void Axis::setLabelFont(QString const& family, int pointSize, int weight, bool italic)
{
	labelfont_ = QFont(family, pointSize, weight, italic );
  label_.setFont(family, pointSize, weight, italic);
}

void Axis::setLabelFont(QFont const& font)
{
	setLabelFont(font.family(), font.pointSize(), font.weight(), font.italic());
}

void Axis::setLabelString(QString const& name)
{
	label_.setString(name);
}

/*!
  Sets label position in conjunction with an anchoring strategy
*/
void Axis::setLabelPosition(const Triple& pos,Qwt3D::ANCHOR an)
{
	label_.setPosition(pos, an);
}

//! Sets color for label
void Axis::setLabelColor(RGBA col)
{
	label_.setColor(col);
}

Triple Axis::biggestNumberString()
{
	Triple ret;
	unsigned size = markerLabel_.size();

	double width, height;

	for (unsigned i=0; i!=size; ++i)
	{
		width = fabs( (World2ViewPort(markerLabel_[i].second())-World2ViewPort(markerLabel_[i].first())).x );
		height = fabs( (World2ViewPort(markerLabel_[i].second())-World2ViewPort(markerLabel_[i].first())).y );

		if (width > ret.x)
			ret.x = width + markerLabel_[i].gap();
		if (height > ret.y)
			ret.y = height + markerLabel_[i].gap();;
	}
	return ret;
}

/*! 
  This variant sets a user-defined scale object.
  Use with a heap based initialized pointer only.
  The axis adopts ownership. 
*/
void Axis::setScale(Scale* val)
{
  scale_ = qwt3d_ptr<Scale>(val); 
}

/*!
  Sets one of the predefined scaling types.
  \warning Too small intervals in logarithmic scales lead to  
  empty scales (or perhaps a scale only containing an isolated 
  major tic). Better switch to linear scales in such cases.
*/
void Axis::setScale(Qwt3D::SCALETYPE val)
{
  switch(val) {
  case Qwt3D::LINEARSCALE:
    setScale(new LinearScale);
  	break;
  case Qwt3D::LOG10SCALE:
    setScale(new LogScale);
    setMinors(9);
  	break;
  default:
    break;
  }
}


三、下载链接

https://download.csdn.net/download/u013083044/88745622?spm=1001.2014.3001.5503文章来源地址https://www.toymoban.com/news/detail-798603.html

到了这里,关于QT - qwtplot3d-3D图标的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Qt 3D 学习路径规划

    3D 用来做什么? 什么是Qt 3D,什么时候选择Qt 3D Opengl入门及学习资料 Qt 3D 整体介绍 官方实例 本系列文章只是记录本人学习Qt 3D的学习过程,其中很多都是借鉴网上搜寻的资料,其中有不对的,请积极指正。 3D是three-dimensional的缩写,在计算机里显示3d图形,就是说在平面里显

    2024年02月01日
    浏览(37)
  • Qt Quick 3D简介

    Qt Quick 3D是Qt自带的一套3D图形系统,与传统的Qt 3D不同的是,Qt Quick 3D采用QML来进行开发。本节则对Qt Quick 3D进行一次简单的介绍。 在main.qml中设置整个场景(entire scene)。 在使用Qt Quick 3D之前,为了能够使用QtQuick3D模块中的类型,我们必须导入它: 为了绘制任何3D场景,我们需

    2024年02月13日
    浏览(34)
  • QT-地形3D

    https://download.csdn.net/download/u013083044/88850945

    2024年02月20日
    浏览(37)
  • Qt Quick 3D学习:鼠标拾取物体

    (注意,开源版的 Qt Quick 3D 是狗都不用的 GPL 协议) Qt Creator 中有一个 picking 的示例,用于演示 View3D 中物体的拾取: 在示例基础上,我又加了一个简单的拖动效果,如图所示:   在使用 OpenGL 实现拾取的时候,我们可以用射线法。Qt Quick 3D 中封装了拾取操作,通过 View3D 的

    2024年02月10日
    浏览(39)
  • QT6+CloudCompare显示3D点云

        CloudCompare是一个三维点云(网格)编辑和处理软件。最初,它被设计用来对稠密的三维点云进行直接比较。它依赖于一种特定的八叉树结构,在进行点云对比这类任务时具有出色的性能。此外,由于大多数点云都是由地面激光扫描仪采集的,CloudCompare的目的是在一台标准

    2023年04月08日
    浏览(48)
  • Qt3D模块使用

    在Qt中显示一个简易的立方体,效果如下 1.Qt官方提供的Qt3d 的实例较少,QWidget的实例更少,通过以下两个函数就能加载一个3D场景到一个QWidget的布局器中 2.初始化3D的场景,一般为固定代码 3.构造立方体实体代码

    2024年02月11日
    浏览(37)
  • qt加载obj格式的3D模型

    在 Qt 中加载 obj 格式的 3D 模型可以使用 Qt 3D 模块。 首先,你需要在你的工程文件中包含 Qt 3D 模块,方法是在工程文件的顶部添加以下行: 然后,在你的代码中包含 Qt 3D 的头文件: 接下来,你可以使用 Qt3DRender::QObjLoader 类来加载 obj 格式的 3D 模型。首先,创建一个 Qt3DRen

    2024年02月16日
    浏览(64)
  • Qt3D绘制旋转立方体

    近期用了款叫DesktopSpace,也想实现一下这款软件实现的效果 具体实现步骤: 使用Qt3D绘制个旋转的立方体(一) 使用快捷键控制立方体显示面(二) 创建6个人虚拟桌面,截取不同虚拟桌面,显示在不同的面上 (三) 在立方体上播放视频 首先用Qt3D绘制一下桌面截图旋转的效

    2024年02月06日
    浏览(48)
  • 《Easy3d+Qt+VTK》学习

    1、 资源下载:easy3d giuhub 2、解压缩 3、用qt打开CMakeLists.txt即可 4、点击项目,选择debug或者release,图中3处可自行选择,因为我的qt版本是6,easy3d默认是5,所以qt我没有配置编译 5、先点击执行cmake,在点击构建,即可生成lib和dll文件,同样的方法构建一下release版本,生成如下

    2024年02月05日
    浏览(46)
  • Qt3D 输入类处理鼠标键盘动作

    Qt3D模块中的输入类用于处理用户输入,比如鼠标、键盘等输入事件。 ```cpp #include Qt3DExtras #include Qt3DInput #include Qt3DCore #include Qt3DRender #include Qt3DLogic #include Qt3DExtras int main(int argc, char *argv[]) {     QApplication app(argc, argv);     // 创建Qt3D窗     Qt3DExtras::Qt3DWindow view;     // 创建3

    2024年02月02日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包