• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

liczenie pola 3D(X,Y,Z)

VPS Starter Arubacloud
0 głosów
429 wizyt
pytanie zadane 8 maja 2020 w C i C++ przez dominik195k Obywatel (1,030 p.)

Cześć, wie ktoś jak policzyć pole dość sporej figury bo powstałej z 676 punktów x,y,z.

0    0    -4
0    0.251327    -3.49052
0    0.502655    0.837392
0    0.753982    12.4593

...

...

i tak dalej

Słyszałem że można jakoś wykorzystać wzór na odległość na odległość między dwoma punktami, żeby policzyć pole trójkątów z których składa się ta figura, no ale wynik otrzymuje zły.

d = sqrt(pow((x2-x1),2)+pow((y2-y1),2)+pow((z2-z1),2))
#include <iostream>
#include <fstream>
#include <iomanip>
#include <cmath>
using namespace std;

int main()
{	
	ifstream plik("wspolrzedne.txt");
	float wspl=0,bok=0,a=0,b=0,p=0,p1=0,P,suma=0;
	float x[676],y[676],z[676],xyz[2028];
	int i=0,k;
	cout << setprecision(6);
	
	while(plik>>wspl)
	{
		xyz[i]=wspl;
		
		i++;	
	}
	
	for(i=0;i<2028;i+=3)
	{
		x[i]=xyz[i];
		y[i]=xyz[i+1];
		z[i]=xyz[i+2];
		//cout << x[i] << " " << y[i] << " " << z[i] << endl;
	}
	
	for(i=1,k=1;i<1352;i+=2,k++)
	{
		bok= sqrt(pow((x[i]-x[i-1]),2)+pow((y[i]-y[i-1]),2)+pow((z[i]-z[i-1]),2));
		
		if(k==1)a = bok;
		if(k==2)
		{	k=0;
			b = bok;
			
			P =((1.0)/(2.0))*a*b;
			suma +=P;
		}
	}
	cout << suma;
	return 0;
}

próbowałem wzorem Herona, wzorem na trójkąt prostokątny, nic nie pomaga, chyba przez to że nie wszystkie odległości tworzą trójkąt. Ma ktoś pomysł jak policzyć to pole?

komentarz 8 maja 2020 przez DragonCoder Nałogowiec (36,500 p.)
Odleglosc miedzy 2 punktami to nic innego, jak najpierw wyznaczenie wektora miedzy nimi. Elemnty z powstalego wektora podnosisz do potegi, sumujesz i wyciagasz pierwiastek.

Ale zeby obliczyc pole trajkata, dalej musisz uzyc normalnej formulki, czyli ah/2. Lub gdy juz jestes przy wektorach, prostych i plaszczyznach wykonac

https://pl.m.wikipedia.org/wiki/Iloczyn_wektorowy

Otrzymany wektorwwektor znowu potegujesz, sumujesz i wyciagaszna pierwiastek a na koncu dzielisz na 2. Lub robisz jeszcze inaczej, 1/2 *ab*sin alfa, jelsi znasz kat
komentarz 8 maja 2020 przez dominik195k Obywatel (1,030 p.)

Uzylem takiego kodu zeby znalezc boki wszystkich trojkatow, i jeden zestaw wypadl mi taki:15.8266 5.33788 7.22095 co sie troche gryzie bo z takich bokow jak wiadomo trojkat powstac nie moze prawda?  A jesli sie myle to wystarczy w if(k==3) dopisac P=a*h*0.5? Zsumowac wszystkie wyniki i mam pole?

 for(i=1,k=1;i<1352;i+=2,k++)
    {
        bok= sqrt(pow((x[i]-x[i-1]),2)+pow((y[i]-y[i-1]),2)+pow((z[i]-z[i-1]),2));
         
        if(k==1)
			a = bok;
        if(k==2)
        	b = bok;
        if(k==3)
        {	c=bok;
        	k=0;
        //	no i tutaj cos ma sie liczyc tylko co :(
		}
        
    }

 

komentarz 8 maja 2020 przez DragonCoder Nałogowiec (36,500 p.)
Problemem jest to, ze ah/2 dziala tylko w trojkacie prostokatnym, dlateho rozwoazanie z iloczynem jest lepsze
komentarz 8 maja 2020 przez DragonCoder Nałogowiec (36,500 p.)
komentarz 9 maja 2020 przez dominik195k Obywatel (1,030 p.)
nie rozumiem jak to dziala, obliczamy na podstawie mojego kodu

a, b i podstawiamy pod Twoj wzor? Moglbys rozjasnic?
komentarz 9 maja 2020 przez DragonCoder Nałogowiec (36,500 p.)
czego nie rozumiesz? Masz zalozmy 3 punkty podane A, B C, kazdy z nich to wektor, czylo OA, OB, OC. i C jest wierzcholkiem tego trajkata, wiec obliczasz wektor AC i BC (lub odwrtonie) i podstawiasz pod wzor
komentarz 9 maja 2020 przez dominik195k Obywatel (1,030 p.)
for(i=1,k=1;i<676;i++,k++)
    {
        
         
    if(k==1)
        
        a = sqrt(pow((x[i]-x[i-1]),2)+pow((y[i]-y[i-1]),2)+pow((z[i]-z[i-1]),2));
    
    if(k==2)
    {
        b = sqrt(pow((x[i]-x[i-2]),2)+pow((y[i]-y[i-2]),2)+pow((z[i]-z[i-2]),2));
        
            P+=(0.5)*(fabs(a*b));
            i++;//inkrementuje zeby w nastepnym trojkacie obecne C 
                //nie bylo potraktowane jako A
            k=0;
    }
    }

 

Napisalem to tak, minimalnie wyniki sie roznia od poprawnych, co pokrecilem?

 

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
2 odpowiedzi 146 wizyt
pytanie zadane 29 maja 2020 w C i C++ przez Majster6918 Gaduła (4,030 p.)
0 głosów
0 odpowiedzi 470 wizyt
pytanie zadane 19 kwietnia 2020 w C i C++ przez dominik195k Obywatel (1,030 p.)
0 głosów
0 odpowiedzi 182 wizyt

92,452 zapytań

141,262 odpowiedzi

319,079 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...