Προς το περιεχόμενο
  • 0
Συνδεθείτε  
bird

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

Ερώτηση

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

 

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

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

2 απαντήσεις σε αυτή την ερώτηση

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

  • 0

Προ καιρού είχα μεταφέρει (port) από περιέργεια σε C++ Builder τον αλγόριθμο τούτου εδώ, ίσως σου φανεί χρήσιμος.

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

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

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

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

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

Εγγραφείτε για έναν νέο λογαριασμό

Σύνδεση

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

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

Χρήσιμες πληροφορίες

Με την περιήγησή σας στο insomnia.gr, αποδέχεστε τη χρήση cookies που ενισχύουν σημαντικά την εμπειρία χρήσης.