/********************************************************************/
/* Copyright (c) 2019 System fugen G.K. and Yuzi Mizuno          */
/* All rights reserved.                                             */
/********************************************************************/

/**
 *  @file ellipse.h
 */
#if !defined(__MGCALC_ELLIPSE_H__)
#define __MGCALC_ELLIPSE_H__

class MGEllipse;
class MGPosition;
class MGPlane;

namespace mgcalc{
	/**
	 *  @brief  焦点と通過点を与えて楕円を生成する
	 *  @param  F0  焦点
	 *  @param  F1  焦点
	 *  @param  P   楕円上の点
	 *
	 *  @a F0 と @a F1 は相異なる焦点でなければ失敗する。
	 *  @a P が2焦点を結ぶ直線上にあるとき失敗する。
	 */
	std::unique_ptr<MGEllipse> create_ellipse(
		const MGPosition& F0,
		const MGPosition& F1,
		const MGPosition& P
		);

	/**
	 *  @brief  矩形に内接する楕円を生成する
	 *  @param  plane  楕円が乗る平面に平行な平面
	 *  @param  corner1  楕円が内接する矩形のコーナーの座標
	 *  @param  corner2  corner1 の対頂角の座標のヒント
	 *
	 *  もし @a corner2 が @a corner1 を通り @a plane に平行な平面に
	 *  乗っていない場合、@a corner2 は平行な平面に面直投影され、
	 *  それが計算に用いられる。
	 */
	std::unique_ptr<MGEllipse> create_ellipse(
		const MGPlane&    plane,
		const MGPosition& corner1,
		const MGPosition& corner2
		);
	
} // namespace mgcal

#endif // __MGCALC_ELLIPSE_H__
