private void button_start_Click(object sender, EventArgs e) { Shluk shluk1 = null, shluk2 = null; int shlukIndex1 = 0, shlukIndex2 = 0; //Cykl se bude opakovat tak dlouho dokud se počet shluků nezredukuje na zadaný počet while (shluky.Count != (int)number_final.Value) { //Kontrola jestli nejsou zadány špatné parametry či cokoliv. //Po metodě "shlukuj" se má počet shluků zmenšit. //Pokud se nezmenší něco nefunguje a potřeba přerušit program int velikostPredShlukem = shluky.Count; //Velikost před sloučením dvou shluků int velikostPoShluku = 0; Shlukuj(shluk1, shluk2, shlukIndex1, shlukIndex2); velikostPoShluku = shluky.Count(); //Velikost po sloučení if (velikostPoShluku == velikostPredShlukem) //Pokud se velikosti rovnají => něco se posralo { break; } } //Poté co je hotovo se překreslí picture box canvas.Invalidate(); }
private void Shlukuj(Shluk shluk1, Shluk shluk2, int shlukIndex1, int shlukIndex2) { //Nalezení dvou nejbližších shluků int minimum = 99999; for (int i = 0; i < shluky.Count; i++) { for (int j = 0; j < shluky.Count; j++) { if (j == i) //Podmínka aby se nekotroloval shluk sám se sebou { continue; } //Pokud se našel nový nejbližší pár if (Shluk.VzdalenostShluku(shluky[i], shluky[j]) < minimum) { //Uloží se které shluky jsou sobě nejbližší minimum = Shluk.VzdalenostShluku(shluky[i], shluky[j]); shluk1 = shluky[i]; shluk2 = shluky[j]; shlukIndex1 = i; shlukIndex2 = j; } } } //Teď mám nalezené dva blízké shluky. Tak je spojím shluk1 = Shluk.SpojShluky(shluk1, shluk2); shluky[shlukIndex1] = shluk1; //ten druhý smažu shluky.RemoveAt(shlukIndex2); }
/// <summary> /// Vypočítá vzdálenost dvou shluků. Nejmenší vzdálenost mezi body obou shluků se bere jako vzdálenost dvou shluků. /// </summary> /// <param name="shluk1">První shluk</param> /// <param name="shluk2">Druhý shluk</param> /// <returns></returns> public static int VzdalenostShluku(Shluk shluk1, Shluk shluk2) { if (shluk1 == null || shluk2 == null) { return(-1); } int nejmensiVzdalenost = 99999; int soucasnaVzdalenost = nejmensiVzdalenost; for (int i = 0; i < shluk1.body.Count; i++) //Procházení bodů ze shluku 1 { for (int j = 0; j < shluk2.body.Count; j++) //procházení bodů ze shluku 2 { //Vypočítá se vzdálenost a popřípadě se uloží soucasnaVzdalenost = Bod.VypoctiVzdalenost(shluk1.body[i], shluk2.body[j]); if (soucasnaVzdalenost < nejmensiVzdalenost) { nejmensiVzdalenost = soucasnaVzdalenost; } } } return(nejmensiVzdalenost); }
public static Shluk SpojShluky(Shluk shluk1, Shluk shluk2) { if (shluk1 == null || shluk2 == null) { return(null); } for (int i = 0; i < shluk2.PocetBodu(); i++) { shluk1.body.Add(shluk2.body[i]); } shluk2 = null; return(shluk1); }
private void button_krok_Click(object sender, EventArgs e) { if (checkBox_krokovat.Checked) { Shluk shluk1 = null, shluk2 = null; int shlukIndex1 = 0, shlukIndex2 = 0; if (shluky.Count != (int)number_final.Value) { Shlukuj(shluk1, shluk2, shlukIndex1, shlukIndex2); } //Poté co je hotovo se překreslí picture box canvas.Invalidate(); } }