/// <summary> /// Rysuje jedno połączenie na dendrogramie. /// </summary> /// <param name="połączenie">Struktura gdzie jest napisane odkąd dokąd i w którym miejscu.</param> public void RysujPołączenie(JednoPołączenie połączenie) { for (int i = dendrogram.Count; i < połączenie.PoziomZagłębienia; ++i) { dendrogram.Add(new List <GrupaNaLiście>()); } double x1, x2, x3, y1, y2; if (połączenie.PoziomZagłębienia == 0) { x1 = połączenie.PoziomZagłębienia * odległośćMiędzyGrupamiNaOsiX + początekWykresuOdLewej; x2 = x1 + odległośćMiędzyGrupamiNaOsiX; x3 = x1; y1 = początekWykresuOdGóry + połączenie.IndeksOd * odległośćMiędzyPunktamiNaOsiY + rozdzielenieKlastrów; y2 = początekWykresuOdGóry + (połączenie.IndeksDo + 1) * odległośćMiędzyPunktamiNaOsiY - rozdzielenieKlastrów; } else { GrupaNaLiście grupa1 = ZnajdźGrupęPierwszą(połączenie); GrupaNaLiście grupa2 = ZnajdźGrupęDrugą(połączenie); x1 = (grupa1.Poziom + 1) * odległośćMiędzyGrupamiNaOsiX + początekWykresuOdLewej; x3 = (grupa2.Poziom + 1) * odległośćMiędzyGrupamiNaOsiX + początekWykresuOdLewej; x2 = (połączenie.PoziomZagłębienia + 1) * odległośćMiędzyGrupamiNaOsiX + początekWykresuOdLewej; y1 = (grupa1.MiejsceOd + grupa1.MiejsceDo) / 2; y2 = (grupa2.MiejsceOd + grupa2.MiejsceDo) / 2;; } RysujLinięTąUGóry(x1, x2, y1); RysujLinięTąZGóryNaDół(x2, y1, y2); RysujLinięTąNaDole(x3, x2, y2); UmieśćPołączenieNaLiście(połączenie, y1, y2); }
private GrupaNaLiście ZnajdźGrupęPierwszą(JednoPołączenie połączenie) { for (int i = połączenie.PoziomZagłębienia - 1; i >= 0; --i) { for (int j = 0; j < dendrogram[i].Count; ++j) { if (dendrogram[i][j].IndeksOd == połączenie.IndeksOd) { return(dendrogram[i][j]); } } } throw new ApplicationException(); }
/// <summary> /// Umieszcza połączenie na liście aby kolejne połączenia mogły na podstawie tego wyliczyć /// gdzie mają się narysować. /// </summary> /// <param name="połączenie"></param> private void UmieśćPołączenieNaLiście(JednoPołączenie połączenie, double y1, double y2) { if (połączenie.PoziomZagłębienia > dendrogram.Count - 1) { for (int i = dendrogram.Count; i <= połączenie.PoziomZagłębienia; ++i) { dendrogram.Add(new List <GrupaNaLiście>()); } } dendrogram[połączenie.PoziomZagłębienia].Add(new GrupaNaLiście { IndeksOd = połączenie.IndeksOd, IndeksDo = połączenie.IndeksDo, MiejsceOd = y1, MiejsceDo = y2, Poziom = połączenie.PoziomZagłębienia }); }