Witam,
na wstępie chciałbym powiedzieć , iż będąc studentem informatyki stosowanej , nienawidzę zadań typu "Policz to w najtrudniejszy możliwy sposób" , matematyka jest piękna , ale po co ją komplikować..
Przechodząc do konkretów:
Mam do policzenia pole wielokąta gwiaździstego foremnego , metodą Monte Carlo. Zrobiłem mały research i (mam nadzieję) poniekąd zrozumiałem tę metodę numeryczną ( która z kolei nie została stworzona do liczenia pól.. ) , lecz cały czas błądzę w poszukiwaniu przedziału losowania liczb i warunku pozytywnego losowania. Podaję kod mojej dotychczasowej pracy :
Użytkownik podaje jedynie ilość trójkątów i wymiary każdego z nich ( tj. podstawę i wysokość ):
import java.util.Scanner;
import java.util.Random;
import java.lang.Math;
public static void main(String[] args)
{ Scanner input = new Scanner(System.in);
System.out.println("Podaj ilosc trojkatow");
int liczba = input.nextInt();
System.out.println("Podaj wysokosc trojkatow");
int wysokosc = input.nextInt();
System.out.println("Podaj wymiar podstawy trojkatow");
int podstawa = input.nextInt();
System.out.println("Wymiary : " + liczba + " Wys. " + wysokosc + " podstawa " + podstawa);
double R = podstawa/(2*(Math.sin(Math.PI/liczba))); // R : promien kola opisanego na wielokacie foremnym
int N = 10*100000; // ilosc losowan
int Npoz = 0; // ilosc sukcesow
double Pk = Math.pow(R,2) + podstawa*wysokosc; // pole opisanego na wielokacie kwadratu
System.out.println("Promien kola:");
System.out.println(R);
System.out.println("Pole opisanego kwadratu :");
System.out.println(Pk);
double Pwk = 0.25 * liczba * (podstawa*podstawa) * (1/Math.tan(Math.PI/liczba)); // pole wielokata foremnego wewnatrz gwiazdy
double xa,ya;
Random generator = new Random();
//Pwk + 2*((podstawa*podstawa*Math.sqrt(3.0))/4)
for (int i = 0 ; i < N ; i ++ )
{
//x = generator.nextDouble()-R + generator.nextInt((int)(2*R));
//y = generator.nextDouble()-R + generator.nextInt((int)(2*R));
xa = ((generator.nextDouble()-2*R+2*wysokosc + 2*generator.nextInt((int)(2*R+2*wysokosc))));
ya = ((generator.nextDouble()-2*R+2*wysokosc + 2*generator.nextInt((int)(2*R+2*wysokosc))));
System.out.println("Punkt x : " + xa + " y :" + ya + " Wartosc x^2+y^2 : " + ((xa*xa)+(ya*ya)));
if (xa+ya <= Pwk + 2*((podstawa*podstawa*Math.sqrt(3.0))/4) )
{
//System.out.println("Punkt zmiescilby sie w wielokacie !!");
Npoz++;
}
}
Za każdą podpowiedź dziękuję i z góry przepraszam jeśli noobuje :)