algorytm obliczający dowolne pole powierzchni

0

Witam,

Chciałem zapytać czy jest gdzieś może już gotowy i ogólnie dostępny algorytm obliczania pola powierzchni dowolnej figury na płaszczyźnie z jakimś tam przybliżeniem? Googlowałem trochę i nie bardzo znalazłem, są niby jakieś wzory i pokazane jak się liczy w zależności od różnych przypadków, ale bardziej zależy mi żeby ten algorytm był już zaimplementowany. Chociaż jeśli nie będzie to chyba pokuszę się o jego własną implementacje. Chciałbym zrobić coś co liczy mi pole powierzchni którą obejdę, na podstawie punktów pobranych z GPS... wiem, że takie aplikacje już istnieją, ale ja chce ja zrobić w celu edukacyjnym.

Jeśli miałbym to robić samodzielnie to zrobił bym coś typu miotły polarnej tak to się chyba nazywa. Wyznaczyłbym skrajny punkt z którejś strony i od tego wybierał kolejne punkty tak, aby tworzyły trójkąt i wtedy chyba w miarę łatwo mógłbym wyznaczyć pole takiej powierzchni sumując pola trójkątów.

Dzięki za podpowiedzi

0

chcesz obliczyć pole figury D, która jest wielokątem o wierzchołkach A_1, A_2, ..., A_n. przyjmijmy że A_i = (x_i, y_i)
|D| \ = \ \int\int\limits_{D} 1 dxdy
z twierdzenia Greena:
\int\int\limits_{D} ( \frac{\partial Q}{\partial x} - \frac{\partial P}{\partial y} )  dxdy \ = \ \oint\limits_k P dx + Q dy
k - krzywa ograniczająca obszar D (brzeg wielokąta)
( \frac{\partial Q}{\partial x} - \frac{\partial P}{\partial y} ) \ =\  1
\vec F \ = \ (P, Q) \ = \ (0, x)
|D| \ = \ \oint\limits_k x dy
krzywą k możemy podzielić na odcinki A_1 A_2, A_2 A_3, ..., A_n A_1, a całka po krzywej k jest suma całek po każdym z odcinków.
sparametryzujmy odcinek A_1 A_2:
\left{\begin{matrix}<br> x(t) \ = \ x_1 \ + \ (x_2-x_1) \ t \<br> y(t) \ = \ y_1 \ + \ (y_2-y_1) \ t  \<br> \end{matrix}\right. , \ \ t \ \in \ [0, 1]
y'(t) \ = \ y_2-y_1
gif.latex?%5Coint%5Climits_%7BA_1%7D%3Csup%3E%7BA_2%7D%20x%20dy%20%3D%20%5Cint_0%3C%2Fsup%3E1%20<a href=x_1 + (x_2-x_1)t</a>%20%5C%20%3D%20%20%3Cbr%20%2F%3E%0A%5Cleft.%5Cbegin%7Bmatrix%7D%3Cbr%3E%0Ax_1%28y_2%20-%20y_1%29t%20%2B%20%28x_2%20-%20x_1%29%28y_2%20-%20y_1%29%20%5Cfrac%7Bt%5E2%7D%7B2%7D%3Cbr%3E%0A%5Cend%7Bmatrix%7D%5Cright%7C_0%5E1%3Cbr%3E%0A%5C%20%3D%20%5C%20x_1%28y_2%20-%20y_1%29%20%2B%20%5Cfrac%7B1%7D%7B2%7D%28x_2%20-%20x_1%29%28y_2%20-%20y_1%29%3Cbr%3E%0A%5C%20%3D%20%20%5C%20%5Cfrac%7B1%7D%7B2%7D%28x_2%20%2B%20x_1%29%28y_2%20-%20y_1%29%3Cbr%3E%0A" alt="\oint\limits_{A_1}<sup>{A_2} x dy = \int_0</sup>1 x_1 + (x_2-x_1)t \ = <br /> \left.\begin{matrix}<br> x_1(y_2 - y_1)t + (x_2 - x_1)(y_2 - y_1) \frac{t^2}{2}<br> \end{matrix}\right|_0^1<br> \ = \ x_1(y_2 - y_1) + \frac{1}{2}(x_2 - x_1)(y_2 - y_1)<br> \ = \ \frac{1}{2}(x_2 + x_1)(y_2 - y_1)<br> ">
zatem:
|D| \ = \ \frac{1}{2} \  [ \  (x_2 + x_1)(y_2 - y_1) \ + \  (x_3 + x_2)(y_3 - y_2) \ + \ ... \ + \ (x_1 + x_n)(y_1 - y_n) \ ]

EDIT: w zależności od tego jak przyjmiesz wierzchołki A1, A2... krzywa k może być dodatnio zorientowana względem D, albo nie. wtedy |D| wyjdzie ujemne, ale wystarczy wziąć wartość bezwzględną wyniku. ważne jest (!!) aby wierzchołki A1, A2... były KOLEJNYMI wierzchołkami wielokąta. to znaczy np. jak masz kwadrat i A1 jest lewym górnym wierzchołkiem, to A2 musi być lewym dolnym, albo prawym górnym, ale nie może być tym po przekątnej.

0

okej, dzięki;) Zajmę się tym jakoś niedługo, bo póki co sypie mi się program w dziwnym miejscu. Jeśli będę miał jakieś wątpliwości to odezwę się. Dzięki jeszcze raz

0

Sory ze post pod postem, ale zabrałem się za implementację tego w Javie i wyszła mi taka funkcja:

	private double oblicz_pole(ArrayList<Location> lok){//przyjmuje liste punktow pomiaru GPS
		double p = 0;
		
		for(int i=0; i<lok.size(); i++){//dla kazdego punktu z listy i jego nastepnika
			Location A = lok.get(i);// punkt geograficzny A
			double xA = A.getLatitude();// szerokosc geograficzna A
			double yA = A.getLongitude();// dlugosc geograficzna A
			Location B = lok.get(i+1 % lok.size());// punkt geograficzny B
			double xB = B.getLatitude();// szerokosc geograficzna B
			double yB = B.getLongitude();// dlugosc geograficzna B
			
			p += xA*(yB-yA)+(xB-xA)*(yB-yA)/2;//dodaj do pola
			
		}
		return p;
	}

Czy mniej więcej to będzie tak? Czy może nie zrozumiałem czegoś?

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