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

Συνάρτηση χρωματισμού pixel σε C


bird

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

Καλησπέρα σε όλους!

 

Πριν μερικούς μήνες είπα να ξεσκονίσω τις γνώσεις μου σε 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 εικόνες από τον χρωματισμο που προκύπτει από τη συνάρτηση που υλοποίησα)

post-71719-0-96855700-1361906990_thumb.jpg

post-71719-0-95275900-1361907005_thumb.jpg

post-71719-0-33084300-1361907245_thumb.jpg

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

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

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

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

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

Σύνδεση

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

Συνδεθείτε τώρα
  • Δημιουργία νέου...