C++/Borland/Rysownie funkcji/pomoc

C++/Borland/Rysownie funkcji/pomoc
W9
  • Rejestracja:około 12 lat
  • Ostatnio:prawie 12 lat
  • Postów:18
0

Witam!
Mam nadzieję że temat wyjaśnił wszystko, jeżeli coś pominąłem to proszę pytać- teraz rozwinięcie.
Mam stworzyć projekt programu- prawdopodobnie będzie to SDI żeby była możliwość zapisu, drukowania i inne takie bajery- niepotrzebne ale skoro projekt na ocenę to ma być tego jak najwięcej. Mam problem zasadniczy- nie wiem jak się za to zabrać... Na razie skonstruowałem sam układ współrzędnych:

Kopiuj
void __fastcall TForm1::PaintBox1Paint(TObject *Sender)
{
//układ współrzędnych
PaintBox1->Canvas->Pen->Color=clBlack;
PaintBox1->Canvas->MoveTo(Form1->Width/2,Form1->Height/2);
PaintBox1->Canvas->LineTo(Form1->Width/2,Form1->Height);
PaintBox1->Canvas->MoveTo(Form1->Width/2,Form1->Height/2);
PaintBox1->Canvas->MoveTo(Form1->Width/2,Form1->Height/2);
PaintBox1->Canvas->LineTo(Form1->Width/2,0);
PaintBox1->Canvas->MoveTo(Form1->Width/2,Form1->Height/2);
PaintBox1->Canvas->LineTo(0,Form1->Height/2);
PaintBox1->Canvas->MoveTo(Form1->Width/2,Form1->Height/2);
PaintBox1->Canvas->LineTo(Form1->Width,Form1->Height/2);

//numeracja osi OX
for(int i=0;i<Form1->Width;i+=30){
        PaintBox1->Canvas->MoveTo(i,Form1->Height/2-5);
        PaintBox1->Canvas->LineTo(i,Form1->Height/2+5);

}
//numeracja osi OY
for(int i=;i<Form1->Height;i+=30){
        PaintBox1->Canvas->MoveTo(Form1->Width/2-5,i);
        PaintBox1->Canvas->LineTo(Form1->Width/2+5,i);

}
PaintBox1->Canvas->Pen->Color=clRed;
PaintBox1->Canvas->MoveTo(0,Form1->Height);
PaintBox1->Canvas->LineTo(Form1->Width,0);
} 

To by było na tyle- tylko problem jest taki że przesuwam linie wyznaczające wartości o 10 pikseli cały czas- zarówno w pionie jak i poziomie jednak nie są one dobrze rysowane. Odstęp jest zachowany ale nie podoba mi się to wizualnie.
Potem mam problem z rysowaniem wyznaczonej funkcji... np. 2x-3. Mam pomysł żeby stworzyć dwie tablice które będą przechowywały współrzędne punktów odpowiedzialne za poszczególne wartości na osiach. Np. TablicaX będzie miała 20 elementów- tak żeby był zakres od -10 do 10, i przypisywać im wartości w pikselach z okna- np. 540,550,560,570 i tak dalej- to samo analogicznie z drugą. Liczyć na liczbach i przekształcać na wartości położenia.
Poczytałem tematy podobne i ktoś coś bąknął o bibliotece WinBgim która jest podobno użyteczna w tym. Nie mam pojęcia do czego ona służy lub czy jest jakiś temat objaśniający co poszczególne jej funkcje potrafią- no i informacje których w ogóle się uczyć.
Jak ktoś może to bardzo proszę o pomoc, może jest możliwość przekonfigurowania ekranu żeby nie był w pikselach tylko liczba i środek formularza miał współrzędne 0,0.
Pozdrawiam i czekam na odpowiedź. Każda krytyka jest mile widziana :D.

Rekman
  • Rejestracja:prawie 13 lat
  • Ostatnio:prawie 10 lat
  • Postów:148
0

tylko problem jest taki że przesuwam linie wyznaczające wartości o 10 pikseli cały czas- zarówno w pionie jak i poziomie jednak nie są one dobrze rysowane. Odstęp jest zachowany ale nie podoba mi się to wizualnie.

Podziałki powinieneś rysować od środka układu współrzędnych.
Na przykład podziałka pozioma na prawo od środka:

Kopiuj
for(int i=Form1->Width/2;i<Form1->Width;i+=30){
        PaintBox1->Canvas->MoveTo(i, Form1->Height/2-5);
        PaintBox1->Canvas->LineTo(i, Form1->Height/2+5);
        
}

Podobnie pozostałe.

Poczytałem tematy podobne i ktoś coś bąknął o bibliotece WinBgim która jest podobno użyteczna w tym.

Dla Ciebie ta biblioteka będzie bezużyteczna, ponieważ rysujesz w przeznaczonym do tego komponencie.

Jak ktoś może to bardzo proszę o pomoc, może jest możliwość przekonfigurowania ekranu żeby nie był w pikselach tylko liczba i środek formularza miał współrzędne 0,0.

Jest taka możliwość funkcją MoveWindowOrg()z bibloteki VCL, ale wsołrzędne będą nadal w pikselach. Lepiej do tego użyc funkcji systemowych Windows do zmiany trybu odwzorowania. Wymaga to jednak pewnej wiedzy o sposobie ich użycia.

W9
  • Rejestracja:około 12 lat
  • Ostatnio:prawie 12 lat
  • Postów:18
0

Mam ten projekt zrobić do 3 maja, więc jeżeli masz możliwość podesłania jakiejś lektury to bardzo bym prosił. Jak nie no to liniówkę zrobię topornie- po prostu tablicę do wartości y i będę sprawdzał z wzorem :p.

Rekman
  • Rejestracja:prawie 13 lat
  • Ostatnio:prawie 10 lat
  • Postów:148
0

Mam nadzieję, że układ współrzędnych już rysuje się dobrze.

Niestety żadnymi materiałami nie dysponuję. Coś na ten temat znajdziesz u Stasiewicza bodajże w "Symulacje komputerowe".

Tablica się przyda. Dzięki temu będziesz mógł w zdarzeniu OnPaint pobierać gotowe dane a nie w kółko wyliczać. Zaś same obliczenia przenieść do osobnej funkcji:

Kopiuj
void oblicz_2x_minus_3(int poczatek, int koniec, int krok, std::vector<TPoint>& dane_dla_wykresu)
{
    dane.clear();
    for(int x = poczatek; x <= koniec; x += krok)
	dane_dla_wykresu.push_back(TPoint(x, 2 * x- 3));
		
} 

Prymitywne, ale zawsze coś.
Wartość funkcji jest obliczana w jednostkach logicznych. Zatem należy je zamienić na współrzędne ekranu:

Kopiuj
PaintBox1->Canvas->MoveTo(ox + dane_dla_wykresu[i].x * skala, oy - dane_dla_wykresu[i].y * skala); 

ox, oy - wspólrzędne środka wykresu; skala - liczba pikseli na jednostkę (u Ciebie = 30).

edytowany 1x, ostatnio: Rekman

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.