WinFormApp i wykresy.

WinFormApp i wykresy.
M2
  • Rejestracja:ponad 8 lat
  • Ostatnio:około rok
  • Postów:21
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.

JP
Poszukaj gotowych komponentow. Jest troche darmowych i komercyjnych. Ja używam Devexpress-a ale nie są tanie. Syncfusion ma opcje za free ale mi jakoś nie pasują. Jakies takie brzydkie.
M2
Mi nie zależy żeby to ładnie wyglądało, bo to jest zwykła apka na zaliczenie, ale niestety wykresy są w moim przypadku wymagane, i stad to pytanie czy za pomocą narzędzi w WinFormsach jestem w stanie coś zdziałać? A jeśli tak to jakich ?
JP
Tuasz info o darmowej licencji https://www.syncfusion.com/products/communitylicense W tych komponentach jest (prawie) wszystko. Przy instalacji mozna wybrac co chcesz zainstalowac bo cslosc to chyba kilka GB. Są tez wykresy przeróżne. https://www.syncfusion.com/products/windows-forms/chart/types
gg
  • Rejestracja:około 9 lat
  • Ostatnio:około rok
  • Lokalizacja:Kraków
  • Postów:574
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

M2
  • Rejestracja:ponad 8 lat
  • Ostatnio:około rok
  • Postów:21
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.

E9
  • Rejestracja:ponad 13 lat
  • Ostatnio:11 miesięcy
  • Postów:395
0

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

https://4programmers.net/C_sharp/Rysowanie_po_Windows_Forms

M2
  • Rejestracja:ponad 8 lat
  • Ostatnio:około rok
  • Postów:21
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.

E9
  • Rejestracja:ponad 13 lat
  • Ostatnio:11 miesięcy
  • Postów:395
0
edytowany 1x, ostatnio: error91
M2
  • Rejestracja:ponad 8 lat
  • Ostatnio:około rok
  • Postów:21
0

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

E9
  • Rejestracja:ponad 13 lat
  • Ostatnio:11 miesięcy
  • Postów:395
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 ;)

M2
  • Rejestracja:ponad 8 lat
  • Ostatnio:około rok
  • Postów:21
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

JP
  • Rejestracja:ponad 7 lat
  • Ostatnio:5 miesięcy
  • Postów:1065
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).

Kopiuj
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]);
}
edytowany 3x, ostatnio: jacek.placek
gg
  • Rejestracja:około 9 lat
  • Ostatnio:około rok
  • Lokalizacja:Kraków
  • Postów:574
0

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

M2
  • Rejestracja:ponad 8 lat
  • Ostatnio:około rok
  • Postów:21
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?

JP
  • Rejestracja:ponad 7 lat
  • Ostatnio:5 miesięcy
  • Postów:1065
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

Kopiuj
// 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ć.

M2
  • Rejestracja:ponad 8 lat
  • Ostatnio:około rok
  • Postów:21
0

Kod mniej więcej wygląda tak:

Kopiuj
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.

JP
  • Rejestracja:ponad 7 lat
  • Ostatnio:5 miesięcy
  • Postów:1065
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()?

M2
  • Rejestracja:ponad 8 lat
  • Ostatnio:około rok
  • Postów:21
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.

JP
  • Rejestracja:ponad 7 lat
  • Ostatnio:5 miesięcy
  • Postów:1065
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ę

Kopiuj
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?

edytowany 3x, ostatnio: jacek.placek
M2
  • Rejestracja:ponad 8 lat
  • Ostatnio:około rok
  • Postów:21
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ć.:/

JP
A ok. Nie zalapalem, że to jedna tablica. Form jest taką samą klasą jak cokolwiek. Jak zdefiniujesz tablice jako propoperty w klasie Form to bedziesz mial dostep do niej ze wszystkich metod tej klasy, takze z metod zdarzen. Zdefiniuj tablice w klasie poza metodą obliczeń.
M2
Tylko ze ja mam zdefiniowaną tablicę bezpośrednio w klasie Form1. Używam jej w algorytmie który się uruchamia po wciśnięciu przycisku. I jak np chcę użyć tablicy w panel1_Paint() to jak wpisuje y[1,0] tak dla przykładu to podkreśla mi i pisze wtedy : Only assignment, call, increment, decrement, and new object expressions can be used as a statement.
JP
Masz info na privie. Jak wpiszesz TYLKO y[0.1]; to dostaniesz taki komunikat jak piszesz. Trzeba albo przypisać wartość do tablicy: y[0,1] = coś albo odczytać var coś = y[0,0];

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.