2014-12-19 2 views
3

Я хочу создать график с тремя точками, а затем нарисовать линию. это будет следующим образом: ! [C# form chart] [1] Но мое кодирование едва рисует линию и точек. пожалуйста, помогитеТочка отсчета и ничья линии

public partial class Form5 : Form 
{ 
    public Form5() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     Point[] pts = { new Point(150, 12), new Point(130, 15), new Point(160, 18) }; 
     //int count = 0; 

     // pts[count] = new Point((int)NumericUpDown1.Value, (int)NumericUpDown2.Value); 
     for (int i = 0; i < pts.Length; i++) 
     { 
      if (i != 0) 
      { 
       this.CreateGraphics().DrawLine(new Pen(Brushes.Black, 3), pts[i - 1], pts[1]); 
      } 
      else 
      { 
       this.CreateGraphics().DrawLine(new Pen(Brushes.Black, 3), pts[i], pts[1]); 
      } 
     } 
    } 
} 
+0

Где примера изображения диаграммы идут? –

ответ

0

Основная проблема в вашем коде жестко закодирована pts[1]. Вместо этого вы должны использовать pts[i]. И помните: индексирование массива в C# начинается с нуля.

Также вам не нужно создавать графику на каждой итерации. Объявите локальную переменную и переместите ее вне цикла. И вместо того, чтобы проверять значение цикла на каждой итерации, вы можете перемещать чертеж первой точки также вне цикла. Тогда вы будете иметь возможность обрабатывать другие точки с таким же образом:

var g = this.CreateGraphics(); 
var blackPen = new Pen(Brushes.Black, 3); 

g.DrawLine(blackPen, pts[0], pts[0]); 

for(i = 1; i < pts.Length; i++) 
    g.DrawLine(blackPen, pts[i - 1], pts[i]); 

Примечание: вы пометили вопрос с Linq тегом. Конечно, вы можете использовать Linq для создания пары точек, и использовать эти пары рисовать линии:

var lines = pts.Zip(pts.Skip(1), (a,b) => new { a, b }); 

foreach(var line in lines) 
    g.DrawLine(blackPen, line.a, line.b); 
+0

-3: Каждая ошибка чертежа Winforms есть: вы должны использовать DrawLines, а также событие Paint! И вы должны избавиться от ручки ...! – TaW

+0

@TaW вы видите обработчик событий в моем ответе? Ответ недействителен? обычно я использую Pen/Brush и другой объект gdi как поле класса и располагаю их в форме dispose. -1 для обозначения действительного ответа как «не полезного», что является ложью. Вы не можете повышать или писать комментарии, если у вас есть что-то для улучшения. –

+0

Вы продолжаете использовать CreateGraphics, что явно указывает на то, что вы не используете событие paint. Поэтому ваш ответ не только не полезен, но и вреден. Что касается вашего отрицательного ответа, так как это не помогает в мести, это явно нарушает все правила голосования SO. И вы называете меня лжецом, оставляя меня (почти) безмолвным. – TaW

-1

Вот правильный код:

// keep your data at class level: 
// lists are more flexible than arrays: 
List<Point> pts = new List<Point>(); 

// all drawing in the paint event: 
private void Form1_Paint(object sender, PaintEventArgs e) 
{ 

    // put the pen creation in a using scope: 
    using (Pen Pen = new Pen(Color.Red, 3f)) 
    { 
     // make the corners nicer: 
     pen.MiterLimit = pen.Width/2f; 

     // drawing all lines in one call greatly improves quality. 
     // we need at least two points: 
     if (pts.Count > 1) e.Graphics.DrawLines(Pen, pts); 
    } 
} 

// trigger the drawing when needed, eg when you have added more points: 
private void button1_Click(object sender, EventArgs e) 
{ 
    // maybe add more points.. 
    pts.AddRange(new Point[] 
       { new Point(150, 12), new Point(130, 15), new Point(160, 18) }); 

    // trigger the paint event 
    this.Invalidate(); 
} 

Рассмотрим рисунок на Panel! Это позволит вам перемещать его и размещать все элементы управления независимо от вашего Form.

Если вы серьезно относитесь к созданию диаграммы, подумайте об использовании элемента управления в ящике данных на панели инструментов!

В нем есть все, что нужно для реального графика, включая маркированные оси и многообразный дисплей.

Чтобы использовать ваши данные все, что требуется в эти несколько строк:

using System.Windows.Forms.DataVisualization.Charting; 
//.. 
private void button2_Click(object sender, EventArgs e) 
{ 
    chart1.Legends.Clear(); 
    chart1.Series[0].ChartType = SeriesChartType.FastLine; 
    chart1.Series[0].Color = Color.Red; 
    chart1.Series[0].BorderWidth = 3; 

    chart1.Series[0].Points.AddXY(130, 15); 
    chart1.Series[0].Points.AddXY(150, 12); 
    chart1.Series[0].Points.AddXY(160, 18); 
} 

Обратите внимание, что я упорядоченные точки, но это не является необходимым для всех charttypes. Я использую Fastline и с вашим оригинальным заказом работает. Он может даже отображать несколько точек с той же X-Value ..! И проклятие автоматически масштабируется.

Также обратите внимание, что на диаграмме отображаются Y-значения естественным образом, то есть снизу вверх, тогда как GDI рисует сверху вниз!

Вот скриншот из обоих способов показать таблицу:

enter image description here

+0

-X много проблем. Этот ответ не связан с вопросом ОП. НЕТ ответа на проблему ОП. Именование ужасно - 'pts' вместо' points', button1, button2 и т. Д. Также каждый щелчок кнопки добавляет другой набор одинаковых точек в список 'pts'. Это ошибка. –

+0

Вместо комментариев в комментариях вы должны прочитать мой код, включая комментарии. И, конечно же, следует продолжать именовать, если это поможет OP относиться к его проектному коду. Никаких ошибок для исправления здесь. – TaW

+0

Вместо того, чтобы спорить, вы должны прочитать мои комментарии и вопрос OP. Также было бы неплохо прочитать ** очень внимательно ** [описание downvoting и когда оно должно быть применено] (http://stackoverflow.com/help/privileges/vote-down) –

Смежные вопросы