⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainform.cs

📁 K-Means C++实现 带演示程序 K-Means C++实现 带演示程序
💻 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 + -