Ce code permet de tracer une courbe de Bezier sur la fenêtre avec trois points.
l'utilisateur clique une premiere fois pour placer sont premier point, puis une deuxieme fois en maintenant le clic enfoncé et en déplacant la souris pour faire apparaitre le point de gravité de la courbe et la courbe elle-même.
le principe de la courbe de Bézier est de trouver les points de controle par lesquels la courbe passe, grace aux barycentres.Voir votre cours de math ... ;-)
Source / Exemple :
#pragma once
namespace courbe
{
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
using namespace System::Threading;
public __gc class Form1 : public System::Windows::Forms::Form
{
//déclaration des outils de tracage
Pen *crayon,*crayon1,*crayon3,*crayon4;
//variables
Point depart,arrivee,gravite,souris,depart2,depart3,arrivee2,centre,plus;
bool boutonEnfonce, dessine;
int figure;
Graphics *surface;
int nombre;
private: System::Windows::Forms::Panel * panel1;
private: System::Windows::Forms::Label * label1;
private: System::Windows::Forms::ComboBox * finesse;
private: System::Windows::Forms::CheckBox * checkBox2;
private: System::Windows::Forms::CheckBox * checkBox1;
public:
Form1(void)
{
InitializeComponent();
//initialisation des outils de tracage
crayon = new Pen(Color::Red,2);
crayon1 = new Pen(Color::Blue,2);
crayon3 = new Pen(Color::Green,1);
crayon4 = new Pen(Color::Black,1);
}
protected:
void Dispose(Boolean disposing)
{
if (disposing && components)
{
components->Dispose();
}
__super::Dispose(disposing);
}
private: System::Windows::Forms::StatusBar * statusBar1;
private:
System::ComponentModel::Container * components;
void InitializeComponent(void)
{
... }
private: System::Void Form1_MouseDown(System::Object * sender, System::Windows::Forms::MouseEventArgs * e)
{
if(figure==0)//au premier clique
{
dessine=false;
//placer le premier point la ou se trouve la souris (variable e)
depart.X=e->get_X();
depart.Y=e->get_Y();
boutonEnfonce=true;
figure=1;
}
else
{
if(figure==1)//au deuxieme clique
{
figure=2;
dessine=true;
boutonEnfonce=true;
//placer le deuxieme point la ou se trouve la souris (variable e)
arrivee.X=e->get_X();
arrivee.Y=e->get_Y();
gravite.X=arrivee.X;
gravite.Y=arrivee.Y;
}
}
if(figure==3)//au troisieme clic
{
//pour permettre un nouveau tracage
figure=0;
}
}
private: System::Void Form1_MouseMove(System::Object * sender, System::Windows::Forms::MouseEventArgs * e)
{//quand on glisse la souris
if(boutonEnfonce && figure==2)
{ //si nous sommes au deuxieme clique et si le clique de la souris est toujours actif
//on détermine la position de la souris
souris.X=e->X;
souris.Y=e->Y;
//on détermine le centre de gravité
gravite.X=arrivee.X+(arrivee.X-e->X);
gravite.Y=arrivee.Y+(arrivee.Y-e->Y);
}
Invalidate();
}
private: System::Void Form1_MouseUp(System::Object * sender, System::Windows::Forms::MouseEventArgs * e)
{
//quand on relache le clic
boutonEnfonce=false;
if(figure==2){figure=3;}
}
private: System::Void Form1_Paint(System::Object * sender, System::Windows::Forms::PaintEventArgs * e)
{
if(figure==1)
{
//traçage du premier point
surface=CreateGraphics();
plus.X=depart.X+2;
plus.Y=depart.Y+2;
surface->DrawLine(crayon,depart,plus);
surface->Dispose();
this->statusBar1->Text="Posez votre 2eme point en cliquant/glissant pour placer le centre de gravité";
}
if(dessine)
{
//traçage de la courbe
surface=CreateGraphics();
if(this->checkBox2->Checked)
{
//afficher les vecteurs
surface->DrawLine(crayon1,depart,gravite);
surface->DrawLine(crayon1,gravite,arrivee);
}
if(figure<3)
{//affichage de la construction du centre de gravité en cours
surface->DrawLine(crayon3,gravite,souris);
plus.X=souris.X+2;
plus.Y=souris.Y+2;
surface->DrawLine(crayon1,souris,plus);
}
//récupération du pas (finesse) et oint de départ de la courbe
nombre=Convert::ToInt32(this->finesse->SelectedItem->ToString());
depart3=depart;
for(int i=0; i<nombre+1;i++)
{
//détermination des points barycentriques
depart2.X=depart.X+((gravite.X-depart.X)*i/nombre);
depart2.Y=depart.Y+((gravite.Y-depart.Y)*i/nombre);
arrivee2.X=gravite.X+((arrivee.X-gravite.X)*i/nombre);
arrivee2.Y=gravite.Y+((arrivee.Y-gravite.Y)*i/nombre);
if(this->checkBox1->Checked)//si l'on veut voir les traits de construction
surface->DrawLine(crayon4,depart2,arrivee2);
//détermination du centre de gravité
centre.X=depart2.X+((arrivee2.X-depart2.X)*i/nombre);
centre.Y=depart2.Y+((arrivee2.Y-depart2.Y)*i/nombre);
//traçage segment
surface->DrawLine(crayon,depart3,centre);
depart3=centre;
}
surface->Dispose();
this->statusBar1->Text="Glissez avec la souris";
}
if(figure==3)
{
//laisser la courbe afficher
this->Cursor=Cursors::Hand;
this->statusBar1->Text="Admirez votre courbe de Bézier, et cliquez a nouveau pour retracer une courbe";
}
if(figure==0)
{
//atttente d'un nouveau clic
this->Cursor=Cursors::Cross;
this->statusBar1->Text="Placez votre 1er point";
}
}
private: System::Void Form1_Load(System::Object * sender, System::EventArgs * e)
{
this->finesse->SelectedIndex=12;
}
};
}
Conclusion :
Principe des courbes de Bézier appris en Math en BTS IRIS
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.