Salut à tous,
J’aimerai savoir comment créer un segment de droite de taille déterminée qui passe par un point dont les coordonnées sont connues. (Je travaille sur une image BMP).
Si vous avez une idée n’hésitez pas à me laisser un message
Salut à tous,
J’aimerai savoir comment créer un segment de droite de taille déterminée qui passe par un point dont les coordonnées sont connues. (Je travaille sur une image BMP).
Si vous avez une idée n’hésitez pas à me laisser un message
Bonsoir,
Pour définir ton segment de droite à partir de son point d'origine, et de sa taille, de manière unique, il te faut aussi une direction. L'as tu?
Cordialement,
Benjamin
En 2secondes cela se fait :Envoyé par bahiatoon
*charger l'image voir aide Borland
*avec TCanvas adresser les pixels
*prendre l'algo de Bresenham
Salut bahiatoon:
Peut etre en utilisant LineTo(x, y) et MoveTo(x,y)
oui sinon avec TCanvas::LineTo et MoveTo
lol, apparemment je me suis laissé emporté par les mathématiques .
Ben oui, pour moi, un point et une taille ne suffisent pas pour déterminer un segment.
Mon segment doit être perpendiculaire à son point d'origine
A+
Bonsoir,
Désolé, mais un segment perpendiculaire à un point, cela ne me dit rien...
Si tu me dis perpendiculaire à un segment, à une droite, à une direction, je te comprends, mais à un point, cela me parait trés énigmatique...
Cordialement,
Benjamin
ce point est un point contour donc je cherche un segment perpendiculaire à la direction de ce point.Mon segment doit être perpendiculaire à son point d'origine
et je voudrai par la suite faire tourner ce segment dans toutes les autres directions
A+
Bonjour,
Je ne suis toujours pas trés sure de te suivre. Je vais tout de même te proposer une solution, en partant des hypothèses suivantes:
Soit Pi = (Pix, Piy), le point initial de ton segment.
Soit Vect_Pi = (Vect_Pix,Vect_Piy) la direction associé au point Pi (c'est de cette notion que je ne suis pas bien sure de te suivre...).
Soit Taille, la taille du segment.
Ce que je pose:
Soit Pf = (Pfx, Pfy), le point final que tu cherches.
Soit Vect_Seg = (Pfx-Pix,Pfy-Piy)
Proposition de résolution:
Ton segment doit être de taille Taille: Taille*Taille = (Pfx-Pix) * (Pfx-Pix) + (Pfy-Piy) * (Pfy-Piy)
Ton segment doit être perpendiculaire à la direction Vect_Pi, soit le produit scalaire entre Vect_Pi et Vect_Seg doit être nul:
Vect_Pix * (Pfx-Pix) + Vect_Piy * (Pfy-Piy) = 0
Aprés résolution tu obtiendras (j'ai la flemme d'écrire le détail):
Tu peux changer le signe (pfx = Pix - Taille * sqrt(1/(1+Vect_Pix*Vect_Pix/(Vect_Piy*Vect_Piy))) suivant la direction de la perpendiculaire que tu veux.pfx = Pix + Taille * sqrt(1/(1+Vect_Pix*Vect_Pix/(Vect_Piy*Vect_Piy)))
pfy = Piy + Taille * sqrt(1/(1+Vect_Piy*Vect_Piy/(Vect_Pix*Vect_Pix)))
Exemple d'application:
Ce petit bout de code demande à l'utilisateur de cliquer sur la forme pour definir le point initial.
Le segment dessiné est orthogonal à la direction donné par la position de la sourie.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 //--------------------------------------------------------------------------- #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> //--------------------------------------------------------------------------- //Déclaration d'un type point et d'un type vecteur typedef struct { int x,y; } Vecteur2D; typedef struct { int x,y; } Point2D; class TForm1 : public TForm { __published: // IDE-managed Components void __fastcall OnDrawSeg(TObject *Sender, TShiftState Shift, int X, int Y); void __fastcall OnSelectInitPoint(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y); private: // User declarations public: // User declarations __fastcall TForm1(TComponent* Owner); //Declaration du point initial Point2D Pi; //Declaration de Pf Point2D Pf; int SegSize; }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endifEn espérant t'avoir aidé...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 //--------------------------------------------------------------------------- #include <vcl.h> #include <Math.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { //Initialisation de Pi Pi.x = 0; Pi.y = 0; //Initialisation de Pf Pf.x = 0; Pf.y = 0; //Initialisation de SegSize SegSize = 200; } //--------------------------------------------------------------------------- void __fastcall TForm1::OnDrawSeg(TObject *Sender, TShiftState Shift, int X, int Y) { if (Pi.x == 0 || Pi.y == 0) return; //Je pose Vect_Pi comme étant la direction entre Pi et la position courante //de la sourie Vecteur2D Vect_Pi; Vect_Pi.x = X-Pi.x; Vect_Pi.y = Y-Pi.y; if (Vect_Pi.x == 0 || Vect_Pi.y == 0) return; //Dessin du segment precedent pour l'effacer (mode Xor) if (Pf.x != 0 && Pf.y != 0){ this->Canvas->Pen->Color = clRed; //couleur du crayon this->Canvas->Pen->Mode = pmXor; this->Canvas->MoveTo(Pi.x,Pi.y); this->Canvas->LineTo(Pf.x,Pf.y); } //Calcul de pf if (Vect_Pi.x>0) Pf.x = Pi.x + SegSize * sqrt(1./(1.+ (double)Vect_Pi.x*(double)Vect_Pi.x/((double)Vect_Pi.y*(double)Vect_Pi.y))); else Pf.x = Pi.x - SegSize * sqrt(1./(1.+ (double)Vect_Pi.x*(double)Vect_Pi.x/((double)Vect_Pi.y*(double)Vect_Pi.y))); if (Vect_Pi.y>0) Pf.y = Pi.y - SegSize * sqrt(1./(1.+ (double)Vect_Pi.y*(double)Vect_Pi.y/((double)Vect_Pi.x*(double)Vect_Pi.x))); else Pf.y = Pi.y + SegSize * sqrt(1./(1.+ (double)Vect_Pi.y*(double)Vect_Pi.y/((double)Vect_Pi.x*(double)Vect_Pi.x))); //Dessin du segment this->Canvas->Pen->Color = clRed; //couleur du crayon this->Canvas->Pen->Mode = pmXor; this->Canvas->MoveTo(Pi.x,Pi.y); this->Canvas->LineTo(Pf.x,Pf.y); } //--------------------------------------------------------------------------- void __fastcall TForm1::OnSelectInitPoint(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { //affectation du point initial Pi.x = X; Pi.y = Y; } //---------------------------------------------------------------------------
Cordialement,
Benjamin
Partager