#ifndef _POINT_HPP_
#define _POINT_HPP_
#include <math.h>
#include <tuple>
struct point
{
	point();
	point(double x_,double y_,double z_=0)
		:x(x_)
		,y(y_)
		,z(z_)
	{
	
	}

	point(const point&pt)
		:x(pt.x)
		,y(pt.y)
		,z(pt.z)
	{
	
	}

	static point min(const point&a,const point&b)
	{
		return b<a?b:a;
	}

	static point max(const point&a,const point&b)
	{
		return a<b?b:a;
	}

	void set(const point&p)
	{
		x=p.x;
		y=p.y;
		z=p.z;
	}

	void set(double,double,double z=0);
	void swap(point&p);

	bool operator<(const point&p)const
	{
		double c=x-p.x;
		if(c!=0) 
			return c<0;

		c=y-p.y;
		if(c!=0) 
			return c<0;

		return z-p.z<0;
	}

	static bool eq(double l,double r,double deta)
	{
		return fabs(l-r)<=deta;
	}

	bool empty()const
	{
		return x==0 && y==0 && z==0;
	}

	bool operator==(const point&r)const
	{
		return eq(x,r.x,1e-10)&&eq(y,r.y,1e-10)&&eq(z,r.z,1e-10);
	}

	double dist_direct(const point&o)const
	{
		double d=dist(o);
		return o<*this?-d:d;
	}

	//计算this到(x,y)的距离
	double dist_direct(double x,double y)const
	{
		return dist_direct(point(x,y));

	}

	double dist(const point&o)const
	{
		return dist(o.x,o.y);
	}

	//计算this到(x,y)的距离
	double dist(double x,double y)const
	{
		double dx=this->x-x;
		double dy=this->y-y;
		return sqrt(dx*dx+dy*dy);
	}

	double cos_k(const point&o)const
	{
		double dx=o.x-x;
		double dy=o.y-y;
		return dx/sqrt(dx*dx+dy*dy);
	}

	double sin_k(const point&o)const
	{
		double dx=o.x-x;
		double dy=o.y-y;
		return dy/sqrt(dx*dx+dy*dy);
	}

	point middle(const point&o)const
	{
		return point((x+o.x)/2,(y+o.y)/2);
	}

	std::tuple<double,double,double> get_abc(const point&o)const
	{
		double cos=fabs(cos_k(o));
		if(cos==0)
			return std::make_tuple(1,0,-x);

		if(cos==1)
			return std::make_tuple(0,1,-y);

		double dx=o.x-x;
		double dy=o.y-y;
		double k=dy/dx;
		double deno=sqrt(k*k+1);
		return std::make_tuple(k/deno,-1/deno,(y-k*x)/deno);
		//return std::make_tuple(k,-1,y-k*x);
	}

public:
	double x,y,z;
};
#endif