בחירת צבע רנדומלית

  • פותח הנושא J2EE
  • פורסם בתאריך

J2EE

New member
בחירת צבע רנדומלית

שלום יש לי קבוצת עובדים, לכל אחת מספר עובד ואני צריך לשייך לכל עובד צבע שונה (אפשרי לפי מספר העובד שלו). רצוי כמובן שהצבעים יהיו נבדלים משמעותית זה מזה כדי למנוע בלבול בתצוגה. מספר העובדים נמדד בעשרות. כיצד אני רנדומלית (או לא רנדומלית) משייך צבע ב RGB לכל עובד ? תודה
 
פשוט

צור פונקציה שממירה מספר עובד לערך RGB
דוגמאות: קח את מספר העובד, חלק אותו במספר העובדים הכולל (קיבלת ערך בין 0 ל-1), הכפל את התוצאה ב-255 (קיבלת ערך בין 0 ל-255), והצב את הערך הזה ב-R, ב-G, וב-B. בקיצור, קיבלת גווני אפור לכל העובדים. אופציה נוספת, שתיתן לך פיזור יותר טוב של צבעים בין עובדים: פונקציות HASHING (ערבול). כתבתי דוגמה פשוטה, שתמחיש את השימוש:
#include "stdafx.h" #include <iostream.h> int hash(int key) { key += ~(key << 15); key ^= (key >> 10); key += (key << 3); key ^= (key >> 6); key += ~(key << 11); key ^= (key >> 16); return key; } int main(int argc, char* argv[]) { int i; for (i = 1; i < 100; ++i) cout << hash(i) << endl; return 0; }​
הערך החוזר מ-HASH הוא 32 ביט. השתמש בו כערך RGB (כלומר, 8 ביטים תחתונים הם R, 8 ביטים הבאים הם G, וכו'). לשם יעילות, אתה יכול להפעיל את התוכנית הזו פעם אחת, לשמור את התוצאות בתוך טבלה סטאטית, ולהשתמש בה בעתיד מבלי שיהיה צורך להפעיל את פוקציית הערבול כל פעם מחדש.
 

eyalbd

New member
רק לא הבנתי למה stdafx.h

ככה בלי לחשוב אם זה נחוץ בכלל. זו לא תוכנית MFC.
 
מפלצת ההודעות

אכלה את התשובה שלי! רק אמרתי שפשוט עשיתי COPY-PASTE מתוך VSTUDIO לדוגמה שכתבתי... לא צריך את השורה הזו מן הסתם.
 

voguemaster

New member
לא קשור ל-MFC

הקובץ stdafx באופן מסורתי הוא הקובץ שאומר איזה headers הן ה-PCH. זה לא ממש רלוונטי אם זו תוכנית MFC כי PCH קיימות גם בלי זה.
 
דרך אגב,

אפשר להשתמש בפונקציות ערבול דיפרנציואליות הקיימות בשפת C, כמו השילוב של SRAND ו-RAND. לדוגמה:
srand(12345); // any number will do for (i = 1; i <=100; ++i) { R=rand()%256; G=rand()%256; B=rand()%256; // every time, R,G and B will have different values }​
ההבדל בין הקוד הזה, למה שכתבתי קודם, הוא שלא *תמיד* מובטח לך צבע ספציפי עבור מספר עובד מסויים. יכול להיות שבמחשב א' זה יהיה גוון אדום, ובמחשב ב' זה יהיה גוון ירוק. ההבדל נובע מהדרך שבה בנית את התוכנה שלך, במערכת ההפעלה שעליה היא רצה, ובעידכונים שמערכת ההפעלה שלך עברה.
 
תיקון קל

srand(12345); // any number will do x = RAND_MAX/256+1; for (i = 1; i <=100; ++i) { R=rand()%x; G=rand()%x; B=rand()%x; // every time, R,G and B will have different values }​
ותודה ל'זהיר' על תשומת הלב....
 

selalerer

New member
מסובך מידי לטעמי.

פשוט יותר יהיה, אני חושב, להתייחס אל כל הערך של הצבע (גם הR, גם הG וגם הB) כערך אחד. הטווח יהיה מ0,0,0 עד 255,255,255 או מ0 עד 16581375. ואז תחלק את הטווח במספר העובדים ותתחיל מאפס ולכל עובד תוסיף את התוצאה של החילוק הזה ותעשה פונקציה שממירה לך את זה לערכי RGB. הבעיה תהיה אם אתה רוצה שצבעים דומים לא יהיו אחד ליד השני במסך (וזה כנראה מה שתרצה לעשות) אז כבר תצטרך להסתבך. תוכל לעשות משהו ששם אחד בהתחלה ואחד בסוף ואז מוצא את הנקודה הרחוקה ביותר משני אלה (שזה יהיה האמצע) ושם שם את הצבע הבא ואז שוב מחפש את הנקודה הרחוקה ביותר מאלה שכבר יש להם צבע (שהפעם זה ייצא או ברבע הראשון או ברבע השלישי) ושם שם את הצבע הבא וכן הלאה.... אני מקווה שעזרתי במשהו (בלי לזלזל כמובן בדרכים שהוצעו קודם). סלע.
 
למעלה