1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
|
// Calcul de la pente du segment SE
int dx = E.x - S.x;
int dy = E.y - S.y;
double d = hypot(dx, dy);
double sina = 0.0;
double cosa = 1.0;
double sinb;
double cosb;
if(d != 0.0)
{
sina = dy / d;
cosa = dx / d;
}
//--------------------------------------------------------------------
// Au repos (avant rotation), la position des points S1 et S2 de la
// base de la flèche est prédéfinie relativement par rapport à la pointe :
//
// S2 (-12, +6)
// |****
// | ****
// | **** E' (0,0)
// | ****
// |****
// S1 (-12, -6)
//
//--------------------------------------------------------------------
// Le point S1
double x1 = -12;
double y1 = -6;
d = hypot(x1, y1);
sinb = y1 / d;
cosb = x1 / d;
// Rotation autour de E
y1 = E.y + (((sina * cosb) + (sinb * cosa)) * d);
x1 = E.x + (((cosa * cosb) - (sina * sinb)) * d);
//Le point S2
double x2 = -12;
double y2 = +6;
d = hypot(x2, y2);
sinb = y2 / d;
cosb = x2 / d;
// Rotation autour de E
y2 = E.y + (((sina * cosb) + (sinb * cosa)) * d);
x2 = E.x + (((cosa * cosb) - (sina * sinb)) * d);
// On dessine le contour avec une couleur sale
Canvas->Pen->Color = (TColor)0x00000001;
Canvas->MoveTo(E.x, E.y);
Canvas->LineTo(x1, y1);
Canvas->LineTo(x2, y2);
Canvas->LineTo(E.x, E.y);
// Isobarycentre du triangle
double x3 = (x1 + x2 + E.x) / 3;
double y3 = (y1 + y2 + E.y) / 3;
// Remplissage avec la couleur sale (pas tout à fait clBlack)
Canvas->Brush->Color = (TColor)0x00000001;
Canvas->FloodFill(x3,y3, (TColor)0x00000001, fsBorder); |