Accueil > > > COURBE DE BÉZIER EN TROIS POINTS (CONSTRUCTIONS BARYCENTRIQUES)
COURBE DE BÉZIER EN TROIS POINTS (CONSTRUCTIONS BARYCENTRIQUES)
Information sur la source
Description
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
- #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;
- }
-
-
-
- };
- }
#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
Historique
- 07 avril 2006 15:17:18 :
- Courbe de Bézier avec construction barycentrique et non avec la fonction toute faite de .net.
- 07 avril 2006 15:47:00 :
- exécutable renommé en .ex pour qu'il soit téléchargeable. ;-)
- 07 avril 2006 15:47:31 :
- exécutable renommé en .ex pour qu'il soit téléchargeable. ;-)
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Tracer graphique en fonction d'un tableau [ par Bobbix ]
Bonjour,Dans le cadre d'un projet, j'ai besoin de votre aide sur le graphisme en WIN32. Nous avons réalisé une carte électronique d'un oscilloscope qu
Librairie graphique et controle... [ par frednet01 ]
J'ai un projet personnelle, qui consisterais a déplacer des images (des pions) sur une autre image (une carte) avec différent effet graphique ( smog,
fonction graphique [ par dupdavid ]
salut a tous, je cherche une liste des fonctions graphiques avec les valeurs a donner pour pouvoir traces des carré, des lignes, des ronds, etc ...mer
je n'ai ni VC++, ni BC++Builder, j'utilise cygwin et gcc, je ne possede pas de lib graphique, comment faire [?] [ par Patalou ]
Salut a ts, je suis nouveau,je suis en train de dev la resolution du rubis'cube, je voudrais pouvoir l'afficher avec des losanges et autres lignes mai
prob [ par Avogadro59 ]
Je cherche comment faire pour écrire un résultat retourner en C dans mon interface graphique et comment lire un choix dans l'interface graphique car m
bogue turbo c++ en mode graphique [ par LaFoUiN ]
bon voila mon probleme : je programme beaucoup en utilisant le mode graphique avec les BGI et la bibiothéque graphic.h et depuis quelques temps a la f
Calque pour application graphique [ par Grand_steak ]
Bonjour, J'aimerai un petit coup de main pour développer mon appli. graphique.Je dessine une courbe contenant un nbre important de point.Jusque là, pa
Blibliothèque graphique basique [ par Wiiip ]
Salut !Je cherche à faire la version graphique du jeu puissance 4 (déja sur le site)Je cherche une blibliothèque graphique pour CPP agréable : (une bo
emulateur terminal graphique TEKTRONIK-4105 [ par MADRABBIT ]
Je recherche tout ou partie de code / OCX ou autre pour faire un émulateur de terminal graphique de type TEKTRONIK-4105 , 4106, 4107, 4109A, 4110 ou 4
Interface graphique avec QT [ par zekicker ]
Salut,J'ai fait un prog en C et je voudrais savoir si je pouvais faire l'interface graphique avec QT.Sinon je suis ouvert à toute sugestionMerci
|
Derniers Blogs
L'INTERFACE NATURELLE DE WINDOWS PHONE 7 SERIESL'INTERFACE NATURELLE DE WINDOWS PHONE 7 SERIES par odewit
La tendance est aux interfaces naturelles (NUI), et le keynote de Bill Buxton au MIX l'a bien souligné.
La charte graphique et ergonomique de Windows Phone 7 a donc été entièrement repensée en vue d'obtenir un maximum d'efficacité sur ce point. En re...
Cliquez pour lire la suite de l'article par odewit COMMENT MAPPER UNE VUE SQL SUR UNE COLLECTION DE COMPLEX TYPE?COMMENT MAPPER UNE VUE SQL SUR UNE COLLECTION DE COMPLEX TYPE? par Matthieu MEZIL
Avec EF, les vues doivent être mappées sur des entity types. Le problème c'est que les entity types doivent avoir une clé. Avec EF, nous avons les complex type qui n'ont pas de clé mais les vues ne peuvent pas être mappées dessus. Avec EF4, il est possibl...
Cliquez pour lire la suite de l'article par Matthieu MEZIL [WF4] UN BINDING ACTIVITY/ACTIVITYDESIGNER QUI PASSE MAL?[WF4] UN BINDING ACTIVITY/ACTIVITYDESIGNER QUI PASSE MAL? par JeremyJeanson
Certain d'entre vous on peut être vécu cette situation embarrassante après quelques temps passer avec WF4 : Au début avec mon " ActivityDesigner" , tout allait bien. Et puis un jour j'ai au des problèmes de " Binding" . Alors nous sommes allé sur le site ...
Cliquez pour lire la suite de l'article par JeremyJeanson
Forum
TRADAIONTRADAION par shootangel
Cliquez pour lire la suite par shootangel
Logiciels
Academy System (10.9.4.0)ACADEMY SYSTEM (10.9.4.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Xilisoft Convertisseur Vidéo Ultimate (5.1.39.0305)XILISOFT CONVERTISSEUR VIDéO ULTIMATE (5.1.39.0305)Xilisoft Convertisseur Vidéo Ultimate est un outil puissant de conversion vidéo, facile à utilise... Cliquez pour télécharger Xilisoft Convertisseur Vidéo Ultimate Xilisoft DVD Ripper Ultimate (5.0.64.0304)XILISOFT DVD RIPPER ULTIMATE (5.0.64.0304)Xilisoft DVD Ripper Ultimate est un logiciel excellent pour copier et convertir DVD vers presque ... Cliquez pour télécharger Xilisoft DVD Ripper Ultimate Rigs of Rods (63.3)RIGS OF RODS (63.3)c'est un jeu de multi-simulation camions,autobus voitures, avions, bateaux, hélicoptère avec défo... Cliquez pour télécharger Rigs of Rods
|