חוקרים מאוניברסיטת קורנל פיתחו אלגוריתמים לסינתוז קול של … דברים מתנפצים.
האלגוריתמים מבוססים על התכונות הפיסיקליות של האובייקטים הנשברים ושל (אני מניח) הסביבה שלהם.
בדיוק כמו שאפשר לרנדר תמונות תלת מימדיות על בסיס מודל תלת מימדי, אפשר לסנתז גם צלילים שמתאימים לפיזיקה של מה שקורה במודל.
למעשה שאלתי את עצמו כבר לפני שנים מתי נראה סינתוז פיזיקלי מלא של צלילים במשחקים (ובסימולציות אחרות) במקום שימוש בצלילים מוקלטים. האלגוריתם הזה הוא לא הפתרון, אבל הוא בהחלט יכול להיות חלק מהפתרון.
כמה מגניב זה יכול להיות? תראו בעצמכם:
ארכיון עבור הקטגוריה אלגוריתמיםמפתח הולנדי חובב פיתח בזמנו הפנוי במהלך סוף שבוע תוכנה דמוית שזאם למציאת מוסיקה שמבוססת על ניתוח תדר של הקול, יצירת חתימה פשוטה של חלונות בזמן וחיפוש של התאמות. הבנתם? דעתכם? לפני כמה פוסטים שאלתי את השאלה הבאה: נתון מערך בגודל NxN של פיקסלים כאשר כל הפיקסלים שחורים חוץ מאחוז מסויים מהם שאינו שחור ומפוזר באופן אקראי, פעולת המציאה עצמה צריכה להיות מהירה מאוד, אבל מותר לעבד מראש את התמונה פעם אחת (בזמן סביר). אז הנה הפתרון שלי: private static int [][][] buildgrid(byte[][] image, int width, int height, int gridSize)
{ int grid[][][] = new int[width / gridSize][height / gridSize][]; // count the number of points in each grid cell int numpoints[][] = new int[width / gridSize][height / gridSize]; for(int x=0;x<width;x++) { for(int y=0;y<height;y++) { if (image[x][y] > Byte.MIN_VALUE) { numpoints[x/gridSize][y/gridSize]++; } } } for(int x=0;x<width;x++) { for(int y=0;y<height;y++) { int c = image[x][y]; if (c > Byte.MIN_VALUE) { int gy = y/gridSize; int gx = x/gridSize; int list[] = grid[gx][gy]; if (list == null) { int np = numpoints[gx][gy]; list = new int[np * 2]; grid[gx][gy] = list; numpoints[gx][gy] = 0; } list[numpoints[gx][gy]++] = x; list[numpoints[gx][gy]++] = y; } } } return grid; } הקוד הבא סופר את המספר הנקודות בתוך החלון שמרכזו (x,y)’ שימו לב שהלולאות עוברות על ארבעה ריבועים בגריד בלבד: // window boundaries:
int rx1 = x – grid_size/2; int ry1 = y – grid_size/2; int rx2 = rx1 + grid_size; int ry2 = ry1 + grid_size; // top left grid cell (out of 2×2 group to be checked) for(int grid_x=gx;grid_x<gx+2 && grid_x >= 0 && grid_x < gwidth;grid_x++) יתכן שאפשר לשפר את הביצועים אם נחלק את הגריד לריבועים יותר קטנים ונכלול ריבועים שלמים שנופלים בתוך החלון בלי לבדוק כל נקודה באופן פרטני, אבל לא ניסיתי. האפלט הבאה מדגימה את האלגוריתם. אפשר להוריד אותה מפה. הקוד כלול בתוך הJAR (אפשר לפתוח את הJAR עם תוכנה לפתיחת קבצי ZIP). אז הזכרתי באחר הפוסטים האחרונים את הבעיה הבאה: בהנתן קבוצת S של n מספרים שלמים, איך נחלק אותה לk קבוצות כך שסכום המספרים בכל קבוצה הוא קרוב לסכום המספרים בקבוצות האחרות. S = {2,2,3,2,3}
k=2 split(S,k)={{2,2,2},{3,3}} S1={1,5,11,2,10} עבור k=2 הבעיה היא בעצם בעיית תיק הגב (Knapsack) עבור k גדול מ2, הבעיה קשה יותר. זה הכל. אז מה אתם אומרים, יש לכם פתרון יותר טוב? והנה בעיה נוספת עליה אני ארחיב באחד הפוסטים הקרובים:
|




רסיסים (RSS)