Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[Delphi] analiza danych z wykresem

19 Jan 2012 22:39 1874 12
  • Level 32  
    Witam

    Mam pytanie bardziej techniczne niż programistyczne :)

    Mam wykonać działania na pewnych liczbach zapisanych w 2 plikach liczby są w plikach jedna pod drugą,

    będzie ich większa ilość około 20 000 i teraz nie wiem czy ma sens wczytanie danych z pliku do memo i czy w ogóle memo pomieści tyle lini :?: i jak będzie szybciej to działało.

    Drugim problemem jakim się zmagam to wykres
    do tej pory nie bawiłem się w rysowanie wykresów mianowicie po przetworzeniu danych chciałbym nanieść na wykres punkty

    to wiem ze da się zrobić bezproblemowo :)

    Następnie kliknąć na wykresie punkt gdzie chciałbym styczną do wykresu funkcji styczna by wychodziła z punktu 0,0 i "stykała" się z wykresem w punkcie w który kliknąłem na wykresie, a następnie po naciśnięciu przycisku była by równolegle przesuwana o zadana wartość.

    Problem w tym że styczna nie zawsze by się faktycznie stykała z jakimś punktem bo rożnie mogą się rozłożyć punkty na wykresie, niestety nie wiem jak to ugryźć byłbym wdzięczny za jakieś sugestie lub podpowiedzi.

    Pozdrawiam :)
    [30.03.2021, darmowy webinar] Nowoczesna diagnostyka maszyn, monitorowanie i przewidywanie awarii. Zarejestruj się
  • Helpful post
    Level 42  
    Kwestia wczytywania do Memo jest prosta - jak chcesz widzieć, to tak, jak nie to nie. Jednak jeśli będziesz chciał operować na tych liczbach to najlepiej wczytać je do dynamicznej tablicy, albo od biedy do TStringList.

    Y... "Styczna" to mi się kojarzy z pochodną funkcji ;) Co do klikania - najlepiej zrób sam wykres na Image i przy klikaniu obliczaj, gdzie kliknąłeś (współrzędne * skala) i rób, co trzeba. Możliwe, że są jakieś gotowe komponenty, gdzie można klikać w punkty na wykresie ;)
  • Level 32  
    Dzięki za odpowiedź nie wiedziałem nawet że w delphi są dynamiczne tablice, ale cóż cały czas się uczę ;) czy to wpłynie na szybkość działania programu :?:

    Chciałbym wiedzieć czy wystarczy mi lini w memo :?:

    Memo jest dla mnie wygodne bo ma LodFromFile

    I w ogóle czy ma sens wczytywanie takiej ilości danych - bo może to mulić - albo ja tak myślę :)

    Jeśli chodzi o styczną to faktycznie chodzi o pochodną ale żeby określić wzór funkcji po punktach to już nie jest to proste, i chciałbym plus minus ręcznie rysować,

    największym problemem jest to że w miejscu przecięcia się stycznej z wykresem nie zawsze będzie tam punkt

    Myślałem nad paintbox-em ale nie wiem jak tam zrobić skalę na osiach ale w sumie jak bym odczytywał od razu dane z kursora to nawet nie było by to potrzebne.

    Co kolega o tym myśli :?:

    Pozdrawiam
  • Level 42  
    1. Oczywiście że są dynamiczne tablice. Były już w Pascalu ;) Szybkość - gdyby chodziło o samo wczytanie to szkoda by było. Ale z pewnością będziesz chciał mieć na bieżąco wartości punktów i móc je przeglądać - wówczas dynamiczna tablica to najszybsze rozwiązanie.

    2. Memo służy do wyświetlania na ekranie. Jeśli potrzebujesz samego ładowania z pliku, to użyj TStringList (takiego typu jest właśnie własność Lines z Memo). Jednak na pewno będziesz chciał sprawdzać wartości numeryczne - trzymanie tego w postaci tekstu jest marnotrawieniem i pamięci i później mocy obliczeniowej procesora.

    3. Cóż, inna definicja (graficzna) na pochodną mówi, że jest to prosta równoległa do prostej przechodzącej przez dwa sąsiednie punkty i przechodząca przez punkt analizowany.

    Skalę - po prostu badasz maksymalne zakresy - to będzie dla Ciebie 100% wykresu. A więc z prostej proporcji:
    skala = szerokość_wykresu/maksymalna_wartość
    Musisz przeskalować wykres, bo raczej nigdy nie ograniczysz się do jego wymiarów z wartościami. A punktem na wykresie są współrzędne rzeczywiste pomnożone przez skalę, zaś wartością - współrzędne na wykresie podzielone przez skalę.
  • Helpful post
    Level 42  
    Oczywiście, że tablice są puste. Musisz je wcześniej wypełnić danymi ;)
    Gdyby plik współrzędnych miał np taką postać (x,y):
    Code:
    1 4
    
    3 7
    3 2
    To wczytanie wyglądałoby mniej-więcej tak:
    Code: Delphi
    Log in, to see the code
    (piszę z pamięci)
    Oczywiście to sposób nie optymalny, ale używa tego, co znasz.
  • Level 32  
    Dzięki za odpowiedź ale akurat mam prościej bo w 1 pliku jedna kolumna.

    Czy mógłbym się dowiedzieć jaki byłby optymalny sposób :?:

    Chętnie się do edukuje ;)

    Pozdrawiam
  • Level 32  
    Tak zgadza się działa bez problemu :) poradziłem sobie :)

    Czyli z tym nie optymalnym sposobem chodziło tylko o wycinanie spacji :?:

    Czy jakiś inny sposób porostu :?:

    Dziękuje i pozdrawiam
  • Level 42  
    Zakładam, że wczytywanie i tak odbywa się tylko raz, więc jego udział w całości jest niewielki.
    Szybciej oczywiście będzie nie korzystać w ogóle ze TStringList, lecz wczytywać wprost z pliku... Z jednym 'ale'. Dobrze by było, gdyby na początku była zapisana liczba wierszy ;) Bo w przeciwnym wypadku albo pozostanie dwa razy go przejrzeć (na początku zliczając liczbę wierszy), albo dynamicznie zmieniać rozmiar tablicy dynamicznej (bardzo czasochłonne), albo zastosować listę dynamiczną (mniej wygodne).

    Myślę, że możesz zostawić jak jest.
  • Level 32  
    Kurcze doszedłem do rysowania wykresu i mam problem.

    Wykres rysuje w paintbox-ie

    tablice ma typu real i dane też zaokrąglam przy obliczeniach do 2 miejsc po przecinku

    a niestety punkty są typu całkowitego i nie wiem jak to rozwiązać ze skalowaniem poradziłem sobie po przez znajdywanie największej wartości w tablicy.

    nie wiem jak to rozwiązać :/