[C++] Projekt na zaliczenie. Prośba o pomoc


(Kurtsa) #1

Witam!

Jestem dopiero początkujący jeśli chodzi o język C/C++ a już mam powazny problem.

Męcze się nad takim zadaniem:

Na okregu o d=28 umieszczono dwa okręgi na osi o d=15 przesuniete względem siebie o 130 stopni. Na okręgu porusza się blaszka w krztałacie półokręgu która co jakis czas zasłania te małe okregi (albo w całosci, albo po częsci- wtedy mamy odcinek koła). Trzeba obliczyć w zaleznosci od zmiany połozenia tej blaszki w jakim stopniu zasłania ona te małe okręgi. czyli policzyć pole zasłoniętych częsci.

Rysunek to pokazuje.

http://www.fotosik.pl/pokaz_obrazek/710 ... 5057d.html

Jeśli ktoś by miał jakiekolwiek wskazówki lub propozycje z gory dziękuje.


([alex]) #2

A masz rozwiązanie tego zadanie w postaci matematycznej?

Rozwiąż to matematycznie, a nie będzie żadnych problemów z programowaniem.


(Kurtsa) #3

Myslałem zeby na wejsciu podawac kąt przsuniecia między krawędzią końca blaszki a środkiem małego okregu.

No albo ilosc obrotów...ale to nie wiem jak zrobic.

Przedstawiam moje rozwiązanie matematyczne dla połowy małego okręgu. Chyba dobre.

Sprawdza się tylko gdy h<=4,5 ...bo potem albo okrag jest cały zakryty albo odsłonięty.

http://www.fotosik.pl/pokaz_obrazek/dac ... b2e7b.html

Jak to powiązac z drugim okregiem ? Czy wystarczy jedynie do podanego kąta dodawac ich wzajemne przesunięcie (130stopni)?


([alex]) #4

Jak narazie masz problem z geometria nie z programowaniem, czyli niewłaściwy dział.


(Kurtsa) #5

A mozna dokładniej?

Domyślam sie ze chodzi o kąt "beta".

-- Dodane 15.07.2009 (Śr) 21:12 --

Prosze o wyrozumiałość dla osoby dopiero co uczącej sie języka C :slight_smile:

Posiedziałem razem z kumplem i wyszedł nam taki programik. Jednak są błędy w wynikach. np pojawia sie coś takiego "-1.#IND". Nie wiem jaki jest warunek wtedy kiedy koła są odkryte całkowicie.

Moze ktoś ma jakies sugestie albo pomysły?

Wrzucam program:

#include 

#include 

#include 


using namespace std; 


const float p1 = 3.14; 


float wzor(float r1,float alfa) 

{ 

float pole; 


pole = (p1 * r1 * r1 * (360 - alfa))/360 + ((r1*r1*sin(alfa))/2); 


return pole; 

} 


float kat(float r2,float r3) 

{ 

float beta; 


beta = asin(r3/(r2+r3)); 


return beta; 

} 


float obl(float k,float r2,float r3) 

{ 

float q,w; 


q=sin(k)*(r2+r3); 

q = q/r3; 

q = 2 * acos(q); 


w = wzor(r3,q); 

return w; 

} 


int main(int argc, char *argv[]) 


{ 

float A, B, r, h, Pol1,Pol2,rm; 


r = 4.5; 

rm = 3; 


cout<<"Podaj kat przesuniecia blaszki: "<
cin >> B; 


if(B>=kat(rm,r) && B<=180-kat(rm,r)) 

    { 

    cout<<"Okrag pierwszy jest zakryty w calosci"<
    cout<
    } 

    else 

    { 

    if(B==0)cout<<"Pole zakrytej czesci pierwszego kola wynosi: "<
    else 

    {if(B<90)Pol1=obl(B,rm,r); 

    if(B>90 && B<180){B=180 - B; Pol1=obl(B,rm,r);} 

    if(B>180){B=B-180; Pol1=obl(B,rm,r);} 

    cout<<"Pole zakrytej czesci pierwszego kola wynosi: "<
    } 

if(B<=310-kat(rm,r) && B>=130+kat(rm,r)) 

{ 

    cout<<"Okrag drugi jest zakryty w calosci"<
    cout<
    } 

    else 

    { 

    if(B==130)cout<<"Pole zakrytej czesci drugiego kola wynosi: "<
    else 

    { 

    if(B<130){B=130-B;Pol2=obl(B,rm,r);} 

    if(B>130 && B<310-kat(rm,r)){B=B-130;Pol2=obl(B,rm,r);} 

    if(B>310-kat(rm,r) && B<310){B=310-B;Pol2=obl(B,rm,r);} 

    if(B>310){B=B-310;Pol2=obl(B,rm,r);} 

    cout<<"Pole zakrytej czesci drugiego kola wynosi: "<
    } 

    } 


system("PAUSE"); 

return EXIT_SUCCESS; 

}

([alex]) #6

Ponieważ w funkcji obl() próbujesz obliczyć acos() z argumentu -1.58 więc nie ma co się dziwić.

Nadał problem masz z matematyką nie z programowaniem.

W C/C++ funkcje sin,cos,asin,acos itd działają w radianach 360 stopni = 2*pi

Pi jest zadeklarowana w jako M_PI


(Kurtsa) #7

Witam!

Wreszcie sie udało. Program działa. Teraz chciałbym zrobic w nim jedną rzecz: chce żeby z przedziału (0, 360) stopni program np co 3 stopnie robił "pomiar" tzn podawał pole aktualnie zakryte i wrzucał to do tablicy dwu wymiarowej ktora bedzie zapisywana do pliku .txt

Program:

#include 

#include


#define p1 3.14159265


using namespace std;


double wzor(double r1,double alfa,int c)

{

double pole;

if(c==1)pole = (p1 * r1 * r1 * (360 - alfa))/360 + ((r1*r1*sin(alfa*p1/180))/2);

if(c==2)pole = (p1 * r1 * r1 * alfa)/360 - (r1*r1 * sin(alfa*p1/180)/2);

return pole;

}


double kat(double r1,double r2)

{

double beta;

beta = asin(r2/(r1+r2))*180/p1;

return beta;

}


double obl(double k,double r1,double r2)

{

double q,w;

int c=0;

if(k>180){k = k - 180; c=1;}

q=sin(k*p1/180)*(r1+r2);

if(q<=r2){

q = q/r2;

q = 2 * acos(q)*180/p1;

if(c==0)w = wzor(r2,q,1);

if(c==1)w = wzor(r2,q,2);}

else

{

if(c==0)w = p1 * r2 * r2;

if(c==1)w = 0;

}



return w;

}


int main()

{

double A, B,B1, r, h, Pol1,Pol2,rm;


r = 4.5;

rm = 3;


cout<<"Podaj kat przesuniecia blaszki: (0-359)"<
cin>>B;


B1 = B - 130;

if(B1<0)B1=B1+360;

Pol1 = obl(B,rm,r);

Pol2 = obl(B1,rm,r);


cout<<"Pole zakrytej czesci pierwszego okregu wynosi: "<
cout<<"Pole zakrytej czesci drugiego okregu wynosi: "<

system("pause");

return 0;

}

Z góry dziekuje za wszelkie propozycje