Декартова система координат VB.NET

Я хотел бы создать декартову систему координат в форме Windows и иметь возможность отображать в ней координаты (x, y).

Как мне это сделать? Я уже провел свое исследование, но, к сожалению, я приземляюсь только на «карты», а не на декартову плоскость.

Любые ссылки, касающиеся моей проблемы, помогут ... спасибо ...


person Mark A.    schedule 07.05.2012    source источник
comment
Слово декартово не поможет вам в поиске. просто используйте термин x-y plot. Декартово подразумевается и редко упоминается. Если погуглить, можно найти множество примеров.   -  person    schedule 07.05.2012
comment
@jaime мне показалось, что ваша редакция превратила это в вопрос о простых графиках рассеяния x-y. Я думаю, что OP хочет иметь возможность создавать собственные 2D-чертежи.   -  person MarkJ    schedule 07.05.2012
comment
@user вам нужно создавать собственные 2D-чертежи или просто стандартную диаграмму рассеяния x-y?   -  person MarkJ    schedule 07.05.2012


Ответы (3)


В WinForms вы можете использовать элемент управления PictureBox, а затем рисовать на нем с помощью таких примитивов, как DrawLine, DrawEllipse и т. Д. Следующий вопрос SO содержит пример:

В WPF аналогичным образом можно использовать элемент управления Canvas:

Если вам нужны автоматические оси и маркировка, вам действительно подойдет Диаграммы. Для вашего случая использования точечная диаграмма кажется правильным решением:

person Heinzi    schedule 07.05.2012

Вы должны создать собственный UserControl и использовать Paint даже для рисования на поверхности элемента управления. Событие Paint предоставляет вам объект Graphics, который вы можете использовать для рисования графика. Однако важно знать, что вам нужно будет поменять местами ось Y. В окнах верхний левый угол экрана имеет значение 0,0, а не нижний левый.

Так, например, следующий код будет рисовать оси 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
person Steven Doggart    schedule 07.05.2012
comment
Спасибо, что предоставили мне этот образец, но я новичок в этом мероприятии Paint. Не знал, что простая линия, пересекающая друг друга, займет столько кодов. Я изучу это событие Paint и объект Graphics и буду использовать его как ссылку ... Еще раз спасибо. - person Mark A.; 07.05.2012
comment
Провести линию легко. Это расчет того, где проходит линия, требует всех размышлений и усилий. Как вы можете видеть в моем примере, я предоставил свойства для установки внешних границ графа, поэтому мой код должен вычислять масштаб графа. Если бы у вас был просто один пиксель на экране на одну точку на графике, код был бы намного проще. - person Steven Doggart; 07.05.2012
comment
Настраиваемый пользовательский контроль кажется чрезмерным. Почему бы просто не нарисовать на PictureBox, как говорит Хейнци в своем ответе? - person MarkJ; 07.05.2012
comment
В любом случае пользовательский элемент управления не намного больше накладных расходов, чем PictureBox, так почему бы не создать пользовательский элемент управления и не заключить логику в красивый многоразовый пакет. Любой способ вполне приемлем, но я не думаю, что это действительно проблема. Более сложная проблема состоит в том, как нарисовать график и нанести точки, а не на какой поверхности вы должны его нарисовать. - person Steven Doggart; 07.05.2012

В .NET есть библиотека диаграмм, но есть несколько проектов с открытым исходным кодом, которые неплохо справляются с подобными вещами. Если вы хотите построить координаты, Zedgraph делает это относительно легко и довольно гибко.

Пример ZedGraph

Также стоит обратить внимание на динамическое отображение данных, но это WPF, а не Windows Forms.

person David Rinck    schedule 07.05.2012