#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <complex>
#include <string>
#include <sstream>
#include <algorithm>
#include <numeric>
#include <vector>
#include <queue>
#include <stack>
#include <functional>
#include <iostream>
#include <map>
#include <set>
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vll;
#define pu push
#define pb push_back
#define mp make_pair
#define eps 1e-9
#define INF 2000000000
#define sz(x) ((int)(x).size())
#define fi first
#define sec second
#define SORT(x) sort((x).begin(),(x).end())
#define all(x) (x).begin(),(x).end()
#define rep(i,n) for(int (i)=0;(i)<(int)(n);(i)++)
#define repn(i,a,n) for(int (i)=(a);(i)<(int)(n);(i)++)
#define EQ(a,b) (abs((a)-(b))<eps)
double add(double a,double b)
{
	if(abs(a+b)<eps*(abs(a)+abs(b)))return 0;
	return a+b;
}

struct P
{
	double x,y;
	P() {}
	P(double x,double y) : x(x),y(y){}
	P operator + (P p)
	{
		return P(add(x,p.x),add(y,p.y));
	}
	P operator - (P p)
	{
		return P(add(x,-p.x),add(y,-p.y));
	}
	P operator * (double d)
	{
		return P(x*d,y*d);
	}
	double dot(P p)
	{
		return add(x*p.x,y*p.y);
	}
	double det(P p)
	{
		return add(x*p.y,-y*p.x);
	}
	double len()
	{
		return sqrt(x*x+y*y);
	}
};
double dist(P a,P b)
{
	return (a-b).len();
}
P A,B,C,I,ab,ai,ah;
double a,b,c,IA,IB,IC,s,r,ra,rb,rc;
int main()
{
	while(1)
	{
		scanf("%lf %lf %lf %lf %lf %lf",&A.x,&A.y,&B.x,&B.y,&C.x,&C.y);
		if(A.x+A.y+B.x+B.y+C.x+C.y==0)break;
		a = dist(B,C); b = dist(A,C); c = dist(A,B);
		s = (a+b+c)/2.0;
		I = (A*a+B*b+C*c)*(1.0/(a+b+c));
		IA = dist(I,A); IB = dist(I,B); IC = dist(I,C);
		ab = B-A; ai = I-A;
		ah = ab*(ab.dot(ai)/ab.len()/ab.len());
		r = (ai-ah).len();
		ra = r*(s-r-(IB+IC-IA))/2.0/(s-a);
		rb = r*(s-r-(IC+IA-IB))/2.0/(s-b);
		rc = r*(s-r-(IA+IB-IC))/2.0/(s-c);
		printf("%f %f %f\n",ra,rb,rc);
	}
	return 0;
}