Created
May 16, 2014 01:07
-
-
Save zhuth/6b808444f6175fcfe13e to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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