Skocz do zawartości
Zamknięcie Forum PC LAB

Szanowny Użytkowniku,

Informujemy, że za 30 dni tj. 30 listopada 2024 r. serwis internetowy Forum PC LAB zostanie zamknięty.

Administrator Serwisu Forum PC LAB - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie: wypowiada całość usług Serwisu Forum PC LAB z zachowaniem miesięcznego okresu wypowiedzenia.

Administrator Serwisu Forum PC LAB informuje, że:

  1. Z dniem 29 listopada 2024 r. zakończy się świadczenie wszystkich usług Serwisu Forum PC LAB. Ważną przyczyną uzasadniającą wypowiedzenie jest zamknięcie Serwisu Forum PC LAB
  2. Dotychczas zamowione przez Użytkownika usługi Serwisu Forum PC LAB będą świadczone w okresie wypowiedzenia tj. do dnia 29 listopada 2024 r.
  3. Po ogłoszeniu zamknięcia Serwisu Forum od dnia 30 października 2024 r. zakładanie nowych kont w serwisie Forum PC LAB nie będzie możliwe
  4. Wraz z zamknięciem Serwisu Forum PC LAB, tj. dnia 29 listopada 2024 r. nie będzie już dostępny katalog treści Forum PC LAB. Do tego czasu Użytkownicy Forum PC LAB mają dostęp do swoich treści w zakładce "Profil", gdzie mają możliwość ich skopiowania lub archiwizowania w formie screenshotów.
  5. Administrator danych osobowych Użytkowników - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie zapewnia realizację praw podmiotów danych osobowych przez cały okres świadczenia usług Serwisu Forum PC LAB. Szczegółowe informacje znajdziesz w Polityce Prywatności

Administrator informuje, iż wraz z zamknięciem Serwisu Forum PC LAB, dane osobowe Użytkowników Serwisu Forum PC LAB zostaną trwale usunięte ze względu na brak podstawy ich dalszego przetwarzania. Proces trwałego usuwania danych z kopii zapasowych może przekroczyć termin zamknięcia Forum PC LAB o kilka miesięcy. Wyjątek może stanowić przetwarzanie danych użytkownika do czasu zakończenia toczących się postepowań.

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

Uzikan

[c++] rysowanie wykresów

Rekomendowane odpowiedzi

Witam,

słuchajcie mam 2 miesiące na napisanie programu semestralnego. Temat jaki mi przydzielono losowo to w skrócie "rysujący wykresy funkji i ich pochodnych". Piszemy aplikacje dialogowe MFC wiec domyślnie mam je też wykorzystać i tutaj. Szukam wszelkich wskazówek, porad jak się do tego zabrać. Przede wszystkim interesuje mnie jak w ogóle mam to napisać. Domyślam się że będe musiał wykorzystać jakieś dodatkowe biblioteki, ja się na tym nie znam aż w takim stopniu, programuje od niedługiego czasu a przede mna już takie wyzwanie.. no cóż Polibuda :)

 

Tu dokładne polecenia żeby potem nikt nie wołał:

6. Używając aplikacji dialogowych napisz program rysujący wykresy funkcji
matematycznych (liniowych, kwadratowych, trygonometrycznych,
logarytmicznych lub wykładniczych) oraz ich pochodnych (jeżeli istnieją).
Użytkownik powinien wprowadzać daną funkcję w postaci tekstu. Funkcja
jak i jej pochodna winna być rysowana na zadanym przez użytkownika
przedziale. Np. f(x)=sinx+2x dla x należącego do przedziału [-5,3].

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

tacy znajomi dość szybko napisali sobie aplikację rysującą wykresy tylko że oni używali c++ + qt4. Więc jesli masz możliwość użycia qt4 to możesz o tym poczytać.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Hmmm... generalnie piszę w Visual Studio i tak się zastanawiam czy nie można jakoś tego wykorzystać. Na forach piszą że przy użyciu VS można rysować wykresy ale nie ma nic konkretnego

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

wstawiasz kontrolkę image, bitmap czy jak to się tam nazywa i rysujesz po niej

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Gość tobix10

Najłatwiej rysować piksel po pikselu. Od razu też sobie jakieś skale porób, żeby później nie było problemu przy zmianie rozmiaru okna.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

ostatnio mialem na zadanko wykres rysujacy wielomian n-tego stopnia , wystaczy prosta biblioteka , ja to robilem w allegro. Wiem że to sie az tak nie umywa do tego co masz napisać , ale to liceum jest ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Ale panowie panowie... konkrety! Co to znaczy "rysować piksel po pikselu" ? Masz na myśli pętle drukującą "kropki"... nie tędy droga. To ma porządnie wyglądać. Wspominał ktoś o kontrolce picture... Możecie to troche rozwinąć? Jak rysować?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

A dokumentacji to się czytać nie chce? Podejrzewam, że największy problem w tym całym programie to będzie dla Ciebie wymyślenie algorytmu, który przetworzy wprowadzony tekst na równanie.

 

W każdym razie:

1. Skorzystaj z jakiejś gotowej biblioteki, która umożliwi Ci rysowanie tychże wykresów (Qt, Allegro, DirectX, WPF, cokolwiek).

2. Wymyśl algorytm, o którym pisałem wyżej.

3. Ale przede wszystkim - czytaj instrukcje. Chcesz się czegoś nauczyć? Czytaj, pisz, czytaj, próbuj, itd.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie programowałem w Visualu, więc napisze ogólnie.

 

