【问题标题】:VB.NET Cartesian Coordinate SystemVB.NET 笛卡尔坐标系
【发布时间】:2012-05-08 01:25:58
【问题描述】:

我想在 Windows 窗体中制作笛卡尔坐标系,并能够在其中绘制 (x,y) 坐标。

我该怎么做?我已经做了我的研究,但不幸的是我只登陆“图表”而不是笛卡尔平面。

任何有关我的问题的链接都会有所帮助...谢谢...

【问题讨论】:

  • “笛卡尔”这个词对您的搜索没有帮助。只需使用术语“x-y 图”。笛卡尔是含蓄的,很少被提及。如果你用谷歌搜索的话,会有很多例子。
  • @jaime 在我看来,您的编辑将其变成了一个关于简单 x-y 散点图的问题。我认为 OP 希望能够创建自定义 2D 图纸
  • @user 你需要创建自定义的 2D 绘图,还是只需要一个标准的 x-y 散点图?

标签: vb.net forms system coordinate cartesian


【解决方案1】:

在 WinForms 中,您可以使用 PictureBox 控件,然后使用 DrawLine、DrawEllipse 等图元在其上进行绘制。以下 SO 问题包含一个示例:

在 WPF 中,您可以类似地使用 Canvas 控件:

如果您想要自动轴和标签,图表确实是要走的路。对于您的用例,点图似乎是正确的解决方案:

【讨论】:

    【解决方案2】:

    您应该创建一个自定义 UserControl 并使用 Paint 甚至在控件的表面上进行绘制。 Paint 事件为您提供了一个 Graphics 对象,您可以使用它来绘制图形。然而,最重要的是,您需要交换 Y 轴。在 windows 中,屏幕的左上角是 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
    

    【讨论】:

    • 感谢您为我提供这个示例,但我对这个 Paint 事件真的很陌生。不知道一条简单的相互交叉的线会占用这么多代码。我将研究此 Paint 事件和 Graphics 对象并将其用作参考...再次感谢。
    • 画线很容易。计算线路的走向需要所有的思考和努力。正如您在我的示例中看到的那样,我提供了设置图表外部范围的属性,因此我的代码必须计算图表的比例。如果图表上每一个点在屏幕上只有一个简单的像素,那么代码会简单得多。
    • 自定义用户控件似乎过多。为什么不像 Heinzi 在他的回答中所说的那样直接在 PictureBox 上绘图?
    • 无论如何,用户控件的开销并不比 PictureBox 多得多,所以为什么不制作一个用户控件并将逻辑封装在一个很好的可重用包中。无论哪种方式都是完全可以接受的,但我认为这不是真正的问题。更难解决的问题是,你如何绘制图形并绘制点,而不是你应该在什么样的表面上绘制它。
    【解决方案3】:

    .NET 有一个图表库,但是有一些开源项目可以很好地完成这类事情。如果你想绘制坐标,Zedgraph 使这相对容易并且非常灵活。

    Dynamic Data Display也值得一看,不过是WPF,不是Windows Forms

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-25
      • 2016-12-10
      • 1970-01-01
      • 2019-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多