2015-04-16 2 views
0

Я хочу анимировать алгоритм сортировки в виде выигрыша application.I гугле и нашел следующий код Java апплетаПреобразование кода Java апплет C#

import java.applet.Applet; 
import java.awt.*; 
abstract public class Animate 
    extends Applet implements Runnable 
    { Graphics g; 
    Thread animatorThread; 
    int N; double[] a; 
    public void start() 
     { g = getGraphics(); 
     new Thread(this).start(); 
     } 
    public void stop() { animatorThread = null; } 
    public void run() 
     { N = Integer.parseInt(getParameter("N")); 
     a = new double[N]; 
     for (int i = 0; i < N; i++) 
      { a[i] = Math.random(); 
      dot(X(i), Y(a[i]), Color.black); } 
     sort(a, 0, N-1); 
     } 
    int X(int i) 
     { return (i*getSize().width)/N; } 
    int Y(double v) 
     { return (1.0 - v)*getSize().height; } 
    void dot(int x, int y, Color c) 
     { g.setColor(c); g.fillOval(x, y, 5, 5); } 
    void exch(double [] a, int i, int j) 
     { double t = a[i]; a[i] = a[j]; a[j] = t; 
     dot(X(i), Y(a[j]), Color.red); 
     dot(X(j), Y(a[i]), Color.red); 
     dot(X(i), Y(a[i]), Color.black); 
     dot(X(j), Y(a[j]), Color.black); 
     } 
    abstract void sort(double a[], int l, int r); 
} 
----- 
import java.awt.*; 
public class SortAnimate extends Animate 
    { 
    void sort(double a[], int l, int r) 
     { 
     for (int i = l+1; i <= r; i++) 
      for (int j = i; j > l; j--) 
      if (a[j] < a[j-1]) exch(a, j-1, j); 
     } 
    } 

Я преобразованный код выше в эквивалентные C# код, как показано ниже. Следующий код компилируется и работает нормально, но я не получаю анимацию на экране.

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace AnimationEx 
{ 
    public partial class Form1 : Form 
    { 
     Graphics g; 
     Thread thread; 
     int N; int[] a; 
     public Form1() 
     { 
      InitializeComponent(); 
      a = new[] { 1, -11, 11, -1, 4, 1, 13143, 23, 24234, 242, 243, 2424, 2432 }; 
      N = a.Length - 1; 
      g = CreateGraphics(); 


     } 
     int X(int i) 
     { return (i * this.ClientRectangle.Width)/N; } 
     int Y(int v) 
     { return (1 - v) * this.ClientRectangle.Height; } 
     private void Run() 
     { 

      for (int i = 0; i < N; i++) 
      { 
       dot(X(i), Y(a[i]), Color.Black); 
      } 
      sort(a, 0, N - 1); 
     } 

     private void exch(int[] arr, int i, int j) 
     { 
      int t = a[i]; a[i] = a[j]; a[j] = t; 
      dot(X(i), Y(a[j]), Color.Red); 
      dot(X(j), Y(a[i]), Color.Red); 
      dot(X(i), Y(a[i]), Color.Black); 
      dot(X(j), Y(a[j]), Color.Black); 

     } 

     private void dot(int p1, int p2, Color color) 
     { 
      float x = p1; 
      float y = p2; 
      //g.setColor(c); g.fillOval(x, y, 5, 5); 
      Brush b = new SolidBrush(color); 
      g.FillEllipse(b, x, y, 5, 5); 

     } 


     void sort(int[] a, int l, int r) 
     { 
      for (int i = l + 1; i <= r; i++) 
       for (int j = i; j > l; j--) 
        if (a[j] < a[j - 1]) exch(a, j - 1, j); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      thread = new Thread(new ThreadStart(Run)); 
      thread.Start(); 

     } 

     private void Form1_Paint(object sender, PaintEventArgs e) 
     { 


     } 


    } 
} 
+2

Я думаю, вам нужно прочитать некоторые документы о * accesing элементах управления пользовательского интерфейса в потоках * – EZI

+0

@EZI: я не получаю никакого исключения для перекрестного потока –

+0

, вы должны добавить флаг перерисовывания, установить его на любом итерации/изменении и прочитать он на событии onidle или внутри таймера, если true, затем очистите его и переделайте сцену. не забудьте добавить mutex/lock к этому флагу .... и заявить, как volatile в C++, если он есть такой в ​​C# – Spektre

ответ

0

Попробуйте это: g = CreateGraphics(); переехать сюда:

private void Form1_Load(object sender, EventArgs e) 
    { 
     g = Graphics.FromHwnd(this); 
     thread = new Thread(new ThreadStart(Run)); 
     thread.Start(); 

    } 

Я просто не понимаю, что контроль ограничен вашим графическим объектом.

+0

@Rayn: То же самое значение точки отображается на стороне, но без анимации –

+0

О самой анимации: если u хотите сделать это, вы должны использовать, например, объект System.Windows.Forms.Timer с правильным интервалом и вручную перерисовывать ur, указывая каждое событие Tick. – Ryan

+0

Хорошо, дайте мне попробовать –

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