bird Δημοσ. 26 Φεβρουαρίου 2013 Δημοσ. 26 Φεβρουαρίου 2013 Καλησπέρα σε όλους! Πριν μερικούς μήνες είπα να ξεσκονίσω τις γνώσεις μου σε C και άρχισα να υλοποιώ ξανά παλιές ασκήσεις από το πανεπιστήμιο (μιας και τα αρχεία από τότε είναι καταχωνιασμένα σε CD κάπου σε κάποια κούτα). Μία από τις ασκήσεις λοιπόν ήταν η απεικόνιση του Mandelbrot set οπότε έπρεπε να υλοποιήσω μία συνάρτηση που να χρωματίζει ένα pixel ανάλογα με τον αριθμό των επαναλήψεων που χρειαζόταν για να συγκλίνει μπλα μπλα μπλα... Έφτιαξα μια συνάρτηση χρωματισμού, την οποία παραθέτω παρακάτω, αλλά θα ήθελα αν κάποιος άλλος έχει υλοποιήσει κάτι παρόμοιο να το αναρτήσει μήπως είναι καλύτερο το αποτέλεσμα. typedef struct { unsigned char b, /* Blue */ g, /* Green */ r, /* Red */ a;/* Alpha Channel */ } Pixel; /* Makes a color from an integer */ Pixel* colorize_pixel(Pixel* p, int n, int max_iterations) { // constant parameters const short max_hue = 360; // Maximum hue value const short max_color = 255; // Maximum color value // Variables int h; // Current hue int div; // Variable for division of hue over 60 int x; // Color value /* Normalizes hue to [0,360) */ h = (n*max_hue)/max_iterations; /* Initialize color */ p->r = p->b = p->g = 0; p->a = max_color; /* For maximum iterations or greater return black */ if ( n >= max_iterations) return p; /* Finds hue range and color value*/ div = h/60; x = max_color*(1 - (div%2?(-1):1)*h%60/60.); /* Creates Color using HSL -> RGB method */ switch(div) { case 0: p->r = max_color; p->b = 0; p->g = x*max_color; break; case 1: p->r = x*max_color; p->b = 0; p->g = max_color; break; case 2: p->r = 0; p->b = x*max_color; p->g = max_color; break; case 3: p->r = 0; p->b = max_color; p->g = x*max_color; break; case 4: p->r = x*max_color; p->b = max_color; p->g = 0; break; default:p->r = max_color; p->b = x*max_color; p->g = 0; break; } return p; } Για κάθε pixel οι τιμές των red, green και blue παίρνους τιμές από 0 έως 255 ενώ το alpha είναι πάντα 255. Στην ουσία αυτό που κάνω είναι να χρησιμοποιώ τον αριθμό των επαναλήψεων σαν το hue του pixel (με saturation και value μαχ) και μετά να μετατρέπω το χρώμα από hsv σε rgb. Όμως θυμάμαι την υλοποίηση που είχα κάνει στη σχολή να δίνει πολύ ομορφότερα αποτελέσματα αλλά πλέον δεν έχω ιδέα πως την είχα κάνει ρε γμτ... Αν κάποιος γνωρίζει κανένα άλλον αλγόριθμο για να χρωματιστεί ένα pixel, ας τον μοιραστεί. (επισυνάπτω και 3 εικόνες από τον χρωματισμο που προκύπτει από τη συνάρτηση που υλοποίησα)
Directx Δημοσ. 27 Φεβρουαρίου 2013 Δημοσ. 27 Φεβρουαρίου 2013 Προ καιρού είχα μεταφέρει (port) από περιέργεια σε C++ Builder τον αλγόριθμο τούτου εδώ, ίσως σου φανεί χρήσιμος.
bird Δημοσ. 27 Φεβρουαρίου 2013 Μέλος Δημοσ. 27 Φεβρουαρίου 2013 Ναι, τον έχω δει τον αλγόριθμο αυτό! Ευχαριστώ πάντως!
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα