Rysowanie wykresu chart dla bardzo dużych liczb BigInteger

0

Mam problem - napisałem kod, który tworzy mi wykres dla kolejnych liczb Fibonacciego znajdujących się w tab[], jednak są one typu BigInteger, a chart go nie obsługuje, więc postanowiłem przekonwertować na UInt64. Jednak taka konwersja uniemożliwia mi rysowanie wykresu dla Fib nawet dla 100, gdyż ta liczba jest już większa od UInt64. Jak obejść ten problem? I kolejna rzecz w jaki sposób zmieniać skalę wykresu? Oraz mam problem jak oblicze fib dla jakiejś liczby i kliknę wykres, to się dobrze rysuje, ale jak później kliknę oblicz dla innej liczby i wykres, to wykres się nie zmienia... Proszę o pomoc :)

private void BtnWykres_Click(object sender, EventArgs e)
        {
            Chart Chart1 = new Chart();
            Chart1.Series.Add("Series1");
            Chart1.ChartAreas.Add("ChartArea1");
            Chart1.Series["Series1"].ChartArea = "ChartArea1";
            for (int i = 1; i < tab.Length; i++)
            {
                Chart1.Series["Series1"].ChartType = SeriesChartType.Point;
                String str = tab[i].ToString();
                UInt64 uit = Convert.ToUInt64(str);
                Chart1.Series["Series1"].Points.AddXY(i, uit);
            }
            Chart1.Width = 300;
            Chart1.Height = 300;
            wykres.Controls.Add(Chart1);
            wykres.ShowDialog();
        }
0

Jakiekolwiek sugestie...?

0

Mam już, że wykres za każdym razem się odświeża, wystarczyło tworzenie forma zrobić w tym samym miejscu, co cały wykres

private void BtnWykres_Click(object sender, EventArgs e)
        {
            Form wykres = new Form();

            Chart Chart1 = new Chart();
                        
            Chart1.Series.Clear();
            Chart1.Series.Add("Series1");
            Chart1.ChartAreas.Add("ChartArea1");
            Chart1.Series["Series1"].ChartArea = "ChartArea1";

            for (int i = 1; i < tab.Length; i++)
            {
                Chart1.Series["Series1"].ChartType = SeriesChartType.Point;
                String str = tab[i].ToString();
                UInt64 uit = Convert.ToUInt64(str);
                Chart1.Series["Series1"].Points.AddXY(i, uit);
            }
           Chart1.Scale(Convert.ToInt32(Interaction.InputBox("Wprowadź skalę")));
            wykres.Controls.Add(Chart1);
            wykres.AutoSize = true;
            wykres.ShowDialog();
       }

No i pozostają moje pytania:
1)Jak tworzyć wykres dla BigInteger?(teraz działa bo konwertuje na UInt64, ale większych liczb tak się nie da)
2)Jak stworzyć możliwość przybliżania/oddalania(skalowania) wykresu? Mam to rozwiązane za pomocą InputBoxa, ale nie wiem jak stworzyć suwak , pod który mógłbym to podpiąć zamiast tego InputBoxa.
3)Przesuwanie wykresu także za pomocą suwaków

0

A dlaczego musisz wyświetlać na wykresie BigInteger? Nie możesz double?

A suwak to TrackBar albo HScrollBar/VScrollBar.

0

Bo jak użyję double, to nie obliczy mi Fib dla większych liczb; BigInteger bez problemu przechowuje nawet liczny mające 10 000 znaków(Fib dla 50 000) :)

Nawet jak zrobię Fib dla 100, to Double nie daje mi pełnej liczby, tylko jakieś 4E+20... Jak to obejść?

0

Hmm... A nie dałoby rady jakoś podzielić tego ogromnego BigIntegera, żeby się zmieścił w double?

0

Nie bardzo mam pomysł, jakby można to zrobić... :(

0

Musisz raczej narysować własny wykres od zera, standardowy komponent BigIntegera ci nie narysuje.

Double nie daje mi pełnej liczby, tylko jakieś 4E+20... Jak to obejść?

Nie „jakieś”, tylko 4E+20 = 400000000000000000000, czyli 4 i 20 zer. Wszystko jest w porządku.

0

Może zmniejsz jednostkę? Narysuj po prostu wykres w skali np. 1:10000000 i może Ci się zmieści BigInteger w double :)

0

Z dalszymi liczbami Fib'a to predzej przejsc na skale logarytmiczna.. Jezeli swoje bigInty zlogarytmujesz*), powinno Ci sie spokojnie zmiescic w double (raczej liczb wielkosci e^(4E+20) nie bedziesz otrzymywal ze swojego ciagu, hm?)

no, chyba ze osie y'=log(y)/x'=x Cie nie urzadzaja, to trzeba innego sposobu szukac

  • tak, Chart ma opcje osi logarytmicznych, ale skoro on nie rozumie BigIntów, to i mu log nie pomoze. Ale jesli sam to zrobisz przed podaniem mu danych, to w efecie Chart dostanie serie doubli i sobie poradzi. Chart bedzie mial skale LIN/LIN, to wartosci beda recznie z-log-owane!!

1 użytkowników online, w tym zalogowanych: 0, gości: 1