Skip to content

Instantly share code, notes, and snippets.

@zhuth
Created May 16, 2014 01:07
Show Gist options
  • Save zhuth/6b808444f6175fcfe13e to your computer and use it in GitHub Desktop.
Save zhuth/6b808444f6175fcfe13e to your computer and use it in GitHub Desktop.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Shuilifang
{
public partial class Form1 : Form
{
private List<PointF> _points = new List<PointF>();
private Graphics _g;
private int _iters = 0;
private Random _rnd = new Random();
private Bitmap _bmp0 = null;
private const int TCOUNT = 1000;
private PointF[] _turtles = new PointF[TCOUNT];
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height);
_g = Graphics.FromImage(pictureBox1.Image);
}
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Right)
{
pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height);
_g = Graphics.FromImage(pictureBox1.Image);
_points.Clear();
_iters = 0;
}
else
{
_points.Add(new PointF(e.X, e.Y));
_g.FillRectangle(Brushes.Red, (int)e.X - 5, (int)e.Y - 5, 10, 10);
pictureBox1.Refresh();
}
}
private void pictureBox1_DoubleClick(object sender, EventArgs e)
{
}
private PointF calcForce(PointF p, PointF t)
{
PointF vec = new PointF(t.X - p.X, t.Y - p.Y);
float mlen = vec.X * vec.X + vec.Y * vec.Y;
mlen *= (float)Math.Sqrt(mlen);
vec.X /= mlen; vec.Y /= mlen;
return vec;
}
private void button1_Click(object sender, EventArgs e)
{
for (int iting = 0; iting < 100; ++iting)
{
Application.DoEvents();
if (_iters == 0)
{
_bmp0 = (Bitmap)pictureBox1.Image.Clone();
for (int i = 0; i < TCOUNT; ++i)
{
_turtles[i].X = _rnd.Next(pictureBox1.Width);
_turtles[i].Y = _rnd.Next(pictureBox1.Height);
}
}
else
{
for (int i = 0; i < TCOUNT; ++i)
{
// 计算排斥力
int flen = 100;
PointF force = new PointF(0, 0);
var t = _turtles[i];
foreach (var p in _points)
{
var vec = calcForce(p, t);
force.X += vec.X * flen; force.Y += vec.Y * flen;
}
// 计算到四个边的排斥力
flen /= 10;
for (int x = 0; x < _bmp0.Width; ++x)
{
var vec = calcForce(new PointF(x, 0), t);
force.X += vec.X * flen / 10; force.Y += vec.Y * flen / 10;
vec = calcForce(new PointF(x, _bmp0.Height), t);
force.X += vec.X * flen / 10; force.Y += vec.Y * flen / 10;
}
for (int y = 0; y < _bmp0.Height; ++y)
{
var vec = calcForce(new PointF(0, y), t);
force.X += vec.X * flen / 10; force.Y += vec.Y * flen / 10;
vec = calcForce(new PointF(_bmp0.Width, y), t);
force.X += vec.X * flen / 10; force.Y += vec.Y * flen / 10;
}
_turtles[i].X += force.X; _turtles[i].Y += force.Y;
}
}
_iters++;
this.Text = "Iter: " + _iters;
}
pictureBox1.Image = (Bitmap)_bmp0.Clone();
using (Graphics g = Graphics.FromImage(pictureBox1.Image))
{
for (int i = 0; i < TCOUNT; ++i)
{
g.FillRectangle(Brushes.Blue, _turtles[i].X, _turtles[i].Y, 2, 2);
}
}
pictureBox1.Refresh();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment