עצמים גרפיים ותכונותיהם שיעור מס' 9: עצמים גרפיים מהו handle graphics פקודות הגרפיקה במטלב יוצרות עצמים גרפיים. קיומם של עצמים גרפיים, תכונותיהם והיחסים ביניהם מקבלים ביטוי בתצוגה הגרפית באופן אוטומטי. לכן ההשפעה של המשתמש )או המתכנת( במטלב על הגרפיקה נעשית באמצעות יצירה, שינוי ומחיקה של עצמים גרפיים. חלק מפקודות הגרפיקה שהזכרנו עד כה יצרו עצמים גרפיים באופן עקיף. למשל, הפעלת פקודת plot כאשר אין חלון גרפי גורמת ליצירה של חלון גרפי וכן מערכת צירים אחת, שבתוכה יווצר העצם הגרפי של העקומה )במקום שהמשתמש יצטרך ליצור ע"י פקודה את החלון הגרפי וליצור ע"י פקודה נוספת את מערכת הצירים(. פקודות גרפיות ברמת המשתמש level( )high מבצעות פעולות על עצמים גרפיים שונים באופן השקוף למשתמש. למשל, פקודת plot מאתחלת את מערכת הצירים, אלא אם בוצעה לפני כן פקודת.hold לעומת זאת, פקודות גרפיות ישירות ( low )level מבצעות פעולות מוגדרות על עצם גרפי. למשל, פקודת line מוסיפה עקומה למערכת צירים )מבלי לאתחל את הצירים(. לכל עצם גרפי שנוצר, מוקצה "מזהה" )handle( שמאפשר את הגישה לעצם. המזהה הוא מספר מסוג double אבל לערך המספר כשלעצמו אין משמעות. אם שומרים את המזהה בתוך משתנה, כאשר עצם גרפי נמחק )אם משום שהחלון או מערכת הצירים בו היה נמחקו או אותחלו ואם באמצעת מחיקה יזומה(, המשתנה נשאר בזיכרון אבל אין אפשרות להשתמש במספר שנשמר בו. כל פקודות השרטוט יכולות להחזיר מזהה, באמצעותו ניתן לטפל בעצם הגרפי בהמשך התוכנית. לדוגמא: יצירת חלון גרפי חדש יצירת מערכת צירים יצירת עקומה hfig = figure hfig = 1 hax = axes hax = 173.0013 hcrv = plot(1:10,rand(1,10),'o') hcrv = 174.0022 htxt = text(5,0.5,'middle') htxt = 175.0011 strc = importdata('circle1.gif') himage = image(strc.cdata) strc = cdata: [600x800 uint8] colormap: [256x3 double] himage = 0.0020 יצירת טקסט יצירת תמונה עמ' 1 מתוך 9
קבלת מידע על תכונות עצם גראפי strc = get(hndl) get(hndl,'propertyname') get(hcrv,'markersize') ans = 6 get(hax,'colororder') ans = 0 0 1.0000 0 0.5000 0 1.0000 0 0 0 0.7500 0.7500 0.7500 0 0.7500 0.7500 0.7500 0 0.2500 0.2500 0.2500 inspect(hndl) set(hndl) set(hndl,'property') קבלת ערכי כל התכונות: מתקבל structure קבלת ערך של תכונה מסוימת: דוגמאות: צפייה אינטראקטיבית בתכונות )עם אפשרות לשינוי(: קבלת רשימה של כל תכונות העצם הניתנות לשינוי: קבלת רשימת כל האפשרויות הקיימות לתכונה מסוימת: שינוי תכונות עצם גראפי set(hndl,'propertyname',propertyvalue) set(hndl,'pname1',pvalue1,'pname1',pvalue1,...) set(hcrv,'markersize',3,'markerfacecolor','m') set(htxt,'fontsize',16,'backgroundcolor','y') 1 שינוי תכונה של עצם גרפי: ניתן לשנות מספר תכונות בפקודה אחת, ע"י זוגות של שם תכונה וערך. דוגמא: 0.8 0.6 0.4 Middle 0.2 0 0 2 4 6 8 10 דוגמא 1: הסקריפט d9rw מציג באופן דינאמי את המסלול של הולך אקראי במישור עם אורך-צעד קבוע. מחשבים מראש המסלול לכל הצעדים, ומכינים מראש את השטח המוצג במערכת הצירים כך שיכלול את כל הנקודות של המסלול בכל הזמנים. יוצרים שרטוט ראשוני )נקודת המוצא של המסלול + המיקום אחרי צעד אחד( עם כותרת מתאימה למספר צעדים זה, ושומרים את המזהים )handles( של העקומה ושל הכותרת. הצגת העקומה בלולאת הזמנים נעשית לא ע"י שרטוט מחדש של העקומה, אלא ע"י שינוי העצם הגרפי של העקומה ועדכונו בערכים המחושבים. גם עדכון הכותרת עמ' 2 מתוך 9
)המציגה את מספר הצעד( נעשה ע"י הכנת מחרוזת המציגה את הזמן ועדכון המחרוזת בעצם הגרפי של כותרת הגרף. באופן זה, הצגת העקומה והכותרת בזמנים השונים נראית יותר "חלקה" ורציפה מאשר בשיטה של הפעלת פקודות plot בכל פעם. היררכיה גרפית במטלב עצמים גרפיים במטלב מאורגנים באופן היררכי: כל עצם שייך לעצם שכולל אותו )"הורה"(, כמוראה בתרשים: Root "שורש" הגרפיקה נוצר כאשר מטלב עולה. כל החלונות הגרפיים הם "בנים" של השורש. המזהה )handle( של השורש הוא תמיד 0. Figure חלון גרפי. UI Objects עצמים לממשק משתמש )לדוגמא כפתורים, תפריטים(. Axes מערכות-צירים. CoreObjects עצמים גרפיים בסיסיים: עקומות, משטחים, טקסטים. Plot Objects קבוצות של עצמים גרפיים בסיסיים מאותו סוג. לדוגמא, סדרת עקומות הנוצרת מ- plot.contour Groups Objects עצמים גרפיים מקובצים. ניתן לקבץ עצמים כדי לבצע על כולם פעולות דומות, אבל לא כל הפעולות מוגדרות על צבירים מסוג זה. Annotation עצמים ב"שכבת אנוטציה" )שהיא שכבה נפרדת מן הגרפיקה הבסיסית(. Objects בקורס זה לא נתייחס לשלושת הסוגים האחרונים. בדרך כלל, לעצם ברמה נתונה משויכים מספר עצמים ב"רמת-הבת". למשל ל"שורש" יכולים להיות מספר "ילדים": כל אחד מהם חלון גרפי נפרד. בחלון גרפי יכולים להיות מספר מערכות צירים או מספר.UI Objects במערכת-צירים יכולים להיות מספר עקומות ו/או טקסטים. אחד מן ה"ילדים" הוא ה"עצם הנוכחי" object(,)current וכל פעולה גרפית מבוצעת עליו )אלא אם צוין במפורש על איזה עצם תבוצע הפעולה(. למשל אם יש כמה חלונות גרפיים וחלון מס' 2 הוא החלון הנוכחי, אז פקודת clf תאתחל את חלון מס' 2. אם יש כמה מערכות צירים בחלון מסוים ואחת מהן היא ה- axes,current אז פקודת plot תיצור עקומה במערכת צירים זו. עמ' 3 מתוך 9
קביעת המיקוד )מיהו ה"עצם הנוכחי"(: פתיחת חלון חדש באופן אוטומטי מעבירה את המיקוד לחלון זה figure(.)current כנ"ל יצירת מערכת צירים חדשה )בין אם באופן מפורש ובין אם ע"י פקודת שרטוט בחלון חדש( הופכת אותם לצירים הנוכחיים axes(.)current בחירה ע"י העכבר מעבירה את המיקוד לעצם שנבחר ולכל ה"הורים" שלו. כמ-כן קיימות פקודות להעברת מיקוד באופן מפורש. תכונות עם משמעות משותפת יש תכונות ספציפיות לסוגי עצמים מסוימים ויש תכונות משותפות לכל העצמים או למרביתם. מינוחים אפשרויות מינוח משמעות אחד מסוגי העצמים המוגדרים במטלב type סוג העצם RGB אחת האותיות המציינות צבע, או שלישיית color צבע inches,centimeters,normalized,points,pixels,characters units יחידות אורך. רלוונטי לתכונות כמותיות. תלוי בתכונה המשויכת לקו. בדרך כלל, צבע כמתואר למעלה. edge קו התוחם משטח תלוי בתכונה המשויכת לקו. בדרך כלל, צבע כמתואר למעלה. face משטח תחום בקו on, off visible האם העצם נראה Handle children עצמים-מתחת בהיררכיה Handle parent עצם-מעל בהיררכיה Handle current נוכחי, בפוקוס ברירת-מחדל לתכונות עצמים שמתחת בהיררכיה. תלוי בתכונה. default ברירת-מחדל תכונות משותפות לסוגים שונים של עצמים סוג העצם Type מחרוזת-תווים )איננה משפיעה על התצוגה(. שימושי לצורך חיפוש. Tag מידע המשויך לעצם )אינו משפיע על התצוגה(. שימושי לצורך תכנות. UserData האם העצם נראה. Visible האם העצם ייכלל בתוצאות חיפוש. HandleVisibility האם ניתן לבחור את העצם ע"י העכבר. HitTest עבור :figure+axes צבע-הרקע. עבור :line צבע הקו. Color עבור קווים, משטחים, טקסטים וכו': האם ייראו החלקים הנמצאים מחוץ למערכת הצירים. Clipping FontName עבור :Text תכונות הטקסט בעצם. עבור :Axes תכונות טקסטים מתחת בהיררכיה, למשל כותרות צירים, טקסטים ליד השנתות וכו'. גם מקרא )legend( נחשב למערכת-צירים ולכן תכונות אלה משפיעות גם על הפונטים במקרא לעקומות. FontAngle FontSize FontUnits FontWeight עמ' 1 מתוך 9
Marker MarkerSize תכונות מרקרים: סימן, גודל, צבע קו תוחם וצבע מילוי )אם יש(. MarkerEdgeColor ניתן לשייך מרקרים גם לעקומות וגם לקווי-תיחום בעצמים שהם משטחים. MarkerFaceColor להלן כמה מן התכונות של העצמים הגרפיים הבסיסיים. לא נכללות תכונות הקובעות התנהגות של ממשקי משתמש. אלה יתוארו בשיעור על תכנות ממשקי משתמש. תכונות השורש )מוניטור(: root כל החלונות במטלב נמצאים תחת root )כולל.)command window לכן ניתן לשנות דרך תכונות root תהליכים הקשורים לחלון הפקודות, לדוגמא Language,format,diary ועוד. לקבלת רשימה מלאה יש לחפש בתיעוד.root properties תכונות תצוגה: מתחילות במילה.Screen למשל.ScreenSize יחידות מידה: Units היררכיה: Chilren, CurrentFigure, PointerLocation, PointerWindow : Tag, UserData תכונות חלון figure יצירת חלון: ע"י פקודת.figure העברת פוקוס לחלון: figure(hndl) לקבלת רשימה מלאה יש לחפש בתיעוד.figure properties Units,Position,Visible,Resize,Color,Name,NumberTitle,WindowStyle תכונות החלון עצמו HandleVisibility,HitTest בחירה Children,CurrentAxes היררכיה DoubleBuffer,ColorMap,Pointer שרטוט בחלון DockControls,UIContextMenu,MenuBar,ToolBar לממשק משתמש תכונות מערכת צירים axes יצירת מערכת צירים: ע"י פקודת.axes העברת פוקוס למערכת צירים: axes(hndl) לקבלת רשימה מלאה יש לחפש בתיעוד.axes properties Units,Position,OuterPosition,Box,Color,FontName, FontAngle, XAxisLocation, הצירים YAxisLocation, XColor, YColor, Zcolor, XLabel, YLabel, Zlabel, TickDir Children,Parent,CurrentPoint,Visible,HandleVisibility,HitTest היררכיה ונראות XLim,YLim,ZLim,CLim,CLimMode,DataAspectRatio,XDir,YDir,ZDir הצגת מידע XTick, YTick, Ztick, ColorOrder, LineStyleOrder,XGrid, YGrid, ZGrid, GridLineStyle אנוטציה עמ' 5 מתוך 9
Raw data תכונות קו יצירת קו: line(x,y,'property1',value1,'property2',value2) לקבלת רשימה מלאה יש לחפש בתיעוד.line properties הקו עצמו היררכיה וניראות אופן הצגת מידע אנוטציה תכונות משטחים XData,YData,ZData Parent,Visible,HandleVisibility,HitTest,Selected,SelectedHighlight Color,LineStyle,Marker,MarkerSize,Clipping, LineWidth, MarkerEdgeColor, MarkerFaceColor DisplayName לקבלת רשימה מלאה יש לחפש בתיעוד.surface properties למשטחים יש סדרת תכונות המגדירות את המשטח )שקיפות, טקסטורה, ברק ועוד(. תכונות אלה לא נכללות כאן. המשטח עצמו היררכיה וניראות אופן הצגת מידע אנוטציה תכונות טקסט לקבלת רשימה מלאה יש לחפש בתיעוד.text properties הטקסט עצמו היררכיה וניראות אופן הצגה עיצוב XData,YData,ZData,CData Parent,Visible,HandleVisibility,HitTest,Selected,SelectedHighlight FaceColor,EdgeColor,LineStyle,Marker,MarkerSize,Clipping, LineWidth, MarkerEdgeColor, MarkerFaceColor DisplayName Position,String Parent,Visible,HandleVisibility,HitTest,Selected,SelectedHighlight FontUnits,FontSize,FontName,FontWeight,FontAngle,Rotation, Interpreter, דוגמא: שימוש בתכונות דוגמא 2: הסקריפט d9inset מציג נתוני לידות לפי שנים וחודשים )בדומה ל- d4births (. במערכת הצירים הראשית מוצג המידע הגולמי, ואילו במערכת צירים קטנה יותר )inset( מוצגים הנתונים לאחר נרמול )נטרול מגמה כללית לפי שנים(. כמו-כן מוצגים טקסטים )אחד בצירים הראשיים ושניים ב- inset (. תכונות הטקסטים ב- inset קובעות את מיקום האותיות יחסית לקואורדינטות של נקודת העיגון באופן שונה מברירת המחדל )שהיא שמאל בציר האופקי ומרכז בציר האנכי(. גודל ה- inset מחושב כחלק יחסי )משתנה )Fraction מהצירים הראשיים. כל מערכת צירים מסומנת ב- Tag כדי להקל על זיהוי בהמשך. HorizontalAlignment, VerticalAlignment, Units, Clipping, Margin, Extent Color,BackgroundColor,LineStyle,LineWidth, 13000 12000 1.1 11000 10000 0.9 Min 9000 8000 7000 1 Births per year and month normalized Max 2 4 6 8 10 12 month tendency 6000 1970 1975 1980 1985 1990 1995 2000 2005 year עמ' 6 מתוך 9
טיפול בעצמים גרפיים מציאת העצם בפוקוס strc = importdata('circle1.gif'); himage = image(strc.cdata) set(gcf,'colormap',strc.colormap) himage = 0.0015 100 200 הפקודות הבאות מחזירות מזהה handle לעצם גרפי שהוא: Current figure gcf Current axes gca Current objet gco דוגמא: 300 400 500 600 100 200 300 400 500 600 700 800 חיפוש לפי תכונות hndl=findobj(propertyname,propertyvalue) מציאת עצם/ים שלתכונה מסוימת יש ערך מסוים. ניתן לחפש לפי מספר תכונות. מתקבלים העצמים שמקיימים hndl=findobj(p1,v1,p2,v2,p3,v3,p4,v4) את כל התנאים. ניתן להגביל את החיפוש לעצמים מסוימים )כולל ה"ילדים" hndl=findobj(parents,propname,propvalue) שלהם(. htext=findobj(gca,'type','text') דוגמא: מציאת כל הטקסטים השייכים למערכת הצירים הנוכחית. דוגמא 3: הפונקציה d9curve_num "מחלצת" את הנתונים הנומריים המוצגים בחלון גרפי מסוים. ראשית מוצגים הצירים שבחלון והמשתמש בוחר מאיזו מערכת צירים יילקחו הנתונים, בהנחה שלכל מערכת צירים הוצמד Tag אשר יקל על זיהוי שלה. לאחר מכן מחפשים "בנים" למערכת צירים זו שהם מסוג עקומה )כדי לא לכלול גם טקסטים(. מכל אחד מן העצמים שנמצאו מקבלים את ערכי x,y ואוספים את הנתונים במשתנה אחד מסוג.Cell Array כדוגמא להפעלת הפונקציה, נקח את קובץ השרטוט שנוצר בדוגמא מס' 2. d9curve_num('births.fig') xydata = מחיקת עצמים delete(hndl) delete(findobj(gca,'type','text')) מחיקת עצם גרפי אשר המזהה שלו.hndl אם hndl מערך של מזהים, יימחקו העצמים שאלה המזהים שלהם. דוגמא: מחיקת כל הטקסטים במערכת הצירים הנוכחית. עמ' 7 מתוך 9
קביעת ערכי ברירת-מחדל ערכי ברירת המחדל של עצם כלשהו הם תכונה של העצם שהם שייכים אליו בהיררכיה הגרפית. למשל, ברירת המחדל לצבע של כל מערכת צירים חדשה שנוצרת בחלון גרפי היא תכונה של החלון. set(hparent,'defaultobjtypepropname',value) מבנה הפקודה: Hparent מזהה של parent object ObjType סוג העצם עבורו מגדירים ברירת מחדל. PropName שם התכונות עבורה מגדירים ברירת מחדל value ערך ברירת המחדל set(gcf,'defaultaxesfontname','times') למשל, כדי להגדיר גופני ברירת-מחדל לצירים: פקודות ממשק נוספות קלט גרפי הפקודות הבאות עוצרות את ביצוע התוכנית ומחכות לקלט מן המשתמש )בדומה ל- input ו- menu (. לאחר סיום התהליך, הקלט עובר לסביבה הקוראת והתוכנית ממשיכה להתבצע. קלט קואורדינטות ע"י הקשת עכבר קלט של קואורדינטות של נקודות לפי הקשת עכבר על חלון עם נתונים מספריים. אם בזמן הפעלת הפקודה לא קיים חלון גרפי, אז ייפתח חלון. אם לא קיימת מערכת-צירים, אז תיווצר מערכת-צירים עם ברירת-מחדל עבור האזור הנראה בה. הקואורדינטות נתונות ביחידות של הנתונים המספריים. ביצוע התוכנית מושהה עד לסיום הקלט. יש שתי אפשרויות לסיום: [x,y] = ginput(n) קלט של n נקודות. קלט של מספר כלשהו של נקודות. הפעולה מסתיימת לאחר הקשה על מקש [x,y] = ginput.enter קלט בתיבת טקסט פתיחת חלון ובו מספר תיבות להכנסת טקסט + כפתורי אישור וביטול. מעל כל תיבת-טקסט יש כותרת.)prompt( לאחר שהמשתמש לוחץ על אחד הכפתורים, החלון נסגר והקלט עובר לסביבה הקוראת כמערך תאים שבו כל תא הוא הטקסט שהוזן בכל תיבה )אם נלחץ אישור( או כמערך תאים ריק )אם נלחץ ביטול(, והתוכנית ממשיכה להתבצע. inputs = inputdlg(prompts) עבור כל תא ב- prompt תיווצר תיבה להכנסת inputdlg({'no. of curves' 'output file'}) ans = '10' 'example' inputs = inputdlg(prompts,title,nlines) inputs=inputdlg(prompts,title,nlines,defaults) Pstr = {'number of curves' 'full name'}; N = [1 ; 2]; defts = {'1' 'first-name family-name'}; טקסט. דוגמא: ציון כותרת לחלון הממשק + מספר השורות לכל קלט ציון ערכי ברירת-מחדל. כל ערך חייב להיות מחרוזת. דוגמא: עמ' 8 מתוך 9
inputs = inputdlg(pstr,'',n,defts) inputs = '3' [2x5 char] inputs{2} ans = Dan Cohen אם הקלט הוא יותר משורה אחת, נוצרת מטריצה של תווים ברוחב של השורה הארוכה ביותר. הצגת תיבת הודעות יש במטלב סדרה של פקודות שמייצרות חלון במטרה להציג מידע. פקודות אלה מחזירות מזהה )handle( לחלון שנוצר, ולא עוצרות את מהלך התוכנית. דוגמא לאחת הפקודות: hndl = msgbox(message) נפתח חלון גרפי עם כפתור OK וכן טקסט כמצויין ב- message. לחיצה על הכפתור תסגור את החלון. hndl = msgbox(message,title) הצגת כותרת לחלון: hndl = msgbox(message,title,icon) הצגת צלמית: 'none' 'error' 'help' 'warn' 'custom' כאשר icon יכול להיות אחד מאלה: h = msgbox('no file was found','message','error') דוגמא: waitfor(h) לעצירת התוכנית עד שהעצם עם מזהה h נמחק waitfor(h,property) עצירת התוכנית עד שהעצם h משנה את תכונה property h = msgbox(message) לעצירת התוכנית עד שהמשתמש לוחץ על כפתור OK בתיבת הודעות: waitfor(h) דוגמא 4: הפוקנציה d9curve_select מאפשרת למשתמש לבחור מספר עקומות מתוך סדרת עקומות בחלון גרפי. המשתמש מציין מראש כמה עקומות ייבחרו. עבור כל עקומה, מוצגת תיבת הודעות שהמשתמש סוגר לאחר שבחר את העקומה. עקומה נבחרת ע"י הקשה בעכבר עליה, והיא מודגשת בקו עבה למשך כשנייה. ניתן להקיש על כמה עקומות לפני שמאשרים )האחרונה נקלטת(. כל עקומה שנבחרת נמחקת מן התצוגה )כדי למנוע בחירה חוזרת(. כאשר נבחרו עקומות כמספר שצוין, התוכנית מחזירה מערך-תאים עם כל הנתונים המספריים של העקומות שנבחרו, ומציגה בגרף רק את העקומות שנבחרו. load acid.txt plot acid(:,1),acid(:,2)) כדוגמא להפעלת הפונקציה ניקח את הנתונים מהקובץ acid.txt נתחיל משרטוט של כל העקומות: 0.2 0.15 curvedata=d9curve_select; נפעיל את הפונקציה: 0.1 0.05 0-0.05 550 600 650 700 750 800 850 900 עמ' 9 מתוך 9