WinFormApp i wykresy.

0

Witam.

Mam pewien problem otóż potrzebuje zrobić program, który będzie mi generować wykres na układzie współrzędnych. Dane do wykresu mają być pobieranie z tablicy. Wszystko mam już w sumie zrobione w języku c# tylko mam problem z tymi wykresami, ponieważ nie wiem jak je wygenerować, za pomocą którego narzędzia i w jaki sposób. Próbowałem już rysować go za pomocą Graphics, ew po prostu wstawić sam wykres ale i tak mam problem z dodaniem do niego punktów. Wiem że zapewne problem jest błachy ale zależy mi na rozwiązaniu go. Dziękuję za wszystkie odpowiedzi.

0

O ile pamiętam to do tego typu zabaw można użyć MSChart.
W sieci poszukaj jak użyć -> np. https://msdn.microsoft.com/en-us/library/aa231230(v=vs.60).aspx

0

Owszem, próbowałem tego ale problemem jest zmiana wykresu, ja nie chce diagramu ani słupkowego, potrzebuje konkretnie żeby to był układ współrzędnych z OX i OY. I stąd właśnie to pytanie. Nie wiem czy jest możliwe zrobienie takiego wykresu za pomocą Chart'a.

0

Bez problemu możesz na kontrolce Panel narysować taki wykres klasą Graphics.

Rysowanie po Windows Forms

0

Okej na Panelu za pomocą Graphics, tylko teraz muszę pobrać dane z tablicy np x = 2,999 a y=1,34 załóżmy. I chce to zrzutową na Panel. I potrzebuje żeby to był punkt. Jakieś pomysły żeby to uzyskać ? Bo typowo samego punktu jako Point w graphicsie nie ma.

0

Czyli da rade zrobić tak żeby bezpośrednio z tablicy wpisać w x i Y ?

0

Musisz te punkty przeskalować względem wielkości Twojej kontrolki. Spróbuj coś narysować, wklej kod jeśli nie będziesz mógł rozwiązać jakiegoś problemu, a forum postara się pomóc ;)

0

Ja zrobiłem to wstępnie o wielkości 400x400. Jak będzie jakiś problem to na pewno sie odezwę :D ale powinno juz być okej, wiem juz czego użyć, tylko w tym w sumie miałem problem

1

Ja bym się jednak zastanowił z ręcznym rysowaniem wszystkiego. Jak to ma być wykres to przydały by się osie, skale, jakieś oznaczenia itp. Ładnych parę godzin klepania niepotrzebnego kodu skoro są gotowe rozwiązania. Chyba, że chcesz się nauczyć 3-4 metod z GDI+ chociaż nie wiem po co.

Z Chartem MSowym też się da zrobić wykres XY (bardzo bym się zdziwił, gdyby się nie dało). Trzeba ustawić typ serii na Line (albo coś podobnego).

chart1.Series[0].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line;
double[,] data = new double[5, 2] { {0,0 }, {1,1 }, {2,2 }, {3,3 }, {4,5 } };

for (int i = 0; i < data.Length / 2; i++)
{
    chart1.Series[0].Points.AddXY(data[i, 0], data[i, 1]);
}
0

Użycie MSChart, o coś takiego CI chodzi?
screenshot-20170924234535.png

0

Więc tak teraz mam taki problem. Otóż funkcja która mi wylicza parametry które mają się później wyświetlić na wykresie jest wrzucona w Buttona. Poprzez naciśnięcie przycisku parametry są wyliczane. I mam taki problem gdyż private void button1_Click(object sender, EventArgs e) to jest jako prywatne, a muszę wrzucić do tego przycisku również generowanie wykresu. Jakieś pomysły?

1

Ja mam pomysł taki, żebyś przeczytał jakąś książkę dla początkujących. Nie, żebym się zbijał czy coś, tylko znacznie bardziej efektywnie będzie jeśli przerobisz trochę przykładów książkowych z obsługi IDE, samego programowania, teorii obiektowości itp.
Zakładam, ze masz Form, skoro masz Button.
Wstawiasz na formę (jak to się powinno po polsku nazywać?) Chart z Toolbox-a.
Pod button1_click... masz swoje jakieś obliczenia.
Po obliczeniach masz pewnie jakąś tablicę dwuwymiarową lub 2 tablice dla X (iksy[]) i Y (igreki[]), i mają taką samą wielkość.

