Wykresy krzywych

0

Witam
Mam stworzony w miarę prosty program ,który generuje współrzędne punktów x i y dla wybranych punktów kontrolnych (metoda Beziera).
Program wypisuje mi na ekran współrzędne punktów.Jednakże bardzo przydatna dla mnie byłaby możliwość zobaczenia ów krzywej.
Ściągnąłem program GNUplot ale nie za bardzo się w nim orientuje.Plik w C++ mam w rozszerzeniu .cpp .Co zrobić krok po kroku żebym mógł zobaczyć tą krzywą na płaszczyźnie.Bardzo proszę o pomoc.
Kod programu:

#include <iostream>
#include <math.h>
using namespace std;

int main()
{
	float Ax = 0, Ay = 0, Bx = 0, By = 4, Cx = 2, Cy = 5, Dx = 8, Dy = 4;
	float Px, Py;
	cout << "Wspolrzedne punktow kontrolnych krzywej: " << endl;
	cout <<"A=["<< Ax << " " << Ay <<"]"<< endl;
	cout <<"B=["<< Bx << " " << By <<"]" << endl;
	cout <<"C=["<< Cx << " " << Cy <<"]" << endl;
	cout <<"D=["<< Dx << " " << Dy <<"]" << endl;
	cout << "Generowanie wspolrzednych krzywej:" << endl;
	for (float t = 0.00; t <= 1; t = t + 0.01)
	{
		 Px = Ax*pow(1 - t, 3) + 3 * Bx*t*pow(1 - t, 2) + 3 * Cx*pow(t, 2)*(1 - t) + Dx*pow(t, 3);
		 Py = Ay*pow(1 - t, 3) + 3 * By*t*pow(1 - t, 2) + 3 * Cy*pow(t, 2)*(1 - t) + Dy*pow(t, 3);
		 cout <<"["<< Px <<" "<<Py<<"]"<< endl;
		
	}
	
	system("pause");
	return 0;
} 
0

stwórz matrycę i wypełnij ją na podstawie krzywej - narysuj ją na niej. Później zostanie Ci tylko wyświetlenie matrycy

0

Jak mam stworzyć tą matrycę?

1

@spartanPAGE pisząc matrycę chyba miał na myśli macierz dwu-wymiarową

0

Ok czyli tworzę macierz dwuwymiarową,następnie uzupełniam ją moimi współrzędnymi.Ale co potem? Nie zrozumiałem "narysuj na niej..".
Co ma wspólnego macierz z pewnymi wartościami do wyświetlenia jakiejś krzywej?

0

Ustawiasz wartość w każdym punkcie jaki określa krzywa, a później wszystkk rysujesz.

0

"Wszystko rysujesz "...
Jak, gdzie, na czym?
Wiem że to może dziwne są pytania ale za cholerę nie wiem o co chodzi.
W moim pytaniu miałem na myśli , co zrobić, jakie komendy,biblioteki itp dołączyć żeby ukazywał się obraz ,wykres tej krzywej.
Jeszcze nigdy nie zajmowałem się graficznym aspektem programowania wiec ciężko mi to zrozumieć

1

Tworzysz macierz dwu-wymiarową np typu

bool

. To jest taka jakby bitmapa. Tam gdzie ma być pixel ustawiasz true. Tam gdzie nie ma być ustawiasz false. Już wiesz gdzie masz rysować pixele (pierwszy post). Więc zamiast wywalać na std::cout

 po prostu ustawiasz to w bitmapie.
Na koniec możesz sobie z tą bitmapą zrobić co chcesz. 

Fajnie się robiło to prosz gotowiec i parę screenów co z tego wychodziło

```cpp
#include <iostream>
#include <math.h>
#include <vector>
#include <algorithm>
#include <fstream>


using namespace std;

void writePgm(const vector<vector<bool> > m)
{
    ofstream pgmFile("pgmFile.pgm");

    pgmFile<<"P2\n"<<m[0].size()<<" "<<m.size()<<"\n"<<1<<"\n";

    for(size_t y = 0; y < m.size(); ++y)
 	{
 		for(size_t x = 0; x < m[0].size(); ++x)
 			pgmFile<<((m[y][x]) ? 1 : 0)<<"\n";


 	}
}

int main()
{
    //float Ax = 0, Ay = 0, Bx = 0, By = 4, Cx = 2, Cy = 5, Dx = 8, Dy = 4;
    float x[] = { 0, 0, 2, 8 };
    float y[] = { 0, 4, 5, 4 };
    float Px, Py;

    const size_t scale = 100; // skala to ile jeden punkt ma mieć pixeli
    const size_t offset = 20;
    const float step = 0.001;
    const size_t A = 0;
    const size_t B = 1;
    const size_t C = 2;
    const size_t D = 3;
    vector< vector<bool> > m;
    size_t maxW, maxH;

    cout << "Wspolrzedne punktow kontrolnych krzywej: " << endl;
    cout <<"A=["<< x[A] << " " << y[A] <<"]"<< endl;
    cout <<"B=["<< x[B] << " " << y[B] <<"]" << endl;
    cout <<"C=["<< x[C] << " " << y[C] <<"]" << endl;
    cout <<"D=["<< x[D] << " " << y[D] <<"]" << endl;
    cout << "Generowanie wspolrzednych krzywej:" << endl;


    maxW = 2*offset + scale*(*max_element(x, x+4) - *min_element(x, x+4));
    maxH = 2*offset + scale*(*max_element(y, y+4) - *min_element(y, y+4));

    m.resize(maxH, vector<bool>(maxW, false));

    for (float t = 0.00; t <= 1; t += step)
    {
         Px = x[A]*pow(1 - t, 3) + 3 * x[B]*t*pow(1 - t, 2) + 3 * x[C]*pow(t, 2)*(1 - t) + x[D]*pow(t, 3);
         Py = y[A]*pow(1 - t, 3) + 3 * y[B]*t*pow(1 - t, 2) + 3 * y[C]*pow(t, 2)*(1 - t) + y[D]*pow(t, 3);

         Px = Px*scale + offset;
         Py = Py*scale + offset;

         m[Py][Px] = true;
    }


 	writePgm(m);

    return 0;
}

Pokombinuj sobie ze skalą i krokiem żeby Ci pasowało

EDIT
wiem, że są nie fajne tablice x i y, ale nie chciało mi się kombinować. Dostosuj do swoich potrzeb

0

Ok już rozumiem istotę sprawy.
Ale po uruchomieniu programu ten wykres mi się nie pojawia?
Widzę ze screenów że plik jest z Gimpa

0

Dziękuję bardzo za wszelką pomoc.
Chciałbym rozszerzyć o kilka możliwości program ,żeby można było rysować różne krzywe.
Jednakże w powyższym kodzie ,jeśli chciałbym aby współrzędne punktów kontrolnych były nadawane przez użytkownika, to wyskakuje error o tym, że:
"vector subscript out of range"(mniej więcej taki tekst).Domyślam się że chodzi o rozmiar wektora.Mógłby mi ktoś powiedzieć jak zmienić to w programie?Wiem że strasznie truje ale pomogło by mi to zrozumieć istotę takiego programu.

0

Wyszedłeś poza zakres.

0

A jak zmienić/rozszerzyć zakres tego wektora?

0

vector<T>::size_type vector<T>::size() const noexcept;

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