begin process at 2010 03 21 13:29:46
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Graphique

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

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


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
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é :23 703 / 830

Auteur : florian15

Ecrire un message privé
Site perso
Commentaire sur cette source (2)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
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

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 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

Source avec Zip Source avec une capture Source .NET (Dotnet) SUPPRIMER UNE ADRESSE DE LA BARRE D'ADRESSE D'INTERNET EXPLO...
Source avec Zip Source avec une capture Source .NET (Dotnet) CAPTURE DE L'IMAGE DE LA WEBCAM
Source avec Zip Source avec une capture Source .NET (Dotnet) HORLOGE GRAPHIQUE
Source avec Zip Source avec une capture Source .NET (Dotnet) BALLES REBONDISSANTES
Source avec Zip Source avec une capture JEU DU MOT CACHÉ (STYLE PENDU)

 Sources de la même categorie

Source avec Zip Source avec une capture VISUALISATION DES IMAGES EN 3D SANS OPENGL par Pistol_Pete
Source avec Zip Source avec une capture ANALYSE DE LA TEXTURE D'UNE IMAGE : FILTRE DE GABOR par Pistol_Pete
Source avec Zip Source avec une capture MONPPM : UN AFFICHEUR .PPM par pgl10
Source avec Zip Source avec une capture MOTEUR 3D : CASTOR3D par dragonjoker59
Source avec Zip Source avec une capture VIEWER COMPLET POUR LE TRAITEMENT DE L'IMAGE : IMANALYSE par Pistol_Pete

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture CLASSE GRAPH: GESTION DES GRAPHIQUES DANS LES APPLICATIONS W... par Pistol_Pete
Source avec Zip Source avec une capture MORPION C++ (AVEC AFFICHAGE TEXTE PAS MAL), ET UNE SORTE D'I... par GUIGUI35400
Source avec Zip JEU PENDU + GRAPH par kaibacom
Source avec Zip Source avec une capture CLASSE CGRAPHXY par bobbyantho
Source avec Zip Source avec une capture PICKING OPENGL(GLUT) / INTERPOLATION BÉZIER,B-SPLINE,CATMULR... par luhtor

Commentaires et avis

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.

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


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


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,749 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales