Interpolacja funkcji wczytanej z bitmapy [C++]

0

Witam, mam do wykonania projekt, który na podstawie wczytanej bitmapy dokona interpolacji funkcji i wyrysuje ją w oknie np. gnuplota. Mój problem polega na tym, że aplikacja ma być zorientowana obiektowo i nie wiem jakiej biblioteki mógłbym użyć, by wczytać bitmapę i mógł na niej operować. Jaką bibliotekę do tego polecacie? Próbowałem allegro, ale nie jest ona zorientowana obiektowo.

0

Ty masz zrobić obiektowo zorientowany projekt a nie znaleźć obiektowo zorientowaną bibliotekę. Łapiesz różnicę ?

0

Zacząłem się tym bawić, ale mam problem. Chcę, aby program w pętli prosił o podanie pliku z bitmapą do czasu jak otrzyma poprawną nazwę i istniejącą. Niestety po podaniu poprawnej nazwy program się wysypuje. Co jest nie tak?

#include <iostream>
#include <string>
#include <allegro.h>

using namespace std;

class funkcja
{
public:
  double x;
  double y;
};

int main()
{
    string nazwa_pliku;
    
    allegro_init();
    install_keyboard();
    set_color_depth(32);
    set_gfx_mode(GFX_AUTODETECT_WINDOWED, 460, 390, 0, 0);
    
    BITMAP* graph;
    do
    {
      cout << "Podaj nazwe pliku z wykresem: ";
      cin >> nazwa_pliku;
      graph = load_bmp(nazwa_pliku.c_str(), default_palette);
    
      if(!graph)     
      {
        set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);
        allegro_message("Nie znaleziono pliku!");
      }
    }while(!graph);
    
    blit(graph, screen, 0, 0, 0, 0, graph->w, graph->h);
    textout_ex(screen, font, "Aby wyjsc, wcisnij ENTER...", 0, 380, makecol(255, 255, 255), -1);
    readkey();
    
    allegro_exit();
    return 0;
}
END_OF_MAIN();
 
0

Pewnie masz brak debugiera.

0

Nie mam :) Ale poradziłem sobie z tym. Stworzyłem już większą bazę na program jednak zastanawiam się czy nie ma bardziej optymalnej metody na pozyskiwanie współrzędnych punktów.

#include <iostream>
#include <string>
#include <allegro.h>
#include <vector>
#include <fstream>

using namespace std;

class dane
{
public:
       
     vector<double> x;
     vector<double> y;
     
     void zapis()
     {
          string nazwa;
          fstream plik;
          cout << "Podaj nazwe pliku do zapisu znalezionych punktow: ";
          cin >> nazwa;
          plik.open(nazwa.c_str(), ios::out | ios::trunc);
          for(int i=0;i<=this->x.size();i++)
          plik<<this->x[i]<<" "<<this->y[i]<<endl;
          plik.close();
     };
     
     void konwersja()
     {
          for(int i=0; i<=this->x.size(); i++)
          {
               this->x[i]=(this->x[i]-230)/23;
               this->y[i]=((this->y[i]-185)/18.5)*(-1);
          }
     };
     
};

int main()
{
    string nazwa_pliku;
    dane punkty;
    
    allegro_init();
    install_keyboard();
    set_color_depth(32);
    
    BITMAP* graph;
    do
    {
      cout << "Podaj nazwe pliku z wykresem: ";
      cin >> nazwa_pliku;
      set_gfx_mode(GFX_AUTODETECT_WINDOWED, 460, 390, 0, 0);
      graph = load_bmp(nazwa_pliku.c_str(), default_palette);
      
      if(!graph)     
      {
        set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);
        allegro_message("Nie znaleziono pliku!");
      }
    }while(!graph);
    
    blit(graph, screen, 0, 0, 0, 0, graph->w, graph->h);
    textout_ex(screen, font, "Aby wyjsc, wcisnij ENTER...", 0, 380, makecol(255, 255, 255), -1);
    readkey();
    
    for(int i=0; i<=(graph->w); i++)
    for(int j=0; j<=(graph->h); j++)
    if(getpixel(graph,i,j)==makecol(255,0,0))
    {
         punkty.x.push_back(i);
         punkty.y.push_back(j);
    };
    
    punkty.x.pop_back();
    punkty.y.pop_back();
    
    punkty.konwersja();
    punkty.zapis();
    
    destroy_bitmap(graph);
    allegro_exit();
    return 0;
}
END_OF_MAIN();

 

Kod właściwie potrafi rozpoznać wykres każdej funkcji. Mam pomysł już jak uniezależnić poszukiwanie wykresu od koloru tła, samego wykresu, oraz osi współrzędnych, czy wielkości bitmapy, jednak powyższy kod ni jak ma się do zagadnienia interpolacji. Czy ktoś mógłby podpowiedzieć jaką metodę interpolacji najlepiej wykorzystać, gdy mamy znalezione powiedzmy 50/100 punktów. Tutaj metoda Newtona polegnie, bo im więcej punktów tym współczynniki przekraczają rozmiar dostepnych typów danych i nie uśmiecha mi się do 50 współczynników pisać wielomianu.

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