/********************************************************************/
/* Copyright (c) 2019 System fugen G.K. and Yuzi Mizuno          */
/* All rights reserved.                                             */
/* ***************************************************** */
/********************************************************************/
/**
 *  @file conic.h
 */
#if !defined(__MGCALC_CONIC_H__)
#define __MGCALC_CONIC_H__

class MGCurve;
class MGPosition;
class MGVector;

namespace mgcalc{
	/**
	 *  @brief  円錐曲線を生成する
	 *  @param  start  円錐曲線の始点
	 *  @param  end    円錐曲線の終点
	 *  @param  apex   始点における接線と終点における接線の交点
	 *  @param  rho    w / (1 + w), where w is the weight of control point ref.
	 *
	 *  @a start, @a apex, @a end を頂点とする三角形の面積が 0 ならば失敗する。
	 *  @a rho の値は 0 のとき失敗する。
	 */
	std::unique_ptr<MGCurve> create_conic_curve(
		const MGPosition& start,
		const MGPosition& end,
		const MGPosition& apex,
		double            rho
		);

	/**
	 *  @brief  円錐曲線を生成する
	 *  @param  start    円錐曲線の始点
	 *  @param  end      円錐曲線の終点
	 *  @param  apex     始点における接線と終点における接線の交点
	 *  @param  through  通過点
	 *
	 *  @a start, @a apex, @a end を頂点とする三角形が面積を持っていなければならない。
	 *  @a pos はその三角形内に存在しなければ失敗する。
	 *  @a pos が @a start か @a end に一致している場合は失敗する。
	 */
	std::unique_ptr<MGCurve> create_conic_curve(
		const MGPosition& start,
		const MGPosition& end,
		const MGPosition& apex,
		const MGPosition& through
		);

	/**
	 *  @brief  頂点と方向と終点を与えて放物線を生成する
	 *  @param  vertex  放物線の頂点
	 *  @param  direction  頂点から焦点への向き
	 *  @param  end  曲線の終点を指定するもの
	 *  @param  halfside  軸で分割したとき、@a end のないほうを捨てるかどうか
	 *
	 *  @a end が @a vertex の @a direcion 方向上にあるとき失敗する。
	 *  @a direction が 零ベクトルのとき失敗する。
	 */
	std::unique_ptr<MGCurve> create_parabola(
		const MGPosition& vertex,
		const MGVector&   direction,
		const MGPosition& end,
		bool              halfside = false
		);

	/**
	 *  @brief  頂点と焦点とマウスカーソルを与えて放物線を生成
	 *  @param  vertex  放物線の頂点
	 *  @param  focus   放物線の焦点
	 *  @param  cursor  放物線の軸上にない点
	 *  @param  halfside  軸で平面を分割したとき、@a cursor のないほうを捨てるかどうか
	 *
	 *  @a vertex と @a focus が一致しているとき失敗する
	 *  @a cursor が 放物線の軸上にあるとき失敗する
	 */
	std::unique_ptr<MGCurve> create_parabola(
		const MGPosition& vertex,
		const MGPosition& focus,
		const MGPosition& cursor,
		bool              halfside = false
		);
	
} // namespace mgcalc

#endif // __MGCALC_CONIC_H__
