Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

 

Α μαλιστα... Τι να σου πω φιλε, ειπες xna εμπλεξες και sprites ε μπερδευτηκα νομιζα οτι μιλουσες για xna.

 

Οριστε και πως μεταφραζεται το rect (ala windows top-left widht height) http://www.functionx...sories/rect.htm

  • Απαντ. 32
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Δημοφιλείς Ημέρες

Συχνή συμμετοχή στο θέμα

Δημοσιευμένες Εικόνες

Δημοσ.

Παίδες έχω κολήσει πολύ... Να τι έχω κάνει μέχρι στιγμής..

 

>
#include <stdio.h>

struct point
{
float x;
float y;
};

struct rectangle
{
float a;
float b;
float c;
float d;
};

void makepoint( struct point coordinates );
void makerectangle( struct rectangle rectangle );
int ptinrect( struct point coordinates, struct rectangle rec );

int main( void )
{
struct point coordinates;
struct rectangle rectangle;

makepoint( coordinates );
makerectangle( rectangle );
printf("Gia na doume an uparxei.. %d", ptinrect( coordinates, rectangle ) );
}

void makepoint( struct point coordinates )
{ 
       printf( "Dwse tis sintetagmenes 2 antikriston gwnion tou orthogoniou\n" );
printf( "x = " );
scanf( "%f", &coordinates.x );
printf( "y = " );
scanf( "%f", &coordinates.y );
}

void makerectangle( struct rectangle rectangle )
{
printf( "a = " );
scanf( "%f", &rectangle.a );
printf( "b = " );
scanf( "%f", &rectangle.b );
printf( "c = " );
scanf( "%f", &rectangle.c );
printf( "d = " );
scanf( "%f", &rectangle.d );

}

int ptinrect( struct point coordinates, struct rectangle rectangle )
{

}

 

Δοκίμασα κάτι για την συνάρτηση ptinrect αλλά ήτανε λάθος. Το λογικό(κατ' εμέ) λοιπόν για να βρούμε αν ένα σημείο είναι μέσα στο ορθογώνιο είναι κάτι τέτοιο :

>
for ( i = a; i <= c; i )
{
   for ( k = b; k <=d; k )
   {
       if ( i == x && k == y )
       {
             return 1;
       }
   }
}

return -1;

//end ptinrect

 

Δηλαδή να χρησιμοποιήσω 2 μετρήτες, τον i για να σαρώνω όλες τις τετμημένες του ορθογωνίου και τον k για να σαρώνω τις τεταγμένες. Και κάθε φορά να ελέγχω αν το i, k είναι ίσο με

με το x και το y( Όπου x,y το σημειό που θέλουμε να ελέγξουμε αν είναι εντός του ορθογωνίου ). Στην υλοποίηση αυτή συναντάω πρόβλημα στο 'βήμα' που θα έχουν οι 2 for. Το i/k++ προφανώς δεν δουλεύει γιατί π.χ απο το 2 θα πήγαινε στο 3 κατευθείαν χωρίς να ελέγξει τα 2.1 2.2 κ.λ.π. Πραγματικά τα έχω βρει πολύ σκούρα με αυτήν την άσκηση. Κάθε βοήθεια είναι ευπρόσδεκτη. Ευχαριστώ!

Δημοσ.

Δεν είναι η printrec το πρόβλημα (δεν την κοίταξα καν αυτή). Έχεις πρόβλημα σε όλο τον υπόλοιπο κώδικα, κυρίως επειδή δεν πρέπει να έχεις καταλάβει τι ακριβώς πρέπει να διαβάζεις για το σημείο και τι για το ορθογώνιο...

 

Συνέχισε το από εδώ...

 

>
#include <stdio.h>

struct Point{
float x;
float y;
};

struct Rectangle {
struct Point topleft;
struct Point botright;
};

void makepoint( struct Point *point );
void makerectangle( struct Rectangle *rec );
int ptinrect( struct Point point, struct Rectangle rec );

/* --------------------------------------------------------------- */
int main( void )
{
struct Point point;
struct Rectangle rec;

makepoint( &point );
makerectangle( &rec );
printf("Gia na doume an uparxei.. %d\n", ptinrect( point, rec ) );

return 0;
}

/* --------------------------------------------------------------- */
void makepoint( struct Point *point )
{ 
   	printf( "Dwse sintetagmenes shmeioy:\n" );
   	printf( "\tx = " );
   	scanf( "%f", &point->x );
   	printf( "\ty = " );
   	scanf( "%f", &point->y );

return;
}

/* --------------------------------------------------------------- */
void makerectangle( struct Rectangle *rec )
{
   	printf( "\nDwse sintetagmenes ths epanw aristerhs gwnias toy orthogwniou:\n" );
   	printf( "\tx1 = " );
   	scanf( "%f", &rec->topleft.x );
   	printf( "\ty1 = " );
   	scanf( "%f", &rec->topleft.y );
   	printf( "Dwse sintetagmenes ths katw dejias gwnias toy orthogwniou:\n" );
   	printf( "\tx2 = " );
   	scanf( "%f", &rec->botright.x );
   	printf( "\ty2 = " );
   	scanf( "%f", &rec->botright.y );

return;
}

/* --------------------------------------------------------------- */
int ptinrect( struct Point point, struct Rectangle rec )
{
   	return 0;
}

 

ΥΓ. Στο έχω όσο πιο απλό γίνεται.

 

...

ΥΓ. Στο έχω όσο πιο απλό γίνεται.

 

Δεν ξέρω αν το παρακάτω σου φαίνεται πιο απλό...

 

>
...
int main( void )
{
struct Point point;
struct Rectangle rec;

   	printf( "Dwse sintetagmenes shmeioy:\n" );
makepoint( &point );

makerectangle( &rec );
printf("Gia na doume an uparxei.. %d\n", ptinrect( point, rec ) );

system("pause");
return 0;
}

...

void makerectangle( struct Rectangle *rec )
{
   	printf( "\nDwse sintetagmenes ths epanw aristerhs gwnias toy orthogwniou:\n" );
makepoint( &rec->topleft );
   	printf( "Dwse sintetagmenes ths katw dejias gwnias toy orthogwniou:\n" );
makepoint( &rec->botright );

return;
}

...

 

Η πρώτη εκδοχή είναι λίγο πιο straight forward

Δημοσ.

Και εγώ με αυτόν τον τρόπο το είχα σκεφτεί( αφού μου το είπες εσύ βέβαια ). Δηλαδή να διαβάζω τις συντεταγμένες του πάνω αριστερού σημείου και του κάτω δεξιού. Από ότι βλέπω στον κωδικά σου εσύ χρησιμοποιείς δείκτη ενώ εγώ όχι.

>
makepoint( &point );

 

Με αυτήν την γραμμή διοχετεύεις την δομή μέσω αναφοράς σωστά? Ενώ εγώ με αυτό

>
makepoint( point );

 

Την διοχέτευα μέσω τιμής? Η διαφορά είναι ότι οταν διοχετεύω δομές μέσω τιμής δεν μπορώ να τροποποιήσω τα μέλη της δομής μέσα στην συνάρτηση? Ενώ μέσω αναφοράς γίνεται?

Επίσης θα μπορούσες να με βοηθήσεις λίγο με την λογική της συνάρτησης ptinrect? Ρίξε μια ματιά αν μπορείς στο προηγούμενο post μου εκεί που λέω για την συνάρτηση ptinrect.

Ευχαριστώ πάντως για την βοήθεια!! :)

