/********************************************************************/
/* Copyright (c) 2019 System fugen G.K. and Yuzi Mizuno          */
/* All rights reserved.                                             */
/********************************************************************/
/** @file fillet.h
 *  @brief declaration for fillet module 
 */
#if !defined( __FILLET_H__)
#define __FILLET_H__
#include <memory>  // for std::unique_ptr

class MGCurve;

namespace mgcalc{
	/**
	 *  @brief  フィレット部分だけを生成する。
	 *  @param  curve1  フィレットされる曲線のひとつ目
	 *  @param  hint_param1  @a curve1 のピック位置におけるパラメータ
	 *  @param  curve2  フィレットされる曲線のふたつ目
	 *  @param  hint_param2  @a curve2 のピック位置におけるパラメータ
	 *  @param  radius  フィレット曲線の半径
	 *
	 *  MGEllise のコンストラクタだけでフィレット部分の円弧を生成する関数。
	 *  もし @a curve1, @a curve2 をピック位置に近い端点を延長すれば
	 *  フィレットカーブが生成できるようならば、延長カーブのフィレットを返す。
	 */
	std::unique_ptr<MGCurve> fillet_arc(
		const MGCurve& curve1,
		double&        hint_param1,
		const MGCurve& curve2,
		double&        hint_param2,
		double         radius
		);

	/**
	 *  @brief fillet 関数の戻り値型のための構造体
	 */
	struct MGCurveFilletInfo{
		std::unique_ptr<MGCurve>  m_fillet;
		std::unique_ptr<MGCurve>  m_curve1;
		std::unique_ptr<MGCurve>  m_curve2;
	};

	/**
	 *  @brief  フィレット部分の生成とトリム曲線の生成をする。
	 *  @param  curve1  フィレットされる曲線のひとつ目
	 *  @param  hint_param1  @a curve1 のピック位置におけるパラメータ
	 *  @param  curve2  フィレットされる曲線のふたつ目
	 *  @param  hint_param2  @a curve2 のピック位置におけるパラメータ
	 *  @param  radius  フィレット曲線の半径
	 *
	 *  内容的には fillet_arc 関数と同じ処理を行う。
	 *  さらに引数の曲線のトリムを行う。
	 */ 
	std::unique_ptr<MGCurveFilletInfo> fillet(
		const MGCurve& curve1,
		double&        hint_param1,
		const MGCurve& curve2,
		double&        hint_param2,
		double         radius
		);
} // namespace mgcalc

#endif //__FILLET_H__
