• 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)

Object Storage Arubacloud
0 głosów
431 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 147 wizyt
pytanie zadane 29 maja 2020 w C i C++ przez Majster6918 Gaduła (4,030 p.)
0 głosów
0 odpowiedzi 484 wizyt
pytanie zadane 19 kwietnia 2020 w C i C++ przez dominik195k Obywatel (1,030 p.)
0 głosów
0 odpowiedzi 184 wizyt

92,536 zapytań

141,377 odpowiedzi

319,452 komentarzy

61,920 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...