2016-12-15 71 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)用'List '替換數組以獲得更大的靈活性並創建一個'List ListOfPoints'。 Step2)添加一個'ListOfPoints.Add([new Point(Xk],Y [k]));'Step 3)添加'e.Graphics.DraLines(Pens.Red,ListOfPoints。ToArray()' – TaW

+0

TaW,對不起,隊友不知道該怎麼做。我可以更改列表,但我的問題是如何畫線和連接點。我卡在哪裏 – Luna

+0

要繪製一條線,請使用'Graphics.DrawLine'。繪製幾行使用'Graphics.DrawLines'。另外:__reading數據應該只發生一次___或每當數據__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; 
     } 

    } 

現在,在你的paint方法如果兩個點都設置你應該檢查,如果他們是,檢查它們是否一個挨着其他的,像

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

ellispes可能是點。爲了獲得更好的效果(線寬大於1),應該用DrawLines一次繪製連線。 – TaW

+1

傻了,我誤解了他的問題。但是如果他想寫出點的名字,他仍然需要循環。 – Dainius

+0

是的,ellispes是這種情況下的點。我確實設法在點旁邊寫下名字,但我沒有設法做的就是連接點。 – Luna