Δημοσ.

Ναι, διοχετεύω με αναφορά (και όχι με τιμή) διότι θέλω οι τιμές που θα πάρουν οι μεταβλητές μέσα στη συνάρτηση να διατηρηθούν και όταν τελειώσει η συνάρτηση (αν τις διοχετεύσεις με τιμή, δεν διατηρούνται οι μεταβολές)

 

Την printrec θα την κοιτάξω λίγο αργότερα και θα επανέλθω (αν δεν με προλάβει κάποιος άλλος).

Δημοσ.

Για να βρεις αν ένα σημείο είναι μέσα στο ορθογώνιο απλά λες αν το χ είναι μεγαλύτερο η ίσο απο το χ του ορθογωνιου από το οποιο ξεκιναει και μικροτερο η ισο από το χ που τελειωνει και αναλογα για το y. Ένα if είναι

Δημοσ.

Για να βρεις αν ένα σημείο είναι μέσα στο ορθογώνιο απλά λες αν το χ είναι μεγαλύτερο η ίσο απο το χ του ορθογωνιου από το οποιο ξεκιναει και μικροτερο η ισο από το χ που τελειωνει και αναλογα για το y. Ένα if είναι

 

Όντως..Ήτανε πολύ απλό τελικά. Απλά εγώ το σκεφτόμουνα πολύπλοκα! :huh:

Ευχαριστώ πολύ!

Δημοσ.

Ούτε εγώ διάβασα κώδικα, αλλά δεν πρέπει να λάβει υπόψη του και τα τεταρτημόρια του καρτεσιανού (αρνητικές τιμές).

Δημοσ.

Αν μιλάμε για καρτεσιανο και οχι οθονη υπολογιστη θα παίξει έτσι που το σκέφτομαι στον αερα απλά θα πρεπει το y να έχει ανάποδα τον ελεγχο από το X. Και αυτο γιατί στην οθόνη υπολογιστή αυξάνεται το y προς τα κατω ξεκινώντας από 0,0 ενώ στο καρτεσιανό

μειωνεται.

 

Άρα αν ξεκινάει το ορθογώνιο από

 

-50,-50 και κατω δεξιά είναι 0,-200 και το σημείο είναι το -30,-60 δεν είναι το -30 μεγαλύτερο από το -50 και μικροτερο απο το 0 και το -60 μικροτερο απο το -50 και μεγαλύτερο απο το -200 ;

Δημοσ.

Δεν είμαι σε θέση να σκεφτώ τώρα, γιατί είμαι κουνουπίδι... αν είναι όμως σε καρτεσιανό υπάρχουν 4 τεταρτημόρια που πρέπει να ληφθούν υπόψη. Βασικά 2 περιπτώσεις για το x και 2 για το y.

 

Υπάρχουν μαθηματικοί τύποι που εφαρμόζονται γενικώς σε παραλληλόγραμμα, ορθογώνια ή μη... άμα γκουγκλάρετε σίγουρα θα το βρείτε.

Δημοσ.

Καλησπέρα σας και χρόνια πολλά.

 

Εφόσον το ορθογώνιο βρίσκεται σε κάποιο από τα συντεταγμένα επίπεδα,

ορίζοντας την διαγώνιο του ορθογωνίου, δηλ. δυο σημεία, το ορθογώνιο ορίζεται πλήρως.

Έστω ότι τα σημεία αυτά είναι τα tl, br (δηλ. top left, botom right).

Ένα σημείο p ελέγχεται αν περιέχεται εντός του ορθογωνίου πολύ απλά ως

 

if (p.x>tl.x and p.x<br.x and p.y<tl.y and p.y>br.y) then

point p is inside rectangle(tl,br)

 

Δεν χρειάζεται ούτε έλεγχος για τεταρτημόρια, ούτε τίποτε άλλο.

H δυσκολία είναι όταν πρόκειται για πολύγωνο που δεν βρίσκεται σε κάποιο από τα συντεταγμένα επίπεδα...

 

-

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

  • Δημιουργία νέου...