παπι Δημοσ. 3 Ιανουαρίου 2012 Δημοσ. 3 Ιανουαρίου 2012 http://msdn.microsof....rectangle.aspx Α μαλιστα... Τι να σου πω φιλε, ειπες xna εμπλεξες και sprites ε μπερδευτηκα νομιζα οτι μιλουσες για xna. Οριστε και πως μεταφραζεται το rect (ala windows top-left widht height) http://www.functionx...sories/rect.htm
TheOneGandalf Δημοσ. 3 Ιανουαρίου 2012 Μέλος Δημοσ. 3 Ιανουαρίου 2012 Παίδες έχω κολήσει πολύ... Να τι έχω κάνει μέχρι στιγμής.. > #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 κ.λ.π. Πραγματικά τα έχω βρει πολύ σκούρα με αυτήν την άσκηση. Κάθε βοήθεια είναι ευπρόσδεκτη. Ευχαριστώ!
migf1 Δημοσ. 3 Ιανουαρίου 2012 Δημοσ. 3 Ιανουαρίου 2012 Δεν είναι η 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
TheOneGandalf Δημοσ. 3 Ιανουαρίου 2012 Μέλος Δημοσ. 3 Ιανουαρίου 2012 Και εγώ με αυτόν τον τρόπο το είχα σκεφτεί( αφού μου το είπες εσύ βέβαια ). Δηλαδή να διαβάζω τις συντεταγμένες του πάνω αριστερού σημείου και του κάτω δεξιού. Από ότι βλέπω στον κωδικά σου εσύ χρησιμοποιείς δείκτη ενώ εγώ όχι. > makepoint( &point ); Με αυτήν την γραμμή διοχετεύεις την δομή μέσω αναφοράς σωστά? Ενώ εγώ με αυτό > makepoint( point ); Την διοχέτευα μέσω τιμής? Η διαφορά είναι ότι οταν διοχετεύω δομές μέσω τιμής δεν μπορώ να τροποποιήσω τα μέλη της δομής μέσα στην συνάρτηση? Ενώ μέσω αναφοράς γίνεται? Επίσης θα μπορούσες να με βοηθήσεις λίγο με την λογική της συνάρτησης ptinrect? Ρίξε μια ματιά αν μπορείς στο προηγούμενο post μου εκεί που λέω για την συνάρτηση ptinrect. Ευχαριστώ πάντως για την βοήθεια!!
migf1 Δημοσ. 3 Ιανουαρίου 2012 Δημοσ. 3 Ιανουαρίου 2012 Ναι, διοχετεύω με αναφορά (και όχι με τιμή) διότι θέλω οι τιμές που θα πάρουν οι μεταβλητές μέσα στη συνάρτηση να διατηρηθούν και όταν τελειώσει η συνάρτηση (αν τις διοχετεύσεις με τιμή, δεν διατηρούνται οι μεταβολές) Την printrec θα την κοιτάξω λίγο αργότερα και θα επανέλθω (αν δεν με προλάβει κάποιος άλλος).
Aztec Δημοσ. 3 Ιανουαρίου 2012 Δημοσ. 3 Ιανουαρίου 2012 Για να βρεις αν ένα σημείο είναι μέσα στο ορθογώνιο απλά λες αν το χ είναι μεγαλύτερο η ίσο απο το χ του ορθογωνιου από το οποιο ξεκιναει και μικροτερο η ισο από το χ που τελειωνει και αναλογα για το y. Ένα if είναι
TheOneGandalf Δημοσ. 3 Ιανουαρίου 2012 Μέλος Δημοσ. 3 Ιανουαρίου 2012 Για να βρεις αν ένα σημείο είναι μέσα στο ορθογώνιο απλά λες αν το χ είναι μεγαλύτερο η ίσο απο το χ του ορθογωνιου από το οποιο ξεκιναει και μικροτερο η ισο από το χ που τελειωνει και αναλογα για το y. Ένα if είναι Όντως..Ήτανε πολύ απλό τελικά. Απλά εγώ το σκεφτόμουνα πολύπλοκα! Ευχαριστώ πολύ!
TheOneGandalf Δημοσ. 3 Ιανουαρίου 2012 Μέλος Δημοσ. 3 Ιανουαρίου 2012 Ναι μου δουλεύει μια χαρά! Σας ευχαριστώ για την βοηθειά σας!
migf1 Δημοσ. 3 Ιανουαρίου 2012 Δημοσ. 3 Ιανουαρίου 2012 Σίγουρα δουλεύει; Δεν αρκεί μονάχα ένα if ...
Aztec Δημοσ. 3 Ιανουαρίου 2012 Δημοσ. 3 Ιανουαρίου 2012 Δεν διάβασα καν τον κώδικα . Αναφέρεσαι στο float comparison ;
migf1 Δημοσ. 3 Ιανουαρίου 2012 Δημοσ. 3 Ιανουαρίου 2012 Ούτε εγώ διάβασα κώδικα, αλλά δεν πρέπει να λάβει υπόψη του και τα τεταρτημόρια του καρτεσιανού (αρνητικές τιμές).
Aztec Δημοσ. 3 Ιανουαρίου 2012 Δημοσ. 3 Ιανουαρίου 2012 Αν μιλάμε για καρτεσιανο και οχι οθονη υπολογιστη θα παίξει έτσι που το σκέφτομαι στον αερα απλά θα πρεπει το y να έχει ανάποδα τον ελεγχο από το X. Και αυτο γιατί στην οθόνη υπολογιστή αυξάνεται το y προς τα κατω ξεκινώντας από 0,0 ενώ στο καρτεσιανό μειωνεται. Άρα αν ξεκινάει το ορθογώνιο από -50,-50 και κατω δεξιά είναι 0,-200 και το σημείο είναι το -30,-60 δεν είναι το -30 μεγαλύτερο από το -50 και μικροτερο απο το 0 και το -60 μικροτερο απο το -50 και μεγαλύτερο απο το -200 ;
migf1 Δημοσ. 3 Ιανουαρίου 2012 Δημοσ. 3 Ιανουαρίου 2012 Δεν είμαι σε θέση να σκεφτώ τώρα, γιατί είμαι κουνουπίδι... αν είναι όμως σε καρτεσιανό υπάρχουν 4 τεταρτημόρια που πρέπει να ληφθούν υπόψη. Βασικά 2 περιπτώσεις για το x και 2 για το y. Υπάρχουν μαθηματικοί τύποι που εφαρμόζονται γενικώς σε παραλληλόγραμμα, ορθογώνια ή μη... άμα γκουγκλάρετε σίγουρα θα το βρείτε.
V.I.Smirnov Δημοσ. 3 Ιανουαρίου 2012 Δημοσ. 3 Ιανουαρίου 2012 Καλησπέρα σας και χρόνια πολλά. Εφόσον το ορθογώνιο βρίσκεται σε κάποιο από τα συντεταγμένα επίπεδα, ορίζοντας την διαγώνιο του ορθογωνίου, δηλ. δυο σημεία, το ορθογώνιο ορίζεται πλήρως. Έστω ότι τα σημεία αυτά είναι τα 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 δυσκολία είναι όταν πρόκειται για πολύγωνο που δεν βρίσκεται σε κάποιο από τα συντεταγμένα επίπεδα... -
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα