diff options
Diffstat (limited to 'lib/tqwtplot3d/src/qwt3d_axis.cpp')
| -rw-r--r-- | lib/tqwtplot3d/src/qwt3d_axis.cpp | 386 | 
1 files changed, 386 insertions, 0 deletions
| diff --git a/lib/tqwtplot3d/src/qwt3d_axis.cpp b/lib/tqwtplot3d/src/qwt3d_axis.cpp new file mode 100644 index 0000000..fe45f37 --- /dev/null +++ b/lib/tqwtplot3d/src/qwt3d_axis.cpp @@ -0,0 +1,386 @@ +#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;
 +  }
 +}
 | 
