Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[Język C] - biblioteka Allegro - wykres sinusoidy

Ostatnio zmodyfikowano 2011-05-30 22:58
Autor Wiadomość
lucky44
Temat założony przez niniejszego użytkownika
[Język C] - biblioteka Allegro - wykres sinusoidy
» 2011-05-30 22:04:04
Witam proszę o pomoc, mam zrobione taki kod jednak on robi wykres sinusoidalny pixelami (punktowo), ja mam za zadanie zrobić to linią zagęszczoną (bez odstępów) bardzo proszę o pomoc, to jest język C - biblioteka Allegro.


C/C++
#include <allegro.h>
#include <math.h>
void init();
void deinit();

int main() {
    init();
   
    int x = 0, y = 0, r = 0;
   
    while( !key[ KEY_ESC ] ) {
        y = 50 * sin( x /( 2 * 3.1415 ) ) + 100;
       
       
        putpixel( screen, x, y, makecol( 255, 255, 255 ) );
        _sleep( 100 );
        /* put your code here */
    }
   
    deinit();
    return 0;
}
END_OF_MAIN()

void init() {
    int depth, res;
    allegro_init();
    depth = desktop_color_depth();
    if( depth == 0 ) depth = 32;
   
    set_color_depth( depth );
    res = set_gfx_mode( GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0 );
    if( res != 0 ) {
        allegro_message( allegro_error );
        exit( - 1 );
    }
   
    install_timer();
    install_keyboard();
    install_mouse();
    /* add other initializations here */
}

void deinit() {
    clear_keybuf();
    /* add other deinitializations here */
}
P-33670
DejaVu
» 2011-05-30 22:30:55
<<nieważne>>
P-33671
lucky44
Temat założony przez niniejszego użytkownika
» 2011-05-30 22:43:14
Nikt nie ma pomysłu? Jest mi to bardzo potrzebne:(
P-33672
ison
» 2011-05-30 22:51:33
o coś takiego chodzi?
C/C++
#include <allegro.h>
#include <math.h>
void init();
void deinit();

int main() {
    init();
   
    int x = 0, y = 0, r = 0;
   
    while( !key[ KEY_ESC ] ) {
        putpixel( screen, x, 300 + sin( x / 50.f ) * 300, makecol( 255, 255, 255 ) ); //50.f to rozpostarcie sinusoidy, można zmieniać dowolnie lecz przy mniejszych wartościach kolejne pixele będą mocno od siebie oddalone, ważne aby na końcu liczby znalazło się .f aby móc operować na liczbach zmiennoprzecinkowych (zamiast tego można rzutować)
        ++x;
        if( x > 800 ) x = 800;
       
    }
   
    deinit();
    return 0;
}
END_OF_MAIN()

void init() {
    int depth, res;
    allegro_init();
    depth = desktop_color_depth();
    if( depth == 0 ) depth = 32;
   
    set_color_depth( depth );
    res = set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 );
    if( res != 0 ) {
        allegro_message( allegro_error );
        exit( - 1 );
    }
   
    install_timer();
    install_keyboard();
    install_mouse();
    /* add other initializations here */
}

void deinit() {
    clear_keybuf();
    /* add other deinitializations here */
}
P-33673
DejaVu
» 2011-05-30 22:51:55
To nie jest kwestia pomysłów... tyle, że my nie preferujemy gotowców.
P-33674
lucky44
Temat założony przez niniejszego użytkownika
» 2011-05-30 22:54:17
Dzięki za odpowiedź, ale tutaj moje pytanie czy da się to zrobić tak żeby w ogóle nie było widać odstępów, można zastosować jakąś inna funkcję niż "putpixel", czy to nie wyjdzie? Dziękuje i pozdrawiam.
P-33675
ison
» 2011-05-30 22:55:30
//@up napisałeś podczas gdy pisałem właśnie tę wiadomość ;)

Problem, który opisałem w moim kodzie można rozwiązać przez rysowanie linii zamiast pojedynczych pikseli (nie wiem jak to jest z prymitywami w Allegro, pewnie są gotowe funkcje do rysowania krzywych)

C/C++
putpixel( screen, x, 300 + sin( x / 50.f ) * 300, makecol( 255, 255, 255 ) );
można zamienić na
C/C++
line( screen, x - 1, 300 + sin(( x - 1 ) / 50.f ) * 300, x, 300 + sin( x / 50.f ) * 300, makecol( 255, 255, 255 ) );
przez co nie będzie przerw między kolejnymi pikselami, wtedy można 50.f zamieniać na dowolnie mniejszą liczbę bez utraty jakości

cały trik polega na tym, że linię rysujesz z poprzedniego miejsca (x-1) do aktualnego (x), więc odstępy nie mają prawa wystąpić

powyższy sposób jest dla wysokości ekranu 600 (tak jak w moim poprzednim kodzie)
line(screen, x-1,WYSOKOSC_EKRANU/2+sin((x-1)/50.f)*WYSOKOSC_EKRANU/2,x,WYSOKOSC_EKRANU/2+sin(x/50.f)*WYSOKOSC_EKRANU/2,makecol(255,255,255));

pamiętaj, że w drugim sposobie (z liniami) jak zmieniasz rozpostarcie sinusoidy to wartość 50.f zmieniasz w dwóch miejscach
P-33676
lucky44
Temat założony przez niniejszego użytkownika
» 2011-05-30 22:58:50
Dzięki wielkieeeee! Pozdrawiam, jeszcze raz dziękuje:))
P-33677
« 1 »
  Strona 1 z 1