1. Tak jak napisał Januzi musisz obczaić kontrolkę która udostępnia obszar do rysowania i jej obsługę. Wykresy standardowo rysuje się łamanymi - dla każdego punktu w osi poziomej (x) wyznacza się punkt na osi pionowej (y) i łączy linią z poprzednim punktem. To będzie część łatwa i przyjemna.

 

2. Potrzebujesz parsować formułę napisaną tekstem. To będzie największe wyzwanie w programie. Parser obsługujący 5 podstawowych działań, zadane wcześniej funkcje i nawiasy można napisać od zera w jeden wieczór o ile wie się jak się za to zabrać. Można wykorzystać do tego gotowy generator. W c++ najpopularniejsze jest połączenie Lex/flex + YACC/Bison. Tylko, że do tego trzeba się nauczyć jak zapisywać gramatykę w sposób zrozumiały dla generatora parserów, jak spiąć ze sobą lekser z parserem i ew. odpalić to pod visualem (nie mam pojęcia czy zadziała od ręki, trzeba by pogooglować). Druga opcja to napisanie samemu parsera działającego metodą zstępującą. Tylko do tego wypadałoby znać jakieś podstawy, na dobrą sprawę przydałoby się przerobić 5 pierwszych wykładów stąd, lub równoważny materiał. Ostatnia opcja to znalezienie gotowej biblioteki oferujące parsowane/ewaluację stringów i nauczenie się jej obsługi.

 

3. Liczenie pochodnej. To możesz przeprowadzić na dwa sposoby: numerycznie lub formalnie. Odnośnie pochodnej formalnej, mając wzór funkcji w wygodnej do przekształceń postaci (jakiegoś drzewka) możesz napisać algorytm, który wyprodukuje funkcję będącą pochodną. Wielkiej filozofii tu nie ma, choć jest trochę przypadków, w zasadzie wzory z liceum: pochodna sumy, iloczynu, ilorazu, złożenia funkcji i pochodne funkcji podstawowych. Przy całkowaniu numerycznym przybliżasz wartość pochodnej przy pomocy ilorazu różnicowego - liczysz funkcje dla x, x+h (h raczej nieduże, ale też nie zamałe, żeby nie wylecieć poza precyzję arytmetyki procesora), a za pochodną przyjmujesz (f(x+h)-f(x))/h.

 

http://wazniak.mimuw.edu.pl/index.php?title=Pok-5-wyk-toc

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Panowie... zna ktoś troche MFC?? Program już prawie gotowy tylko mam jeszcze jeden problem. Nie potrafie w SDI przerysować widoku. Czytałem na forach o kilku funkcjach, ale albo nie działają albo nie umiem ich użyć. Generalnie problem jest taki że funkcja OnDraw pobiera wskaźnik na CDC... a normalnie w programie nie mam do niego dostępu

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Ty masz po prostu zaimplementować funkcje OnDraw i rysować używając pDC z parametru, a MFC samo wywoła tą funkcje i wstawi pod ten parametr odpowiednią wartość.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie jak to.... załóżmy że w oknie dialogowym wczytuje jakieś dane do zmiennych podłączonych do kontrolek. Dodaje sobie button który po wciśnięciu aktualizuje dane i zamyka okno. Przecież po samym zamknięciu okienka nie przerysuje mi sie widok... Musiałbym jakoś wywołać funkcję OnDraw tylko jak???

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Wywołaj na oknie Invalidate(true);

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Teraz zauważyłem że problem polega na czym innym. Funkcja Invalidate działa ok... tylko... mimo tego że po wczytaniu danych aktualizuje zmienne funkcją UpdateData(true) to jednak w klasie widoku zmienne mają domyślne wartości nadane przez konstruktor ;/ O co chodzi?? Generalnie zrobiłem tak jak zawsze, tzn do klasy widoku dodałem obiekt klasy dialogowej do którego wczytuję dane. Zawsze tak działało... ale teraz nie

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Kolejny problem na który nie mam pomysłu...

Otóż funkcja która wylicza wartości dla argumentów zwraca typ double ponieważ są to także wartości sin, cos itd. Funkcja LineTo() przyjmuje jako argumenty tylko integer ... Konwersja jawna do int nie ma sensu ponieważ dla np. sinusa otrzymywałbym tylko wartości 0 lub 1

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

A czy lineTo() to nie jest funkcja rysujaca linie od - do? Jeśli tak to w czym jest problem? Obliczasz wartości funkcji dla podanych argumentów - później przepuszczasz sobie przez jakieś skalowanie aby wartość funkcji przeskalować do współrzędnych kontrolki po której rysujesz i te wartości dajesz do lineTo() rzutując przy okazji jeżeli wyjdą ci jakieś przecinki.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Kolejny problem na który nie mam pomysłu...

Otóż funkcja która wylicza wartości dla argumentów zwraca typ double ponieważ są to także wartości sin, cos itd. Funkcja LineTo() przyjmuje jako argumenty tylko integer ... Konwersja jawna do int nie ma sensu ponieważ dla np. sinusa otrzymywałbym tylko wartości 0 lub 1

Pomnóż razy np 100, a później zrób z tego inta.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dobra juz sobie poradziłem :) Dzieki chłopaki za wszytko ;] Jak będzie skończony to wam pokaże :P

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...