2012-05-07 123 views
0

我想在Windows窗体中创建一个笛卡儿坐标系,并能够绘制坐标(x,y)。VB.NET笛卡尔坐标系

我怎么做到这一点?我已经完成了我的研究,但不幸的是,我只落在“图表”而不是笛卡尔飞机上。

关于我的问题,将有助于...感谢任何链接...

+0

单词 “笛卡尔” 不会帮助你在你的搜索。只是使用术语“x-y图”。笛卡儿是隐含的,很少被提及。如果你谷歌它有很多的例子。 – 2012-05-07 15:28:53

+0

@jaime在我看来,你的编辑把它变成了一个关于简单的x-y散点图的问题。我认为OP希望能够创建自定义2D图纸 – MarkJ

+0

@您需要创建自定义2D图纸还是标准x-y散点图? – MarkJ

回答

2

你应该创建一个自定义用户控件,并使用画图甚至绘制控件的表面上。 Paint事件为您提供了一个可用于绘制图形的Graphics对象。然而,要知道的重要一点是,您需要交换Y轴。在窗口中,屏幕的左上角是0,0而不是左下角。

所以,举例来说,下面的代码将利用一个contorl的曲线图的x和y轴:

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

谢谢你给我提供这个样本,但我对这个Paint事件真的很陌生。不知道一条简单的线路穿过彼此会采取这么多的代码。我将研究这个Paint事件和Graphics对象,并将其用作参考......再次感谢。 –

+0

画线很简单。这是计算线路所需的所有思想和努力。正如你在我的例子中看到的那样,我提供了属性来设置图的外部范围,所以我的代码必须计算图的比例。如果你在屏幕上每一个点上只有一个简单的像素,代码就会简单得多。 –

+0

自定义用户控件看起来过多。为什么不像Heinzi在他的回答中所说的那样画一个PictureBox? – MarkJ

相关问题