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 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184
| Graphics::TBitmap *Assiette = new Graphics::TBitmap;
int Ailes = 0;
int Nez = 0;
double pi = 3.14159265358979;
//--
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Assiette->Width = 201;
Assiette->Height = 201;
}
//--
int Arrondir(double D)
{
int a = D;
double r = (D - a) * 2;
return(a + r);
}
//--
double DegToRadians(int A)
{
return((double)A * pi / 180);
}
//-
void Conformer(int *A)
{
if(*A < 0)
{
*A = 360 + *A;
}
else
{
if(*A >= 360)
{
*A = *A % 360;
}
}
}
//-
void __fastcall TForm1::DrawAssiette()
{
int x;
int y;
double h;
double a;
double r;
double sina;
double cosa;
double sinb;
double cosb;
double x_gauche;
double x_droite;
TColor Ciel = clAqua;
TColor Terre = clMaroon;
if(Assiette != NULL)//Assiette est un bitmap 201 * 201//impair à cause de....
{
TCanvas *C = Assiette->Canvas;
//Effacer
C->Pen->Color = clSilver;
C->Pen->Mode = pmCopy;
C->Pen->Style = psSolid;
C->Brush->Color = clSilver;
C->Brush->Style = bsSolid;
C->Rectangle(0,0,201,201);
//Le cadre
C->Pen->Color = clBlack;
C->Brush->Style = bsClear;
//je dédouble le cadre pour éviter les problèmes lors du remplissage
C->Ellipse(0,0,201,201);
C->Ellipse(2,2,199,199);
//On calcule l'horizon par rapport à l'angle du nez.
r = 100.0; //rayon
Conformer(&Nez);
if((Nez >= 90)&&(Nez < 270))
{
//ici on est "tête en bas" lors du looping
a = DegToRadians(360.0 - Nez);
Ciel = clMaroon;
Terre = clAqua;
}
else
{
a = DegToRadians(Nez);
}
h = Arrondir(sin(a) * r);
x = Arrondir(cos(a) * r);
C->Pen->Color = clBlack;
x_gauche = - x;
x_droite = + x;
//Calcul sinus et cosinus de l'angle d'inclinaison pour les Ailes
Conformer(&Ailes);
a = DegToRadians(Ailes); //angle en radians
sinb = sin(a);
cosb = cos(a);
//rotation des points x_droite et x_gauche
sina = h / r; //les points ont le même sinus
//Pour le premier point :
cosa = x_gauche / r;
y = Arrondir(((sina * cosb) + (sinb * cosa)) * r);
x = Arrondir(((cosa * cosb) - (sina * sinb)) * r);
C->MoveTo(r + x, r + y);
//pour le deuxième point
cosa = x_droite / r;
//idem
y = Arrondir(((sina * cosb) + (sinb * cosa)) * r);
x = Arrondir(((cosa * cosb) - (sina * sinb)) * r);
C->LineTo(r + x, r + y);
//Remplissage : ciel ou terre selon la couleur Ciel
//r-1 à cause des angles 45°, 135° etc.
a = DegToRadians(Ailes + 270);
x = Arrondir(cos(a) * (r - 1 - h) / 2.0);
y = Arrondir(sin(a) * (r - 1 - h) / 2.0);
C->Brush->Color = Ciel;
C->FloodFill(r + x, r + y, clSilver, fsSurface);
//---------supprimer ces trois lignes
C->Pen->Color = clBlack;
C->Brush->Color = clYellow;
C->Rectangle( r + (x - 2), r + (y - 2), r + (x + 2), r + (y + 2));
//---------
//Remplissage terre ou ciel selon la couleur Terre
a = DegToRadians(Ailes + 90);
x = Arrondir(cos(a) * (r - 1 + h) / 2.0);
y = Arrondir(sin(a) * (r - 1 + h) / 2.0);
C->Brush->Color = Terre;
C->FloodFill(r + x, r + y, clSilver, fsSurface);
//---------à supprimer ces trois lignes
C->Pen->Color = clBlack;
C->Brush->Color = clYellow;
C->Rectangle( r + (x - 2), r + (y - 2), r + (x + 2), r + (y + 2));
//---------
//horizon
C->Pen->Color = clRed;
C->MoveTo(1,99); C->LineTo(200,99);
C->Pen->Color = clBlue;
C->MoveTo(1,100); C->LineTo(200,100);
C->Pen->Color = clRed;
C->MoveTo(1,101); C->LineTo(200,101);
Canvas->Draw(40,40,Assiette);//copie sur la form
}
}
//--
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
if(Key == VK_LEFT)
{
Ailes-=3; DrawAssiette(); Key = 0;
}
if(Key == VK_RIGHT)
{
Ailes+=3; DrawAssiette(); Key = 0;
}
if(Key == VK_UP)
{
Nez -=3; DrawAssiette(); Key = 0;
}
if(Key == VK_DOWN)
{
Nez +=3; DrawAssiette(); Key = 0;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormPaint(TObject *Sender)
{
DrawAssiette();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormResize(TObject *Sender)
{
DrawAssiette();
}
//--------------------------------------------------------------------------- |