Wstawiasz to co napisałem wcześniej tylko ze swoimi tablicami

// ustawienie typu serii na Line (w Properties można jej dodać jakieś znaczniki w punktach, kwadraciki czy coś innego)
chart1.Series[0].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line;

chart1.Series[0].Points.Clear(); // wyczyszczenie starych punktów

for (int i = 0; i < iksy.Length; i++)
{
    chart1.Series[0].Points.AddXY(iksy[i], igreki[i]);
}

Czy może być tu coś niezrozumiałego?

Zobacz w oknie Properties co ma komponent Chart. W szczególności: Series, Legends, ChartAreas. Tam jest dużo różnych możliwości.

Jeśli twój wpis dotyczy rysowania przez GDI to trzeba (chyba) użyć zdarzenia OnPaint kontrolki do przerysowania wszystkiego co chcesz narysować.

0

Kod mniej więcej wygląda tak:

private void przyciskGenerowania(object sender, EventArgs e)
{
tutaj mam swoje obliczenia i na samym dole mam tablice y[0,n] i y[1,n] 
}

I chcę żeby tutaj z tym przyciskiem generował się wykres,a rysować wykres mogę tylko w private void wykres1(object sender, PaintEventArgs e)

Jak połączyć te dwie funkcje ? Bo jak wklejam całą funkcje wykres1 to od razu cały kod mi się rozpieprza i nie działa.

1

Ale w koncu uzywasz Chart-a czy GDI?
Jak Charta to tak jak pisalem wyzej. Jak GDI to w zdarzeniu OnPaint (lub Paint, nie pamiętam) kontrolki an ktorej rysujesz.
Pokaż caly kod formy.
Co wywołuje metode wykres1()?

0

Używam GDI po prostu w funkcji przycisku gdzie nacisnę przycisk jest uruchamiany mój algorytm który wylicza mi wartości x i y które pózniej chce nanieść na układ wspolrzednych który już mam namalowany i wyskalowany. Problem jest taki ze nie mogę z funkcji przycisku przenieść wartości do funkcji malowania na panelu. Chciałbym żeby po wciśnięciu guzika algorytm generował wartości które bedą Od razu naniesione na wykres.

1

Mam nadzieję, że przyszły pracodawca wybije Ci takie pomysły z głowy.

Rysować musisz w zdarzeniu Paint kontrolki (komponentu) na której rysujesz (np Panel panel1).
Możesz wstawić tam jakąś flagę np. DrawFlag (trochę brzydkie rozwiązanie).
Przed wykonaniem obliczeń ustawiasz DrawFlag = false;

Po zakończeniu obliczeń ustawiasz flagę

private void przyciskGenerowania(object sender, EventArgs e)
{
    //tutaj mam swoje obliczenia i na samym dole mam tablice y[0,n] i y[1,n] 
    DrawFlag = true; 
    panel1.Refresh(); // zakładam, ze rysujesz na panel1
}

W zdarzeniu Paint (jak rozumiem u Ciebie to zdarzenie to metoda wykres1(object sender, PaintEventArgs e)
tam robisz coś takiego

if(DrawFlag == false)
return

i potem rysowanie

Tablice z danymi muszą być oczywiście widziane w zdarzeniu Paint (zadeklarowane w klasie formularza).

Generalnie jak widzisz mnóstwo problemików bo nie chcesz (z jakiegoś niezrozumiałego powodu) normalnego Charta.

poza tym te tablice - y[0,n] i y[1,n] to jaki mają sens? Dlaczego używasz dwóch dwuwymiarowych tablic?

0

Mam jedną tablice która jest dwuwymiarowa, owszem i tablica jest y[0,n] oraz y[1,n] bo ogólnie ten algorytm jest potrzebny do obliczeń fizycznych. Jeśli pozwolisz, podeślę Ci projekt i zobaczysz o co konkretnie chodzi. W sumie stoję teraz w miejscu z powodu tego że nie mogę wykorzystać danych z jednej metody w drugiej. A obydwie metody są prywatne, a gettera w dziwny sposób nie mogę użyć.:/

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