Skip to content
OE_joincurve.cpp 2.97 KiB
Newer Older
/*
 * Copyright (c) 2015 Tricoire Sebastien 3dsman@free.fr
 *
 * This software is provided 'as-is', without any express or implied
 * warranty.  In no event will the authors be held liable for any damages
 * arising from the use of this software.
 *
 * Permission is granted to anyone to use this software for any purpose,
 * including commercial applications, and to alter it and redistribute it
 * freely, subject to the following restrictions:
 *
 * 1. The origin of this software must not be misrepresented; you must not
 * claim that you wrote the original software. If you use this software
 * in a product, an acknowledgment in the product documentation would be
 * appreciated but is not required.
 * 2. Altered source versions must be plainly marked as such, and must not be
 * misrepresented as being the original software.
 * 3. This notice may not be removed or altered from any source distribution.
 *
 */

#include "curves/OE_joincurve.h"
#include <iostream>

#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>

OE_joincurve::OE_joincurve(){}

OE_joincurve::OE_joincurve(OE_curve* curve1, OE_curve* curve2)
{
    if (curve1)
    {
        curves.push_back(curve1);
        curve1->addDependency(this);
    }
    if (curve2)
    {
        curves.push_back(curve2);
        curve2->addDependency(this);
    }
    //refresh();
}


OE_joincurve::~OE_joincurve()
{
    std::list<OE_curve*>::iterator i = curves.begin();
    while (i != curves.end())
    {
        (*i)->removeDependency(this);
        i++;
    }
void OE_joincurve::addCurve(OE_curve* curve)
{
    if (curve)
    {
        curves.push_back(curve);
        curve->addDependency(this);
        needRefresh = true;
    }
    //refresh();
}

void OE_joincurve::removeCurve()
{
    if (curves.size())
    {
        OE_curve* curve = curves.back();
        curves.pop_back();
        curve->removeDependency(this);
        needRefresh = true;
    }
    //refresh();
}

/** \brief check if the curve is valid.	 */
bool OE_joincurve::check()
{
	if (curves.size())
	{
		std::list<OE_curve*>::iterator i = curves.begin();
		while (i != curves.end())
			if (!((*i)->check())) return false;
			i++;
		}
		return true;
	}
	return false;
}
		
/** \brief refresh the discPts array.	 */
void OE_joincurve::refresh(float dpi)
		std::list<OE_curve*>::iterator i = curves.begin();
		while (i != curves.end())
            (*i)->refresh(dpi);
			//pts.push_back((pts.end()+curves.at(i)->pts.begin())/2.0);
			//pts.push_back((pts.end()+curves.at(i)->pts.begin())/2.0);
				pts.push_back(((*i)->pts.at(0)-pts.at(pts.size()-1)) /3.0f+pts.at(pts.size()-1));
				pts.push_back(((*i)->pts.at(0)-pts.at(pts.size()-1))*2.0f /3.0f+pts.at(pts.size()-1));
			pts.insert(pts.end(), (*i)->pts.begin(), (*i)->pts.end());
			i++;
}

void OE_joincurve::delDependency(OE_base * object)
{
    if (curves.size())