begin process at 2008 07 19 09:19:05
1 212 728 membres
67 nouveaux aujourd'hui
14 165 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

COURBE DE BÉZIER EN TROIS POINTS (CONSTRUCTIONS BARYCENTRIQUES)


Information sur la source

Catégorie :Graphique Source .NET ( DotNet ) Classé sous : courbe, bézier, graphique, barycentres, troispoints Niveau : Initié Date de création : 05/04/2006 Date de mise à jour : 07/04/2006 15:47:31 Vu / téléchargé: 18 601 / 724

Note :
9 / 10 - par 3 personnes
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (2)
Ajouter un commentaire et/ou une note

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
Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

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. ;-)
  • signaler à un administrateur
    Commentaire de JJDai le 06/04/2006 20:32:18

    Il me semblait qu'il fallait 4 points pour définir une de bézier.
    Interressant quand même.

  • signaler à un administrateur
    Commentaire de jrbleboss le 13/11/2006 20:09:23

    Bin parce que les "vrai" (enfin les plus completes) béziersn utilisent les courbes d'Hermites : tu définie 2 points et leur tangente.

Ajouter un commentaire

Pub



Appels d'offres

Dessins techniques
Budget : 60€
Animation Flash - Doma...
Budget : 370€
Application flash medi...
Budget : 1 000€

Snippets en rapport

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS