2012-05-07 2 views
0

Je souhaite créer un système de coordonnées cartésiennes sous forme Windows et pouvoir y tracer des coordonnées (x, y).Système de coordonnées cartésiennes VB.NET

Comment faire? J'ai déjà fait mes recherches mais malheureusement je ne suis tombé que sur des "cartes" et non sur le plan cartésien.

Tous les liens concernant mon problème contribuera à ... merci ...

+0

Le mot "cartésienne" ne vous aidera pas dans votre recherche. il suffit d'utiliser le terme "tracé x-y". Le cartésien est implicite et rarement mentionné. Il y a beaucoup d'exemples si vous le google. –

+0

@jaime m'a semblé que votre édition a transformé cela en une question sur les simples diagrammes de dispersion x-y. Je pense que l'OP veut être capable de créer des dessins 2D personnalisés – MarkJ

+0

@user avez-vous besoin de créer des dessins 2D personnalisés, ou simplement un diagramme de dispersion x-y standard? – MarkJ

Répondre

2

Vous devez créer un UserControl personnalisé et utiliser la peinture même de tirer sur la surface du contrôle. L'événement Paint vous fournit un objet Graphics que vous pouvez utiliser pour dessiner le graphique. La grande chose à savoir, cependant, est que vous aurez besoin d'échanger votre axe Y. Dans les fenêtres, le coin supérieur gauche de l'écran est 0,0 plutôt que le coin inférieur gauche.

Ainsi, par exemple, le code suivant dessinera les axes x et y d'un graphique sur un contorl:

Public Class CartesianGraph 
    Public Property BottomLeftExtent() As Point 
     Get 
      Return _bottomLeftExtent 
     End Get 
     Set(ByVal value As Point) 
      _bottomLeftExtent = value 
     End Set 
    End Property 
    Private _bottomLeftExtent As Point = New Point(-100, -100) 


    Public Property TopRightExtent() As Point 
     Get 
      Return _topRightExtent 
     End Get 
     Set(ByVal value As Point) 
      _topRightExtent = value 
     End Set 
    End Property 
    Private _topRightExtent As Point = New Point(100, 100) 


    Private Sub CartesianGraph_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint 
     Dim extentHeight As Integer = _topRightExtent.Y - _bottomLeftExtent.Y 
     Dim extentWidth As Integer = _topRightExtent.X - _bottomLeftExtent.X 
     If (extentHeight <> 0) And (extentWidth <> 0) Then 
      If (_bottomLeftExtent.Y <= 0) And (_topRightExtent.Y >= 0) Then 
       Dim xAxis As Integer = e.ClipRectangle.Height - (_bottomLeftExtent.Y * -1 * e.ClipRectangle.Height \ extentHeight) 
       e.Graphics.DrawLine(New Pen(ForeColor), 0, xAxis, e.ClipRectangle.Width, xAxis) 
      End If 
      If (_bottomLeftExtent.X <= 0) And (_topRightExtent.X >= 0) Then 
       Dim yAxis As Integer = e.ClipRectangle.Width * _bottomLeftExtent.X * -1 \ extentWidth 
       e.Graphics.DrawLine(New Pen(ForeColor), yAxis, 0, yAxis, e.ClipRectangle.Height) 
      End If 
     End If 
    End Sub 
End Class 
+0

Merci de m'avoir fourni cet exemple, mais je suis vraiment nouveau dans cet événement Paint. Je ne savais pas qu'une simple ligne se croisant prendrait autant de codes. J'étudierai cet objet Paint et cet objet graphique et je l'utiliserai comme référence ... Merci encore. –

+0

Dessiner la ligne est facile. C'est le calcul de l'endroit où va la ligne qui prend toute la pensée et l'effort. Comme vous pouvez le voir dans mon exemple, j'ai fourni des propriétés pour définir les extensions externes du graphique, mon code doit donc calculer l'échelle du graphique. Si vous n'aviez qu'un seul pixel sur l'écran pour un point du graphique, le code serait beaucoup plus simple. –

+0

Un contrôle utilisateur personnalisé semble excessif. Pourquoi ne pas simplement dessiner sur un PictureBox comme Heinzi dit dans sa réponse? – MarkJ

2

En WinForms, vous pouvez utiliser un contrôle PictureBox puis tirer dessus à l'aide primitives telles que DrawLine, DrawEllipse, etc. ce qui suit contient SO question un exemple:

Dans WPF, vous pouvez utiliser une toile contrôle similaire:

Si vous souhaitez axes automatique et l'étiquetage, graphiques sont en effet la voie à suivre. Pour votre cas d'utilisation, un tableau de points semble être la bonne solution:

0

.NET dispose d'une bibliothèque de cartographie, mais il y a quelques projets open source qui font ce genre de chose plutôt bien. Si vous voulez tracer des coordonnées Zedgraph rend cela relativement facile et est assez flexible.

ZedGraph Example

Dynamic Data Display est intéressant de regarder aussi, mais il est WPF, pas Windows Forms

Questions connexes