Цитата(syoma @ Mar 9 2010, 19:16)

Даны координаты точки X,Y, которая лежит где-то за пределами гексагона. Надо найти координаты точки X',Y', которая должна находиться на границе и которая должна лежать на прямой 0,0 - X,Y.
Три прямых Y = 0; Y = X*tg(60°); Y = -X*tg(60°) разбивают плоскость на шесть равных секторов:
sector0: (X*tg(60°) <= Y)&&(-X*tg(60°) < Y)
sector1: (0 <= Y)&&(Y < X*tg(60°))
sector2: (-X*tg(60°) <= Y)&&(Y < 0)
sector3: (Y <= X*tg(60°))&&(Y < -X*tg(60°))
sector4: (Y <= 0)&&(X*tg(60°) < Y)
sector5: (0 < Y)&&(Y <= -X*tg(60°))
В прежних обозначениях:
Цитата(blackfin @ Feb 8 2010, 09:30)

находим:
Код
void
scale(double X,double Y,double *X',double *Y')
{
double PA = (Y*(2/a)/cos(30°)).
double PB = (X*(2/a)+Y*(2/a)*tg(30°)).
double PC = (X*(2/a)-Y*(2/a)*tg(30°)).
double S0;
double S1;
double S2;
double S3;
double S4;
double S5;
if ((2.0 < abs(PA))||(2.0 < abs(PB))||(2.0 < abs(PC)))
{
if ((X*tg(60°) <= Y)&&(-X*tg(60°) < Y))
{S0 = 2.0/PA; *X' = S0*X; *Y' = S0*Y;}
else if ((0 <= Y)&&(Y < X*tg(60°)))
{S1 = 2.0/PB; *X' = S1*X; *Y' = S1*Y;}
else if ((-X*tg(60°) <= Y)&&(Y < 0))
{S2 = 2.0/PC; *X' = S2*X; *Y' = S2*Y;}
else if ((Y <= X*tg(60°))&&(Y < -X*tg(60°)))
{S3 = -2.0/PA; *X' = S3*X; *Y' = S3*Y;}
else if ((Y <= 0)&&(X*tg(60°) < Y))
{S4 = -2.0/PB; *X' = S4*X; *Y' = S4*Y;}
else if ((0 < Y)&&(Y <= -X*tg(60°)))
{S5 = -2.0/PC; *X' = S5*X; *Y' = S5*Y;}
else printf("NAN error?");
}
return;
}