Commit 9fa4f220 authored by Hans-Christian Ebke's avatar Hans-Christian Ebke
Browse files

Added bezier data type to poly line object type.


git-svn-id: http://www.openflipper.org/svnrepo/OpenFlipper/branches/Free@17443 383ad7c9-94d9-4d36-a494-682f7c89f535
parent 1b12cac0
/*===========================================================================*\
* *
* OpenFlipper *
* Copyright (C) 2001-2009 by Computer Graphics Group, RWTH Aachen *
* www.openflipper.org *
* *
*---------------------------------------------------------------------------*
* This file is part of OpenFlipper. *
* *
* OpenFlipper is free software: you can redistribute it and/or modify *
* it under the terms of the GNU Lesser General Public License as *
* published by the Free Software Foundation, either version 3 of *
* the License, or (at your option) any later version with the *
* following exceptions: *
* *
* If other files instantiate templates or use macros *
* or inline functions from this file, or you compile this file and *
* link it with other files to produce an executable, this file does *
* not by itself cause the resulting executable to be covered by the *
* GNU Lesser General Public License. This exception does not however *
* invalidate any other reasons why the executable file might be *
* covered by the GNU Lesser General Public License. *
* *
* OpenFlipper 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 Lesser General Public License for more details. *
* *
* You should have received a copy of the GNU LesserGeneral Public *
* License along with OpenFlipper. If not, *
* see <http://www.gnu.org/licenses/>. *
* *
\*===========================================================================*/
/*===========================================================================*\
* *
* $Revision: 17373 $ *
* $Author: moebius $ *
* $Date: 2013-08-22 17:54:51 +0200 (Thu, 22 Aug 2013) $ *
* *
\*===========================================================================*/
//=============================================================================
//
// CLASS PolyLineCircleData - IMPLEMENTATION
//
//=============================================================================
//== INCLUDES =================================================================
#include "PolyLineBezierSplineData.hh"
void PolyLineBezierSplineData::addInterpolatePoint(ACG::Vec3d _pos, ACG::Vec3d _nor)
{
InterpolatePoint p;
p.Pos_ = _pos;
p.Nor_ = _nor;
Points_.push_back(p);
}
bool PolyLineBezierSplineData::finishSpline()
{
Handles_.clear();
if(Points_.size() % 2)
return false;
for(unsigned int i = 0; i < Points_.size() - 1; i++) {
const ACG::Vec3d firstPoint = Points_[i].Pos_, sndPoint = Points_[i + 1].Pos_;
double r = (firstPoint - sndPoint).norm() / 4.0;
const ACG::Vec3d dir = sndPoint - firstPoint;
const ACG::Vec3d ort0 = dir % Points_[i].Nor_, ort1 = dir % Points_[i + 1].Nor_;
ACG::Vec3d f0 = ort0 % Points_[i].Nor_, f1 = ort1 % Points_[i + 1].Nor_;
ACG::Vec3d near = firstPoint - f0.normalize() * r,
far = sndPoint + f1.normalize() * r;
Handles_.push_back(near);
Handles_.push_back(far);
}
//handles will be degenerate up to now
for(unsigned int i = 1; i < Handles_.size() - 1; i+=2) {
ACG::Vec3d dir = (Handles_[i + 1] - Handles_[i]) / 2.0;
InterpolatePoint& p = getInterpolatePoint(i);
Handles_[i + 1] = p.Pos_ + dir;
Handles_[i] = p.Pos_ - dir;
}
return true;
}
PolyLineBezierSplineData::InterpolatePoint& PolyLineBezierSplineData::getInterpolatePoint(unsigned int _handleIndex)
{
if(!_handleIndex)
return Points_[0];
else if(_handleIndex == Handles_.size())
return Points_.back();
else return Points_[(_handleIndex - 1) / 2 + 1];
}
/*===========================================================================*\
* *
* OpenFlipper *
* Copyright (C) 2001-2009 by Computer Graphics Group, RWTH Aachen *
* www.openflipper.org *
* *
*---------------------------------------------------------------------------*
* This file is part of OpenFlipper. *
* *
* OpenFlipper is free software: you can redistribute it and/or modify *
* it under the terms of the GNU Lesser General Public License as *
* published by the Free Software Foundation, either version 3 of *
* the License, or (at your option) any later version with the *
* following exceptions: *
* *
* If other files instantiate templates or use macros *
* or inline functions from this file, or you compile this file and *
* link it with other files to produce an executable, this file does *
* not by itself cause the resulting executable to be covered by the *
* GNU Lesser General Public License. This exception does not however *
* invalidate any other reasons why the executable file might be *
* covered by the GNU Lesser General Public License. *
* *
* OpenFlipper 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 Lesser General Public License for more details. *
* *
* You should have received a copy of the GNU LesserGeneral Public *
* License along with OpenFlipper. If not, *
* see <http://www.gnu.org/licenses/>. *
* *
\*===========================================================================*/
/*===========================================================================*\
* *
* $Revision: 17377 $ *
* $Author: moebius $ *
* $Date: 2013-08-23 14:42:04 +0200 (Fri, 23 Aug 2013) $ *
* *
\*===========================================================================*/
#pragma once
#include <OpenFlipper/common/GlobalDefines.hh>
#include <OpenFlipper/common/perObjectData.hh>
#include <ACG/Math/VectorT.hh>
#include <vector>
#define BEZSPLINE_DATA "BezierSpline_Data"
class DLLEXPORT PolyLineBezierSplineData : public PerObjectData
{
public:
struct InterpolatePoint {
ACG::Vec3d Pos_;
ACG::Vec3d Nor_;
};
std::vector<InterpolatePoint> Points_;
std::vector<ACG::Vec3d> Handles_;
int MeshIndex_;
public:
/*
* \brief Creates a new PolyLineBezierSplineData object with no points.
*/
PolyLineBezierSplineData(int _meshIndex)
: MeshIndex_(_meshIndex)
{
}
/*
* \brief Adds a point to the end of the list and inserts control points.
*
* @param _pos The location(on the mesh) of the new control point.
* @param _nor The normal at the location.
*/
void addInterpolatePoint(ACG::Vec3d _pos, ACG::Vec3d _nor);
/*
* \brief If possible calculates handles.
*
* @return True if it was possible to create handles.
*/
bool finishSpline();
/*
* \brief Retrieves the interpolate point based on the handle.
*
* @param _handleIndex The index of the handle.
*/
InterpolatePoint& getInterpolatePoint(unsigned int _handleIndex);
};
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment