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

42 Warsaw Coding Academy
0 głosów
640 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 195 wizyt
pytanie zadane 29 maja 2020 w C i C++ przez Majster6918 Gaduła (4,030 p.)
0 głosów
0 odpowiedzi 785 wizyt
pytanie zadane 19 kwietnia 2020 w C i C++ przez dominik195k Obywatel (1,030 p.)
0 głosów
0 odpowiedzi 229 wizyt

93,398 zapytań

142,390 odpowiedzi

322,578 komentarzy

62,756 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...