📄 mainform.cs
字号:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SimpleKMeans.Demo;
namespace SimpleKMeans
{
public partial class Form1 : Form
{
private DataTable dataSet = new DataTable();
private double max_x = 0;
private double min_x = 0;
private double max_y = 0;
private double min_y = 0;
private bool isDraw = false;
private bool isKMeans = false;
private bool isCanRedraw = true;
private int K = 3;
Color[] colors;
Color backgroundColor = Color.Black;
int[] clusters;
int[] sizes;
int[] means;
double[] finalMeans;
double precise = 0.0001;
int times = -1;
public Form1()
{
InitializeComponent();
this.dataSet = DataUtilities.GetDataTable();
max_x = DataUtilities.FindMaxValue(this.dataSet, "X_Dim");
min_x = DataUtilities.FindMinValue(this.dataSet, "X_Dim");
max_y = DataUtilities.FindMaxValue(this.dataSet, "Y_Dim");
min_y = DataUtilities.FindMinValue(this.dataSet, "Y_Dim");
}
private void pnlContainer_Paint(object sender, PaintEventArgs e)
{
if (isCanRedraw)
{
this.pnlContainer.CreateGraphics().Clear(backgroundColor);
//DrawingUtilities.DrawRulers(this.x_rule, this.y_rule, Color.Black);
if (isKMeans)
{
DrawKMeansDots();
}
else if (isDraw)
{
DrawDots();
}
}
}
private void DrawKMeansDots()
{
int count = 0;
for (int i = 0; i < K; i++)
{
for (int j = 0; j < sizes[i]; j++)
{
DataRow row = this.dataSet.Rows[clusters[count++]];
double tmp_x = Convert.ToDouble(row["X_Dim"]);
double tmp_y = Convert.ToDouble(row["Y_Dim"]);
DrawingUtilities.DrawDot(this.pnlContainer,
Convert.ToInt32(((tmp_x - min_x) / (max_x - min_x)) * (this.pnlContainer.Width - 10)),
Convert.ToInt32(((tmp_y - min_y) / (max_y - min_y)) * (this.pnlContainer.Height - 23)),
colors[i]);
}
}
for (int i = 0; i < K; i++)
{
int tmp_x = Convert.ToInt32(finalMeans[i]);
int tmp_y = Convert.ToInt32(finalMeans[i + K]);
DrawingUtilities.DrawCross(this.pnlContainer,
Convert.ToInt32(((tmp_x - min_x) / (max_x - min_x)) * (this.pnlContainer.Width - 10)),
Convert.ToInt32(((tmp_y - min_y) / (max_y - min_y)) * (this.pnlContainer.Height - 23)),
colors[i]);
}
this.isKMeans = true;
this.isDraw = false;
isCanRedraw = true;
}
private void DrawDots()
{
foreach (DataRow item in this.dataSet.Rows)
{
double tmp_x = Convert.ToDouble(item["X_Dim"]);
double tmp_y = Convert.ToDouble(item["Y_Dim"]);
DrawingUtilities.DrawDot(this.pnlContainer,
Convert.ToInt32(((tmp_x - min_x) / (max_x - min_x)) * (this.pnlContainer.Width - 9)),
Convert.ToInt32(((tmp_y - min_y) / (max_y - min_y)) * (this.pnlContainer.Height - 9)),
Color.White);
}
this.isDraw = true;
this.isKMeans = false;
isCanRedraw = true;
}
private void miDrawRawDots_Click(object sender, EventArgs e)
{
DrawDots();
}
private void miSetting_Click(object sender, EventArgs e)
{
KMeansSettingForm setting =
new KMeansSettingForm(this.K, this.precise, this.times);
DialogResult dr = setting.ShowDialog();
if (dr == DialogResult.OK)
{
this.K = setting.K;
this.precise = setting.Precise;
this.times = setting.Times;
colors = ColorGenerator(K);
sizes = new int[K];
finalMeans = new double[2 * K];
}
}
private void miRun_Click(object sender, EventArgs e)
{
clusters = new int[this.dataSet.Rows.Count];
sizes = new int[K];
finalMeans = new double[2 * K];
means = AlgorithmUtilities.GetRandomMeans(K, this.dataSet.Rows.Count);
DateTime begin = DateTime.Now;
AlgorithmUtilities.DataMining_KMeans(
AlgorithmUtilities.LoadData(this.dataSet, "X_Dim", "Y_Dim"),
this.dataSet.Rows.Count,
K, means, this.precise, times,
clusters, sizes, finalMeans,
this.dataSet.Rows.Count * 2,2*K);
DateTime end = DateTime.Now;
colors = ColorGenerator(K);
DrawKMeansDots();
this.status.Text = (end - begin).TotalSeconds.ToString();
}
private Color[] ColorGenerator(int K)
{
Color[] colors = new Color[K];
Random rand = new Random();
for (int i = 0; i < K; i++)
{
colors[i] =
Color.FromArgb(
rand.Next(64, 255),
rand.Next(64, 255),
rand.Next(64, 255));
}
return colors;
}
private void tbClear_Click(object sender, EventArgs e)
{
this.pnlContainer.CreateGraphics().Clear(backgroundColor);
this.isCanRedraw = false;
}
private void x_rule_Paint(object sender, PaintEventArgs e)
{
DrawingUtilities.DrawRulers(this.x_rule, this.y_rule, Color.Black);
}
private void y_rule_Paint(object sender, PaintEventArgs e)
{
DrawingUtilities.DrawRulers(this.x_rule, this.y_rule, Color.Black);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -