[C++] Projekt na zaliczenie. Prosze o pomoc.

0

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/7100f4d1cd55057d.html

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/dac3633beecb2e7b.html

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

0

ja bym to rysowal i zliczal piksele

0

rozwiąż to przyzwoicie matematycznie, ze wszystkimi warunkami brzegowymi. Od strony informatycznej nie ma tu żadnego problemu: parę if-ów umożliwiające rozróżnienie warunków brzegowych by stosować odpowiedni wzór i tyle.

Inny sposób to Monte Carlo. Strzelasz przypadkowymi punktami i liczysz iloraz liczby punktów, te które trafiły w blaszkę i małe koła do tych co trafiły w małe koła. Jeśli liczba zliczeń będzie powyżej 100000, to wynik powinien być przyzwoity (dostatecznie dokładny).

0

zaliczenie? jest środek lipca, chłopie wakacje!

0

Określiłem przedziały dla jednego okresu w zaleznosci zmiany kąta i pola. (dla jedengo małego okręgu)
http://www.fotosik.pl/pokaz_obrazek/ef4b258976334e7c.html

Czy to i wczesniejsze obliczenia wystarczą do rozwiązania tego problemu pod względem programowania ?

0

LOL mam rentgen w oczach lub kalkulator w głowie, by wiedzieć czy ten arkusz kalkulacyjny jest prawidłowy.
Nie chce ci się liczyć na kartce to zastosuj jakiś program z algebrą np darmową: Maxima.
Pole przykrycia małego koła o promieniu r którego środek wypada dla konta alfa=0 w odległości d od środka dużego koła:

x:=d\cdot sin \alpha pole:={r}<sup>{2}\,asin ( \frac{x}{r}) +x\,\sqrt{{r}</sup>{2}-{x}<sup>{2}}+\frac{\pi \,{r}</sup>{2}}{2}

gdzie: \alpha to miejsce krawędzi blaszki.
Teraz dodać do tego warunki brzegowe (kiedy jaka krawędź nachodzi na jedno z małych kółek) i problem zamknięty.

0

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

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:
Kod:

#include <stdio.h> 
#include <math.h> 
#include <iostream.h> 

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: "<<endl; 
cin >> B; 

if(B>=kat(rm,r) && B<=180-kat(rm,r)) 
    { 
    cout<<"Okrag pierwszy jest zakryty w calosci"<<endl; 
    cout<<endl; 
    } 
    else 
    { 
    if(B==0)cout<<"Pole zakrytej czesci pierwszego kola wynosi: "<<wzor(r,180)<<endl; 
    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: "<<Pol1<<endl;} 
    } 
if(B<=310-kat(rm,r) && B>=130+kat(rm,r)) 
{ 
    cout<<"Okrag drugi jest zakryty w calosci"<<endl; 
    cout<<endl; 
    } 
    else 
    { 
    if(B==130)cout<<"Pole zakrytej czesci drugiego kola wynosi: "<<wzor(r,180)<<endl; 
    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: "<<Pol2<<endl; 
    } 
    } 

system("PAUSE"); 
return EXIT_SUCCESS; 
} 

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