iex Δημοσ. 31 Μαρτίου 2013 Δημοσ. 31 Μαρτίου 2013 Καλησπέρα σε όλους σας, Αντιμετωπίζω πρόβλημα με το πως να εφαρμόσω τους μαθηματικούς τύπους και να λύσω την εξής άσκηση που σας παραθέτω. "Να δημιουργηθεί πρόγραμμα το οποίο θα δημιουργεί μια εικόνα, διαστάσεων 256x256 pixels η οποία θα αποτελείται από background απόχρωσης 225 και θα περιέχει κύκλο, μεταβλητής ακτίνας η οποία θα δίνεται από το πληκτρολόγιο, απόχρωσης 64. Το κέντρο του κύκλου θα βρίσκεται στο κέντρο της εικόνας." Ενημερωτικά τις εικόνες που δημιουργώ τις τρέχω με το irfanview και ειναι της μορφής .raw Επισυνάπτω και το αρχείο που είναι έτοιμη η δομή του αλλα χωρίς το συγκεκριμένο τμήμα. (σπάω το κεφάλι μου εδώ και ώρες , ψάχνοντας και στο google αλλα δεν βρήκα κάτι μου να με καλύπτει. ) Σας ευχαριστώ όλους εκ των προτέρων. testcode.txt
drm Δημοσ. 31 Μαρτίου 2013 Δημοσ. 31 Μαρτίου 2013 Στην if(?????) πρέπει να εκφράσεις το κριτήριο με το οποίο θα τεστάρεις εάν το τρέχων pixel ανήκει στον κύκλο ή όχιΤο κριτήριο αυτό είναι το: "Η απόσταση από κέντρο του κύκλου να είναι ίση με την ακτίνα" Την απόσταση θα την υπολογίσεις ώς εξής: SquareRoot((128 - ι)^2 + (128 - j)^2)
iex Δημοσ. 31 Μαρτίου 2013 Μέλος Δημοσ. 31 Μαρτίου 2013 Στην if(?????) πρέπει να εκφράσεις το κριτήριο με το οποίο θα τεστάρεις εάν το τρέχων pixel ανήκει στον κύκλο ή όχι Το κριτήριο αυτό είναι το: "Η απόσταση από κέντρο του κύκλου να είναι ίση με την ακτίνα" Την απόσταση θα την υπολογίσεις ώς εξής: SquareRoot((128 - ι)^2 + (128 - j)^2) Σε ευχαριστώ , αλλά δεν μου τρέχει .. δεν βγάζει καν αρχείο εξόδου.. ίσως να χρειάζεται κάτι ακόμη;; Στην if(?????) πρέπει να εκφράσεις το κριτήριο με το οποίο θα τεστάρεις εάν το τρέχων pixel ανήκει στον κύκλο ή όχι Το κριτήριο αυτό είναι το: "Η απόσταση από κέντρο του κύκλου να είναι ίση με την ακτίνα" Την απόσταση θα την υπολογίσεις ώς εξής: SquareRoot((128 - ι)^2 + (128 - j)^2) Επίσης την ακτίνα R που θα την βάλω..?? εννοώ πως κάπου πρέπει να υπάρχει για να της δίνω τιμή..
Star_Light Δημοσ. 31 Μαρτίου 2013 Δημοσ. 31 Μαρτίου 2013 Παπι πολυ ωραια η παρουσιαση σου φιλε!!!!!!!!!!!!!!!!!!!!!
iex Δημοσ. 31 Μαρτίου 2013 Μέλος Δημοσ. 31 Μαρτίου 2013 Ευχαριστώ πολύ για την απάντηση, το σχήμα και οι επεξηγήσεις είναι άψογες!!Θα το δοκιμάσω αν όχι τώρα (γιατί είμαι αυπνος 30 ώρες) σίγουρα αύριο !! 1
Directx Δημοσ. 31 Μαρτίου 2013 Δημοσ. 31 Μαρτίου 2013 (επεξεργασμένο) Μια μικρή υλοποίηση του πρώτου τρόπου (μου είναι πιο οικείος) σε C.. // Draw circle to RAW file #include <stdio.h> #include <string.h> #include <math.h> #define WIDTH 256 #define HEIGHT 256 #define CENTRE 128 #define RADIUS 100 #define BKGRND 225 /* background */ #define FRGRND 65 /* foreground */ int main(void) { FILE *f = NULL; if(!(f = fopen("TEST.RAW", "wb"))) perror("fopen"); else { const double maxAngle = M_PI * 2; double angle; unsigned char cImage[HEIGHT][WIDTH]; memset(&cImage, BKGRND, sizeof(cImage)); /* Draw circle */ for(angle = 0.0; angle < maxAngle; angle += 0.01) { const int y = (RADIUS * sin(angle)) + CENTRE, x = (RADIUS * cos(angle)) + CENTRE; cImage[y][x] = FRGRND; } /* Dump array to disk.. */ if(fwrite(cImage, sizeof(unsigned char), WIDTH * HEIGHT, f) != WIDTH * HEIGHT) perror("fwrite"); fclose(f); } puts("Press Enter to exit.."); getchar(); return 0; } Υ.Γ.Το πρόγραμμα έχει δοκιμασθεί σε C++ Builder και μπορεί να περιέχει bugs ή άλλες αβλεψίες.. Επεξ/σία 31 Μαρτίου 2013 από Directx 2
iex Δημοσ. 1 Απριλίου 2013 Μέλος Δημοσ. 1 Απριλίου 2013 Μια μικρή υλοποίηση του πρώτου τρόπου (μου είναι πιο οικείος) σε C.. // Draw circle to RAW file #include <stdio.h> #include <string.h> #include <math.h> #define WIDTH 256 #define HEIGHT 256 #define CENTRE 128 #define RADIUS 100 #define BKGRND 225 /* background */ #define FRGRND 65 /* foreground */ int main(void) { FILE *f = NULL; if(!(f = fopen("TEST.RAW", "wb"))) perror("fopen"); else { const double maxAngle = M_PI * 2; double angle; unsigned char cImage[HEIGHT][WIDTH]; memset(&cImage, BKGRND, sizeof(cImage)); /* Draw circle */ for(angle = 0.0; angle < maxAngle; angle += 0.01) { const int y = (RADIUS * sin(angle)) + CENTRE, x = (RADIUS * cos(angle)) + CENTRE; cImage[y][x] = FRGRND; } /* Dump array to disk.. */ if(fwrite(cImage, sizeof(unsigned char), WIDTH * HEIGHT, f) != WIDTH * HEIGHT) perror("fwrite"); fclose(f); } puts("Press Enter to exit.."); getchar(); return 0; } rawcircle.pngΥ.Γ.Το πρόγραμμα έχει δοκιμασθεί σε C++ Builder και μπορεί να περιέχει bugs ή άλλες αβλεψίες.. Ωραίος φίλε , θα του κάνω 2 αλλαγές για να το φέρω στα μέτρα μου... ( να γεμίζει τον κύκλο με χρώμα και να μπορώ να του δώσω εγώ την ακτίνα.. Thnx Directx
jsiskos Δημοσ. 1 Απριλίου 2013 Δημοσ. 1 Απριλίου 2013 Μια μικρή υλοποίηση του πρώτου τρόπου (μου είναι πιο οικείος) σε C.. // Draw circle to RAW file #include <stdio.h> #include <string.h> #include <math.h> #define WIDTH 256 #define HEIGHT 256 #define CENTRE 128 #define RADIUS 100 #define BKGRND 225 /* background */ #define FRGRND 65 /* foreground */ int main(void) { FILE *f = NULL; if(!(f = fopen("TEST.RAW", "wb"))) perror("fopen"); else { const double maxAngle = M_PI * 2; double angle; unsigned char cImage[HEIGHT][WIDTH]; memset(&cImage, BKGRND, sizeof(cImage)); /* Draw circle */ for(angle = 0.0; angle < maxAngle; angle += 0.01) { const int y = (RADIUS * sin(angle)) + CENTRE, x = (RADIUS * cos(angle)) + CENTRE; cImage[y][x] = FRGRND; } /* Dump array to disk.. */ if(fwrite(cImage, sizeof(unsigned char), WIDTH * HEIGHT, f) != WIDTH * HEIGHT) perror("fwrite"); fclose(f); } puts("Press Enter to exit.."); getchar(); return 0; } rawcircle.pngΥ.Γ.Το πρόγραμμα έχει δοκιμασθεί σε C++ Builder και μπορεί να περιέχει bugs ή άλλες αβλεψίες.. Μπράβο φίλε μου που ασχολήθηκες, αλλά όλα στη main; Πολύ κακή προγραμματιστική συνήθεια ακόμα και για το πιο απλό πρόγραμμα!
Directx Δημοσ. 1 Απριλίου 2013 Δημοσ. 1 Απριλίου 2013 Μπράβο φίλε μου που ασχολήθηκες, αλλά όλα στη main; Πολύ κακή προγραμματιστική συνήθεια ακόμα και για το πιο απλό πρόγραμμα!Όταν πρόκειται για κάτι τόσο απλό επέτρεψε μου να διαφωνήσω μαζί σου. 2
jsiskos Δημοσ. 1 Απριλίου 2013 Δημοσ. 1 Απριλίου 2013 Όταν πρόκειται για κάτι τόσο απλό επέτρεψε μου να διαφωνήσω μαζί σου. Επίτρεψέ μου να διαφωνήσω και εγώ. Αξίζει να κάνεις ακόμα και μια σειρά κώδικα συνάρτηση, αν αυτό κάνει πιο ευανάγνωστο τον κώδικά σου. Τέτοια και άλλα αντίστοιχα θέματα πραγματεύεται το εξαιρετικό βιβλίο Refactoring του Fowler. Θα σου αλλάξει τον τρόπο που προγραμματίζεις! Στόχος -μεταξύ άλλων- είναι τα προγράμματα να είναι τόσο ευανάγνωστα που να μη χρειάζονται comments! Φιλικά πάντα!
ChRis6 Δημοσ. 1 Απριλίου 2013 Δημοσ. 1 Απριλίου 2013 Μια μικρή υλοποίηση του πρώτου τρόπου (μου είναι πιο οικείος) σε C.. // Draw circle to RAW file #include <stdio.h> #include <string.h> #include <math.h> #define WIDTH 256 #define HEIGHT 256 #define CENTRE 128 #define RADIUS 100 #define BKGRND 225 /* background */ #define FRGRND 65 /* foreground */ int main(void) { FILE *f = NULL; if(!(f = fopen("TEST.RAW", "wb"))) perror("fopen"); else { const double maxAngle = M_PI * 2; double angle; unsigned char cImage[HEIGHT][WIDTH]; memset(&cImage, BKGRND, sizeof(cImage)); /* Draw circle */ for(angle = 0.0; angle < maxAngle; angle += 0.01) { const int y = (RADIUS * sin(angle)) + CENTRE, x = (RADIUS * cos(angle)) + CENTRE; cImage[y][x] = FRGRND; } /* Dump array to disk.. */ if(fwrite(cImage, sizeof(unsigned char), WIDTH * HEIGHT, f) != WIDTH * HEIGHT) perror("fwrite"); fclose(f); } puts("Press Enter to exit.."); getchar(); return 0; } rawcircle.pngΥ.Γ.Το πρόγραμμα έχει δοκιμασθεί σε C++ Builder και μπορεί να περιέχει bugs ή άλλες αβλεψίες.. Μπορείς να το κάνεις και πιο γρήγορο αν εκμεταλλευτεις τη συμμετρία του κύκλου. Για παράδειγμα μπορείς να πάρεις τα x,y από το πρώτο ογδοημόριο και να βρεις τα υπόλοιπα : (x, -y) , (-x,y) , (y , x) , ( -x , -y ) , ( -y,-x ) , (-y, x) , ( y,-x) 2
Directx Δημοσ. 1 Απριλίου 2013 Δημοσ. 1 Απριλίου 2013 Επίτρεψέ μου να διαφωνήσω και εγώ. Αξίζει να κάνεις ακόμα και μια σειρά κώδικα συνάρτηση, αν αυτό κάνει πιο ευανάγνωστο τον κώδικά σου. Και πάλι διαφωνώ, σεβόμενος όμως την άποψη σου, μάλιστα δεν θα ήταν άσχημο να αναρτήσεις μια εκδοχή του προγράμματος κατ' όπως κρίνεις εσύ καλύτερα. Καλή συνέχεια!!
imitheos Δημοσ. 1 Απριλίου 2013 Δημοσ. 1 Απριλίου 2013 Προφανώς δεν θα κατάλαβα καλά αλλά ο κώδικας που θέλεις να κάνει ο DirectX refactor σε συναρτήσεις είναι ο κώδικας των 49 γραμμών (με 3 γραμμές σχολίων και 12 κενές) του spoiler ? Αν ναι, συμφωνώ και εγώ μαζί του εκτός αν το refactor είναι στο πλαίσιο της πρωταπριλιάς 1
jsiskos Δημοσ. 2 Απριλίου 2013 Δημοσ. 2 Απριλίου 2013 To να γράψεις ένα πρόγραμμα που να καταλαβαίνει ο υπολογιστής είναι εύκολο, το θέμα είναι να το γράψεις έτσι ώστε να το καταλαβαίνουν εύκολα οι άνθρωποι! Μπορεί να κάτσω κάποια στιγμή να το κάνω refactor αν θέλετε πάντως! Είναι καλή συνήθεια.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα