https://github.com/ialhashim/topo-blend
Revision 39b13612ebd645a65eda854771b517371f2f858a authored by ennetws on 13 March 2015, 18:17:18 UTC, committed by ennetws on 13 March 2015, 18:17:18 UTC
1 parent c702819
Raw File
Tip revision: 39b13612ebd645a65eda854771b517371f2f858a authored by ennetws on 13 March 2015, 18:17:18 UTC
Create README.md
Tip revision: 39b1361
StructureNode.h
#pragma once

#include "StructureGlobal.h"
#include "StructureLink.h"

#define DECODE_ZERO_THRESHOLD 1e-7

namespace Structure{

struct Node
{
	// Constructors
	virtual Node * clone() = 0;
	virtual ~Node(){}

	// Properties
	QString id;
	PropertyMap property;
    virtual QString type() = 0;
    virtual Eigen::AlignedBox3d bbox(double scaling = 1.0) = 0;

	bool hasProperty(QString propertyName) { return property.contains(propertyName); }

	virtual std::vector<int> controlCount() = 0;
	virtual std::vector<Vector3> controlPoints() = 0;
	virtual std::vector<Scalar> controlWeights() = 0;
	virtual Vector3 & controlPoint(int idx) = 0;
	virtual void setControlPoints(const std::vector<Vector3> & newPositions) = 0;
	virtual int numCtrlPnts() = 0;

	// Modifiers
	virtual void moveBy( const Vector3d & delta ) = 0;
	virtual void scale( Scalar scaleFactor ) = 0;
	virtual void rotate( double angle, Vector3 axis ) = 0;
	virtual void refineControlPoints(int nU, int nV = 0) = 0;
	virtual void equalizeControlPoints( Structure::Node * other ) = 0;
	virtual void deformTo( const Vector4d & handle, const Vector3 & to, bool isRigid ) = 0;
	virtual void deformTwoHandles( Vector4d& handleA, Vector3 newPosA, Vector4d& handleB, Vector3 newPosB ) = 0;

	// Coordinates
    virtual void get( const Vector4d& coordinates, Vector3 & pos, std::vector<Vector3> & frame ) = 0;
	virtual Vector3 position( const Vector4d& coordinates ) = 0;
	virtual Vector4d approxCoordinates( const Vector3 & pos ) = 0;
	virtual Vector3 approxProjection( const Vector3 & point ) = 0;
	virtual Vector3 center() = 0;

	// Special coordinates [todo: check type of node]
	inline Vector4d minCoord(){ return Vector4d(0.0); }
	inline Vector4d maxCoord(){ return Vector4d(1.0); }

	virtual Array2D_Vector3 discretized(Scalar resolution) = 0;
	virtual Array2D_Vector4d discretizedPoints(Scalar resolution) = 0;
	Array2D_Vector3 getPoints( const Array2D_Vector4d & coords ){
		Array2D_Vector3 pnts(coords.size(), std::vector<Vector3>(coords.front().size(), Vector3(0,0,0)));
		for(int i = 0; i < (int)coords.size(); i++)
			for(int j = 0; j < (int)coords.front().size(); j++)
				pnts[i][j] = position( coords[i][j] );
		return pnts;
	}

	// Selections
	QMap<int, QColor> selections;
	void addSelectionWithColor(int pID, QColor color = Qt::green){
		if (selections.contains(pID)) selections.remove(pID);
		else selections[pID] = color;
	}

	// Geometric properties
	virtual Scalar area() = 0;

	Array1D_Vector3 geometricDiff( Structure::Node * other ){
		Array1D_Vector3 cp1 = controlPoints(), cp2 = other->controlPoints(), result = cp1;
		for(int i = 0; i < (int)cp1.size(); i++){
			if(i < (int)cp2.size())	result[i] = (cp1[i] - cp2[i]);
		}
		return result;
	}

	Scalar distortion( Structure::Node * other ){
		if(!other) return 0;
		Array1D_Vector3 cp1 = controlPoints(), cp2 = other->controlPoints();
		if(cp1.size() != cp2.size()) return 0;
		Vector3 mean1(0,0,0), mean2(0,0,0);
		foreach(Vector3 p, cp1) mean1 += p;
		foreach(Vector3 p, cp2) mean2 += p;
		mean1 /= cp1.size();
		mean2 /= cp2.size();
		double maxDistort = 0;
		for(int i = 0; i < (int)cp1.size(); i++) maxDistort = qMax(maxDistort, (cp1[i] - cp2[i]).norm());
		return maxDistort;
	}

    // Visualization
    virtual void draw(bool isShowCtrlPts = false) = 0;
    QMap< QString, QVariant > vis_property;
	virtual void drawWithNames(int nID, int pointIDRange) = 0;
	std::vector<Vector3> debugPoints,debugPoints2,debugPoints3;
};

}
back to top