Sprawdzić czy punkt znajduje się w wielokącie

0

Witam mam problem z dodanie wektorów w pętli. Dokładnie polecenie: Określenie czy punkt leży wewnątrz wielokąta (obliczenia wykonać w pętli) W każdym kroku obliczeniowym należy określić wektory A i B. Wyznaczyć kąt miedzy wektorami A i B i dodać do pozostałych. Po wykonaniu tych kroków sprawdzić czy AngleSum jest wieksze lub równe 2PI . Jeżeli badany punkt znajduje się wewnątrz wielokąta.

Chodzi o funkcję double AngleBetweenVectors(CVECTOR A, CVECTOR B) nie wiem czy dobrze przekazuje argumenty do funkcji.

 
#include "math.h"
#include "conio.h"
#include "Calculations.h"


double VectorLength(CVECTOR v){
	
	return sqrt(v.x*v.x + v.y*v.y + v.z*v.z );	
}
	
double DotProduct(CVECTOR v1, CVECTOR v2){
		
		return ((v1.x + v2.x)*(v1.y*v2.y)*(v1.z*v2.z)); 
		
		}
		
		
double AngleBetweenVectors(CVECTOR A, CVECTOR B){
	
	double AngleAB;
	AngleAB = acos(DotProduct(A,B)/VectorLength(A)*VectorLength(B));
	return AngleAB;
	}
		
		
		
bool InsidePolygon(CVECTOR A, CVECTOR B){
	
	//CVECTOR A,B;
	CPOINT Polygon;
	CPOINT Point;
	double AngleSum=0;
	
	
			A.x = Polygon[0].x - Point.x;
			A.y = Polygon[0].y - Point.y;
			A.z = Polygon[0].z - Point.z;

			B.x = Polygon[1+1].x - Point.x;
			B.y = Polygon[1+1].y - Point.y;
			B.z = Polygon[1+1].z - Point.z;
	
	AngleSum = AngleSum + AngleBetweenVectors(A,B);
	
	}
		
		
		if(AngleSum>=2*M_PI)
			return true;
			else
			return false;

}
			

Celem jest sprawdzić czy punkt znajduję się w 5-kącie

Proszę o pomoc.

0

Ani trochę, bo w ogóle tego kodu nie rozumiesz. Cośtam od kogoś skopiowałeś ale pojęcia nie masz co się tu ma dziać. Do InsidePolygon powinieneś przekazać:

  • zbiór punktów określających wielokąt
  • punkt który sprawdzasz
    Następnie robisz pętlę po kolejnych parach punktów z których składa się wielokąt (tzn dla pięciokąta to będzie (1,2),(2,3),(3,4),(4,5),(5,1)) i dla każdej takiej pary liczysz kąt zadany przez parę punktów oraz punkt testowany.
0

Od nikogo nie kopiowałem. Kod piszę sam! Idee znam, wiem coś się ma dziać tylko nie potrafię poprawnie zdefiniować funkcji, która określa obecność punktu wewnątrz 5-kąta. W takim razie mam pytanie czy to będzie dobrze bool InsidePolygon(CVECTOR A, CVECTOR B)

bool InsidePolygon(CVECTOR A, CVECTOR B){
	
	//CVECTOR A,B;
	CPOINT Polygon;
	CPOINT Point;
	double AngleSum=0;
	
	for(int i=0; i<5; i++){
			A.x = Polygon[0].x - Point.x;
			A.y = Polygon[0].y - Point.y;
			A.z = Polygon[0].z - Point.z;

			B.x = Polygon[1+1].x - Point.x;
			B.y = Polygon[1+1].y - Point.y;
			B.z = Polygon[1+1].z - Point.z;
	
	AngleSum = AngleSum + AngleBetweenVectors(A,B);
	
	}
		
		
		if(AngleSum>=2*M_PI)
			return true;
			else
			return false;

} 
0

Nie będzie bo ty w ogóle nie rozumiesz co masz policzyć. Weź łaskawie do reki kartkę papieru i sobie to narysuj dla przypadku 2D. Inaczej tego nie zrozumiesz.
Do funkcji przekazujesz CHOLERA WIE CO jako wektory A i B, które z resztą potem i tak nadpisujesz danymi z obiektów Polygon (typu punkt, kolejne WTF) i Point które tworzysz domyślnymi konstruktorami i głowę dam że oba są przez to (0,0,0). Następnie w pętli znów robisz Bóg wie co, gdzie moim faworytem jest odwołanie Polygon[1+1] gdzie Polygon jest typu punkt i aż boję się zgadywać co nam takie odwołanie daje, a to 1+1 to też jakis ciekawy pomysł. Nie wspomnę już o pętli w której nijak z licznika pętli nie korzystasz.

Napiszę ci jeszcze raz, ale jak znów wkleisz tutaj ten idiotyczny kod i nie włączysz myślenia, to będziesz zdany na siebie.

  1. Do funkcji przekazujesz ZBIÓR PUNKTÓW i PUNKT DOCELOWY (nazwijmy go Z). Nie, nie tworzysz ich wewnątrz funkcji bo to NIE MA SENSU.
  2. Robisz pętlę po każdej kolejnej parze punktów ze zbioru, załóżmy że para ta to (X,Y):
    2.1 Liczysz wektor A = ZX oraz B = ZY
    2.2 Liczysz kąt między wektorami A oraz B
    2.3 Sumujesz sobie te policzone kąty
  3. Z funkcji zwracasz:
    retur suma>=2pi

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