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

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:

#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";
}
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?

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.

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.

0

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

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

?

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.

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.

1

Powinno liczyć poprawnie.

#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;
}

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