2016-12-15 17 views
0

Мне действительно нужна помощь здесь. Я пытаюсь создать программу, подобную игре «, соединяющей точки», где у вас есть точки с номерами из (1 ... n + 1), и вам нужно соединить их с линиями. Итак, у меня есть панель, и я прочитал из файла координаты точек. Но я застрял, потому что не могу понять, как соединить точки с линиями.Подключение точек в соответствии со строкой

My current outcome


Подводя итог, что я хочу сделать:

  • Вы нажимаете на точку 1, при нажатии на точку 2, и они соединяются с линией, в противном случае они не подключения.
  • И вам нужно объединить точки в порядке от 1 до n + 1. Надеюсь, вы поймете меня. Танки много вперед!

private void panel1_Paint(object sender, PaintEventArgs e) 
    { 
     List<String> pav1; 
     pav1 = new List<String>(); 
     StreamReader datafile = new StreamReader("pav1.txt"); 

    int[] X = new int[100]; 
    int[] Y = new int[100]; 
    int k = 0; 
    string line; 

    while (datafile.Peek() >= 0) 
    { 
     line = datafile.ReadLine(); 
     X[k] = Int16.Parse(line); 
     line = datafile.ReadLine(); 
     Y[k] = Int16.Parse(line); 
     k++; 
    } 
    datafile.Close(); 
    Brush aBrush = (Brush)Brushes.Black; 
    for (int i = 0; i < k; i++) 
    { 
     e.Graphics.FillEllipse(aBrush, X[i], Y[i], 10, 10); 
     e.Graphics.DrawString((i + 1).ToString(), new Font("Arial", 10), 
       System.Drawing.Brushes.Gray, new Point(X[i] + 20, Y[i])); 
    } 

} 
+1

Шаг 1) замените массивы на «Список » для большей гибкости и создайте «Список ListOfPoints'. Шаг 2) Добавьте «ListOfPoints.Add» ([новая точка (Xk], Y [k])); «Шаг 3) Добавьте« e.Graphics.DraLines (Pens.Red, ListOfPoints.ToArray() ' – TaW

+0

TaW, извините, я не могу получить, что там делать. Я могу изменить список, но моя проблема заключается в том, как рисовать линии и подключать точки. Где я застрял – Luna

+0

Чтобы нарисовать линию, используйте 'Graphics.DrawLine'. Для рисования нескольких строк используйте 'Graphics.DrawLines'. Кроме того: __обработка в данных должна происходить только один раз__ или всякий раз, когда данные __change__, а не в событии Paint !!! – TaW

ответ

0

Прежде всего, возьмите очки из panel_paint и добавьте дополнительное свойство, такое как порядковый номер. Таким образом, вместо массивов X [] и Y [], вы должны сделать класс как это:

public class Dot 
{ 
    public Point Coordinates { get; set; } 
    public int Ordinal { get; set; } 
} 

, а затем

List<Dot> Dots { get; set; } 

сделать два реквизита для первого и второго выбранных точек

private Dot FirstDot { get; set; } 
private Dot SecondDot { get; set; } 

Заполните этот список так же, как вы заполняете X[] и Y[] Массивы.

Затем добавьте OnMouseClick обработчик на панели и в нем написать что-то вроде этого:

private void panel1_MouseClick(object sender, MouseEventArgs e) 
    { 
     //check if user clicked on any of dots in list 
     var selectedDot = Dots.FirstOrDefault(dot => e.X < dot.Coordinates.X + 10 && e.X > dot.Coordinates.X 
      && e.Y < dot.Coordinates.Y + 10 && e.Y > dot.Coordinates.Y); 

     //dot is found, add it to selected first or second dot property 
     if (selectedDot != null) 
     { 
      if (FirstDot == null) 
       FirstDot = selectedDot; 
      else if (SecondDot == null) 
       SecondDot = selectedDot; 
     } 

    } 

теперь, в вашем методе рисования вы должны проверить, если обе точки установлены, и если они есть, проверить, если они один рядом с другим, что-то вроде

if (FirstDot.Ordinal + 1 == SecondDot.Ordinal) 

, то вы можете рисовать линии с помощью

e.Graphics.DrawLine(aBrush, FirstDot.Coordinates, SecondDot.Coordinates); 

Это должно быть так. Надеюсь, вы поймете, как это реализовать. Помимо нескольких проверок, это должно быть так.

+0

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

+0

Благодарим вас за ответ. Мне удалось сделать программу. Дело закрыто. – Luna

0

Используйте метод Graphics.Draw(), я не знаю, почему вы используете эллипс рисунок. И ваша петля должна выглядеть как

var myFont = new Font("Arial", 10); 
for (int i = 0; i < k; i += 2) 
{ 
    var point1 = new Point(X[i], Y[i]); 
    var point2 = new Point(X[i + 1], Y[i + 1]); 
    e.Graphics.DrawLine(aBrush, point1, point2); 
    e.Graphics.DrawString((i + 1).ToString(), myFont, System.Drawing.Brushes.Gray, point1); 
    e.Graphics.DrawString((i + 2).ToString(), myFont, System.Drawing.Brushes.Gray, point2); 
} 

Кроме того, точка 0, 0 является левым верхним углом.

+0

Эллипсы, вероятно, являются точками. Для получения лучших результатов (с шириной линии> 1) подключенные линии должны быть нарисованы за один раз с помощью DrawLines. – TaW

+1

Глупый я, я неправильно понял его вопрос. Но если он хочет писать имена очков, ему все равно придется идти с петлей. – Dainius

+0

Да, эллипсы - это точки в этом случае. Мне удалось написать имена рядом с точками, что мне не удалось сделать, это подключить точки. – Luna