计算三角形费马点

1.在一个三角形中,到3个顶点距离之和最小的点叫做这个三角形的费马点。

2. 费马点计算方法:

(1)若三角形ABC的3个内角均小于120°,那么3条距离连线正好平分费马点所在的周角。所以三角形的费马点也称为三角形的等角中心。

(2)若三角形有一内角不小于120度,则此钝角的顶点就是距离和最小的点。

3.如何计算等角中心呢?

做任意一条边的外接等边三角形,得到另一点,将此点与此边在三角形中对应的点相连

如此再取另一边作同样的连线,相交点即费马点



证明画几条辅助线就出来了~这里就不证明了


这是合肥OI竞赛一次比赛的题目,去给50中小朋友上课时写的标程:

#include 
#include 
#include 
#include 
using namespace std;

struct Vec
{
	double x,y;
	Vec(double xx=0,double yy=0)
	{
		x=xx;
		y=yy;
	}
};

struct Point
{
	double x,y;
	Point(double xx=0,double yy=0)
	{
		x=xx;
		y=yy;
	}
};

double ddot(Vec A,Vec B)
{
	return A.x*B.x+A.y*B.y;
}
double getlen(Vec A)
{
	return sqrt(A.x*A.x+A.y*A.y);
}

double getlen(Point A,Point B)
{
	return sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y));
}

bool moreThan120(double xa,double ya,double xb,double yb,double xc,double yc)
{
	Vec ab(xb-xa,yb-ya),ac(xc-xa,yc-ya);
	if (ddot(ab,ac)/getlen(ab)/getlen(ac) < -0.5)
	{
		return true;
	}
	return false;
}

inline void swap(double &a,double &b)
{
	double t;
	t=a;
	a=b;
	b=t;
}


Point getAnotherPoint(Point A,Point B,Point C)
{
	Point r,C1,C2;
	Vec AB(B.x-A.x,B.y-A.y);
	double len,len2;
	double sqrt3=sqrt(3.0);
	Vec AB2,crossAB,crossAB2;

	AB2.x=AB.x/2; AB2.y=AB.y/2;
	crossAB.x=AB2.y; crossAB.y=-AB2.x;
	crossAB2.x=-AB2.y; crossAB2.y=AB2.x;

	len=getlen(AB2);
	
	crossAB.x*=sqrt3; crossAB.y*=sqrt3;
	crossAB2.x*=sqrt3; crossAB2.y*=sqrt3;

	C1.x=A.x+AB2.x+crossAB.x;C1.y=A.y+AB2.y+crossAB.y;
	C2.x=A.x+AB2.x+crossAB2.x;C2.y=A.y+AB2.y+crossAB2.y;

	if (getlen(C,C1)>xa>>ya>>xb>>yb>>xc>>yc;
	cout.setf(ios::fixed);
	
	if (moreThan120(xa,ya,xb,yb,xc,yc))
	{
		cout<


你可能感兴趣的:(ACM,算法&数据结构)