[C++] Determinare se un punto appartiene ad un poligono chiuso

di il
3 risposte

[C++] Determinare se un punto appartiene ad un poligono chiuso

In una simulazione 3d del sistema solare i pianeti e i satelliti sono sfere racchiuse dal firmamento che è rappresentato come texture all'interno di una sfera.
Al click del mouse del client sulla sfera del firmamento il client consegna al server le coordinate su cui si trova il mouse e il server calcola le coordinate del punto sulla sfera del firmamento.
Date le coordinate sulla sfera si desidera risalire alla costellazione in cui si trova racchiuso il punto stesso.
I confini delle costellazioni sono noti e si possono trovare tabellati su internet nella forma di una serie di punti normalmente espressi in ascensione retta e declinazione, tali punti formano un poligono con più o meno lati a seconda della approssimazione richiesta.
Il server è un web socket scritto in c++.
Il problema che purtroppo non riesco a risolvere è trovare un algoritmo che mi permetta di determinare all'interno di quali confini di una costellazione si trovi un dato punto.
Se qualcuno avesse già affrontato un problema simile gli sarei grato se potesse condividere la soluzione che ha trovato.

3 Risposte

  • Re: [C++] Determinare se un punto appartiene ad un poligono chiuso

    E' MOOOLTO strano che tu NON SAPPIA come si risolve questo problema.

    L'esercizio, se di esercizio si tratta, e' MOOLTO specifico, ed adeguatamente complesso, non certo alla portata di un neofita.

    COMUNQUE, gli algoritmi ESISTONO e fanno parte di quella che si chiama Geometria Computazionale, di cui controllare se un punto e' all'interno di un poligono di forma qualunque e' uno dei problemi affrontati classici.
  • Re: [C++] Determinare se un punto appartiene ad un poligono chiuso

    Grazie,
    sei stato molto disponibile. Ho cercato secondo le tue indicazioni ed ho effettivamente trovato un algoritmo che potrebbe fare il caso mio. Mi ha fatto sentire un po' impedito, dato che non ero riuscito a svilupparlo da solo.
    L'algoritmo si basa sulla considerazione che un punto giace all'interno di un poligono se tracciando da questo punto una retta parallela all''asse y in una direzione tale retta interseca un numero dispari dei segmenti che compongono il poligono.
    Appena sviluppo il software lo condivido senz'altro.
  • Re: [C++] Determinare se un punto appartiene ad un poligono chiuso

    Condivido la soluzione che ho implementato dove si utilizza come poligono un vettore di punti. Grazie ancora per la dritta
    
    /*
    #makefile ***
    CC=g++
    CFLAGS=-g -std=c++11
    
    APPNAME=test
    
    SRCFILES=./main.cpp	
    
    $(APPNAME) : $(SRCFILES)
    	   $(CC) $(CFLAGS) $(SRCFILES) -o $(APPNAME)
    */
    
    #include <vector>
    #include <iostream>
    
    struct Point {
    		
    	double x, y;
    		
    	Point ( ) : Point( 0, 0 ) {}
    	Point ( double _x, double _y ) : x(_x), y(_y) {}
    	Point &operator = ( const Point & p) {
    		x = p.x;
    		y = p.y;
    		return *this;
    	}
    	
    };
    	
    bool isInBounds ( double x, double y, const std::vector< Point > & c_polig )
    {
    	
    	unsigned short intersections = 0;
    	for ( auto it = c_polig.begin(); it != c_polig.end(); it++ ) {
    		
    		Point p1 = *it;
    		// next point
    		Point p2;
    		if ( it + 1 != c_polig.end() )
    			p2 = *(it + 1);
    		else
    			// if array ended than take first point
    			p2 = *(c_polig.begin());
    			
    		// if x is out bound not intersect
    		if ( ( x < p1.x && x < p2.x ) ||
    				( x > p1.x && x > p2.x ) )
    					continue;
    					
    		// where intersect at point x ?
    		double y_int = p1.y + ( p2.y - p1.y ) * ( x - p1.x) / ( p2.x - p1.x );
    		
    		
    		// if y_int is higher than y do intersect
    		if ( y <= y_int  )
    			intersections++;
    	
    	}
    	
    	if ( intersections % 2 )  /* is odd */
    		return true;
    	else
    		return false;
    	
    }
    
    int main (int /* argc */, char ** /* argv[] */ )
    {
    
    	std::vector < Point > v;
    	v.push_back( Point(0,0) );
    	v.push_back( Point(0,1) );
    	v.push_back( Point(1,1) );
    	v.push_back( Point(1,0) );
    
    	if ( isInBounds ( 0.9, 0.5, v ) )
    		std::cout << "in bound" << std::endl;
    	else
    		std::cout << "out bound" << std::endl;
    		
    	return (0);
    
    	
    }
    
    
    
Devi accedere o registrarti per scrivere nel forum
3 risposte