pole czworokąta w układzie współrzędnych

pole czworokąta w układzie współrzędnych
M9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2
0

Witam! Piszę program mający wypisać pole wielokąta na podstawie współrzędnych jego boków, z precyzją do 0.5 jednostki. Punkt początkowy jest na 0,0. Niestety wychodzą złe wyniki. Proszę o pomoc. Oto mój kod:

Kopiuj
#include<iostream>
#define pkt pair<long long, long long >
using namespace std;
long long pole;

long long i_w(pkt A, pkt B)
{
	int x1 = A.first,  y1 = A.second,
		x2 = B.first, y2 = B.second;
	return x1*y2 - x2*y1;
}

int main()
{
        long long n;
        cin>>n;
        pkt A, B, X;


        cin>>A.first>>A.second;
         X.first = A.first;
         X.second = A.second;
        for(long long i=1; i<n; i++)
        {

         cin>>B.first>>B.second;
         pole+=i_w(A,B);
         B.first=A.first;
         B.second=A.second;
        }
        pole+=i_w(B,X);
        if(pole<0)
            pole=pole*-1;

        if(pole%2==0)
            cout<<pole/2;
        else
            cout<<pole/2<<".5";
}
M9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 8
0

@Mariusz_99: Złe wyniki, co to znaczy? Wyświetlają się litery, liczby ujemne? Jakie są dane wejściowe, jakie wyjściowe i jakie oczekiwane?

Spine
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6968
0

Jak chcesz liczyć z dokładnością do 0.5, skoro wszędzie masz liczby całkowite?
W pierwszej kolejności zmień wszystkie typy zmiennych na double.

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
0

Byłoby prościej gdybyś napisał ten kod dla ludzi a nie dla maszyny. Co to za zmienne a, b, x albo funkcje i_w? o_O Warto byłoby też napisać na jakiej zasadzie działa metoda której używasz.

MarekR22
  • Rejestracja: dni
  • Ostatnio: dni
0

A ja tu widzę problem z podstawami algebry.
Czy ty wiesz jak się liczy pole prostokąta?

LukeJL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 8488
0

jaka jest podstawa matematyczna tego, co chcesz zrobić?

x1*y2 - x2*y1

w sensie coś takiego piszesz:
https://upload.wikimedia.org/wikipedia/commons/thumb/b/bd/Determinant-as-area.svg/328px-Determinant-as-area.svg.png?20111107180618

?

YA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2384
0

Jeśli chodzi o podstawy matematyczne, to zgaduję, że chodzi o twierdzenie Greena, które wiąże całkę po obszarze (tu wielokącie) z całką po brzegu obszaru (obwodzie wielokąta). Z matematycznego punktu widzenia, krzywa jest bardzo porządna ("kawałkami gładka"). Można doczytać https://math.blogoverflow.com/2014/06/04/greens-theorem-and-area-of-polygons/

To, że algorytm nie działa (znowu zgaduję) może wynikać z faktu, że kolega może podawać na wejściu punkty w dziwnej kolejności, która skutkuje tym, że całkowanie nie leci po właściwej "krzywej".

screenshot-20220303075058.png

np. zamiast wejścia {A,B,C,D}, leci coś w stylu {A, C, B, D}.
screenshot-20220303075623.png

A to daje dwa różne obszary, o rożnych polach.

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
2

Ja tylko pragnę zauważyć ze tytuł nijak sie ma do treści ->

Piszę program mający wypisać pole wielokąta

I w kodzie też jest pętla po n wierzchołkach a nie po 4.

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
1

Powinno liczyć poprawnie.

Kopiuj
#include <iostream>
#include <cmath>
using namespace std;

int main()
{
    size_t n;
    cin>>n;
    int64_t ax,ay,bx,by,fx=0,fy=0,area=0;
	for(size_t i=0;i<n;++i)
	{
		ax=bx,ay=by;
		cin>>bx>>by;
		if(!i) fx=bx,fy=by;
		else area+=ax*by-bx*ay;
	}
	area+=bx*fy-fx*by;
	cout<<((abs(area)+1)>>1)<<endl;
	return 0;
}

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.