Я хочу анимировать алгоритм сортировки в виде выигрыша 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)
{
}
}
}
Я думаю, вам нужно прочитать некоторые документы о * accesing элементах управления пользовательского интерфейса в потоках * – EZI
@EZI: я не получаю никакого исключения для перекрестного потока –
, вы должны добавить флаг перерисовывания, установить его на любом итерации/изменении и прочитать он на событии onidle или внутри таймера, если true, затем очистите его и переделайте сцену. не забудьте добавить mutex/lock к этому флагу .... и заявить, как volatile в C++, если он есть такой в C# – Spektre