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 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
|
const double Barb_angle 0.35 // angle par défaut d'une barbe avec sa flèche
const int Barb_length 20 // longueur par défaut d'une barbe
//----------------------------------------------------------------------------
class Arrow : public Shape {
public:
Arrow(Point from, Point to); // from = queue de la flèche, to = pointe de la flèche
Arrow(Point from, Point to, int barb_length, double barb_angle); // barb__length = longueur de la barbe
// barb_angle = angle de la barbe avec le corps de la flèche
void draw_lines() const; // dessine la flèche sur l'écran
int barb_length() const { return d; }
void set_barb_length(int dd) { d = dd; }
double barb_angle() { return Alpha;}
void set_barb_angle(double a) { Alpha = a;}
private:
int d; // longueur de chacune des barbes de la flèche
double Alpha; // angle aigu de chaque barbe avec le corps de la flèche, exprimé en radians
vector<int> barbs_ends(const Point& A, const Point& B, const int& d, const double& Alpha) const; // renvoie un vecteur contenant les coordonnées des extrémités des barbes
};
//----------------------------------------------------------------------------
Arrow::Arrow(Point from, Point to)
: d(Barb_length), Alpha(Barb_angle)
{
if (from.x == to.x && from.y == to.y )
error("Flèche nulle");
add(from); // point(0)
add(to); // point(1)
vector<int> ends;
ends = barbs_ends(point(0),point(1),d,Alpha); // barbs_ends() renvoie un vecteur contenant les coordonnées des extrémités des barbes
Point M1; M1.x = ends[0]; M1.y = ends[1];
Point M2; M2.x = ends[2]; M2.y = ends[3];
add(M1); // point(2)
add(M2); // point(3)
}
//----------------------------------------------------------------------------
Arrow::Arrow(Point from, Point to, int barb_length, double barb_angle)
: d(barb_length), Alpha(barb_angle)
{
if (from.x == to.x && from.y == to.y )
error("Flèche nulle");
if ( d <= 0 || Alpha <= 0 )
error("Flèche imberbe");
add(from);
add(to);
vector<int> ends;
ends = barbs_ends(point(0),point(1),d,Alpha); // barbs_ends() renvoie un vecteur contenant les coordonnée s des extrémités des barbes
Point M1; M1.x = ends[0]; M1.y = ends[1];
Point M2; M2.x = ends[2]; M2.y = ends[3];
add(M1); // point(2)
add(M2); // point(3)
}
//----------------------------------------------------------------------------
void Arrow::draw_lines() const
{
// point(0) = queue de la flèche, point(1) = tête de la flèche
if(color().visibility()) {
fl_line(point(0).x,point(0).y, point(1).x, point(1).y); // tracé du corps de la flèche
fl_line(point(1).x, point(1).y, point(2).x, point(2).y); // tracé des deux barbes
fl_line(point(1).x, point(1).y, point(3).x, point(3).y);
}
}
//----------------------------------------------------------------------------
vector<int> Arrow::barbs_ends(const Point& A, const Point& B, const int& d, const double& Alpha) const
{
// A = queue de la flèche, B = pointe de la flèche
// d = longueur de chaque barbe
// Alpha = angle de la barbe avec le corps de la flèche, en radians
// la fonction renvoie un vecteur contenant les coordonnées x,y des points M1 (v[0],v[1])
// et M2 ((v[2],v[3]) tels que :
// BM1 = barbe gauche (en regardant la pointe depuis la queue)
// BM2 = barbe droite (en regardant la pointe depuis la queue)
// Norme = distance AB
double Norme = sqrt( pow(A.x-B.x,2) + pow(A.y-B.y,2) );
double M1_x, M1_y, M2_x, M2_y; // coordonnées des extrémités M1 et M2 des deux barbes
double Ix = (A.x-B.x)/Norme;
double Iy = (A.y-B.y)/Norme;
double Jx = Iy;
double Jy = -1*Ix;
double Dx = d*cos(Alpha);
double Dy = d*sin(Alpha);
M1_x = B.x + Dx*Ix - Dy*Jx;
M1_y = B.y + Dx*Iy - Dy*Jy;
M2_x = B.x + Dx*Ix + Dy*Jx;
M2_y = B.y + Dx*Iy + Dy*Jy;
vector<int> ends; // pour les coordonnées des extrémités M1 et M2 des deux barbes
ends.push_back(int(M1_x));
ends.push_back(int(M1_y));
ends.push_back(int(M2_x));
ends.push_back(int(M2_y));
return ends;
}
//----------------------------------------------------------------------------
int main()
{
Simple_window win(Point(10,10), 600, 650, "Arrow");
// flèche avec les barbes "standards"
Arrow Fleche1(Point(250,400), Point(200,400));
// flèche avec des barbes "personnalisées"
Arrow Fleche2(Point(70,30), Point(270,150), 150, 0.15);
win.attach(Fleche1);
win.attach(Fleche2);
win.wait_for_button();
} |
Partager