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.
#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 ); } 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(); }
void deinit() { clear_keybuf(); }
|
|
DejaVu |
» 2011-05-30 22:30:55 <<nieważne>> |
|
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:( |
|
ison |
» 2011-05-30 22:51:33 o coś takiego chodzi? #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 ) ); ++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(); }
void deinit() { clear_keybuf(); }
|
|
DejaVu |
» 2011-05-30 22:51:55 To nie jest kwestia pomysłów... tyle, że my nie preferujemy gotowców. |
|
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. |
|
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) putpixel( screen, x, 300 + sin( x / 50.f ) * 300, makecol( 255, 255, 255 ) );
można zamienić na 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 |
|
lucky44 Temat założony przez niniejszego użytkownika |
» 2011-05-30 22:58:50 Dzięki wielkieeeee! Pozdrawiam, jeszcze raz dziękuje:)) |
|
« 1 » |