עצמים גרפיים ותכונותיהם שיעור מס' 9: עצמים גרפיים מהו handle graphics פקודות הגרפיקה במטלב יוצרות עצמים גרפיים. קיומם של עצמים גרפיים, תכונותיהם והיחסים ביניהם מקבלים ביטוי בתצוגה הגרפית באופן אוטומטי. לכן ההשפעה של המשתמש )או המתכנת( במטלב על הגרפיקה נעשית באמצעות יצירה, שינוי ומחיקה של עצמים גרפיים. חלק מפקודות הגרפיקה שהזכרנו עד כה יצרו עצמים גרפיים באופן עקיף. למשל, הפעלת פקודת plot כאשר אין חלון גרפי גורמת ליצירה של חלון גרפי וכן מערכת צירים אחת, שבתוכה יווצר העצם הגרפי של העקומה )במקום שהמשתמש יצטרך ליצור ע"י פקודה את החלון הגרפי וליצור ע"י פקודה נוספת את מערכת הצירים(. פקודות גרפיות ברמת המשתמש level( )high מבצעות פעולות על עצמים גרפיים שונים באופן השקוף למשתמש. למשל, פקודת plot מאתחלת את מערכת הצירים, אלא אם בוצעה לפני כן פקודת.hold לעומת זאת, פקודות גרפיות ישירות ( low )level מבצעות פעולות מוגדרות על עצם גרפי. למשל, פקודת line מוסיפה עקומה למערכת צירים )מבלי לאתחל את הצירים(. לכל עצם גרפי שנוצר, מוקצה "מזהה" )handle( שמאפשר את הגישה לעצם. המזהה הוא אובייקט )עצם( מסוג.handle אם שומרים את המזהה בתוך משתנה, כאשר עצם גרפי נמחק )אם משום שהחלון או מערכת הצירים בו היה נמחקו או אותחלו ואם באמצעת מחיקה יזומה(, המשתנה נשאר בזיכרון אבל אין אפשרות להשתמש בעצם שנשמר בו. כל פקודות השרטוט יכולות להחזיר מזהה, באמצעותו ניתן לטפל בעצם הגרפי בהמשך התוכנית. ל יצירת חלון גרפי חדש hfig = figure hfig = Figure (2) with properties: Number: 2 Name: '' Color: [0.8554 0.8554 0.8554] Position: [147 160 560 420] Units: 'pixels' hax = axes hax = Axes with properties: יצירת מערכת צירים XLim: [0 1] YLim: [0 1] XScale: 'linear' YScale: 'linear' GridLineStyle: '-' Position: [0.1300 0.1100 0.7750 0.8150] Units: 'normalized' עמ' 1 מתוך 11
hcrv = plot(1:10,rand(1,10),'ok') hcrv = Line with properties: יצירת עקומה Color: [0 0.4470 0.7410] LineStyle: 'none' LineWidth: 0.5000 Marker: 'o' MarkerSize: 6 MarkerFaceColor: 'none' XData: [1 2 3 4 5 6 7 8 9 10] YData: [1x10 double] ZData: [1x0 double] htxt = text(5,0.5,'middle') htxt = Text (Middle) with properties: יצירת טקסט String: 'Middle' FontSize: 10 FontWeight: 'normal' FontName: 'Helvetica' Color: [0 0 0] HorizontalAlignment: 'left' Position: [5 0.5000 0] Units: 'data' strc = importdata('shapes\circle1.gif') strc = cdata: [336x448 uint8] colormap: [256x3 double] himage = image(strc.cdata) himage = Image with properties: יצירת תמונה CData: [336x448 uint8] CDataMapping: 'direct' קבלת מידע על תכונות עצם גרפי inspect(hndl) hndl.propertyname hcrv.linewidth ans = 0.5000 strc = get(hndl) צפייה אינטראקטיבית בתכונות )עם אפשרות לשינוי(: קבלת ערך של תכונה מסוימת - שליפת תוכן של שדה: פקודת get קבלת ערכי כל התכונות: מתקבל structure עמ' 2 מתוך 11
get(hndl,'propertyname') get(hcrv,'markersize') ans = 6 get(hax,'colororder') ans = 0 0.4470 0.7410 0.8500 0.3250 0.0980 0.9290 0.6940 0.1250 0.4940 0.1840 0.5560 0.4660 0.6740 0.1880 0.3010 0.7450 0.9330 0.6350 0.0780 0.1840 set(hndl) set(hndl,'property') קבלת ערך של תכונה מסוימת: דוגמאות: פקודת set קבלת רשימה של כל תכונות העצם הניתנות לשינוי: קבלת רשימת כל האפשרויות הקיימות לתכונה מסוימת: שינוי תכונות עצם גראפי hndl.propertyname = value קביעת ערך של תכונה מסוימת - שינוי תוכן של שדה: hfig.color = [0.95 0.99 1]; שינוי צבע הרקע של החלון הגרפי set(hndl,'propertyname',propertyvalue) פקודת :set set(hndl,'pname1',pval1,'pname2',pval2,...) ניתן לשנות מספר תכונות בפקודה אחת, ע"י זוגות של שם תכונה וערך. set(hcrv,'markersize',8,'markerfacecolor',[1 0.8 0.9]) set(htxt,'fontsize',16,'backgroundcolor','y') עמ' 3 מתוך 11
דוגמא 1: הסקריפט d9ball מציג באופן דינאמי כדור הנע בנפילה חופשית ומתנגש ברצפה. מחשבים מראש את המסלול לסדרה של זמנים, כלומר המקום של מרכז הכדור. מחשבים גם את הקואורדיטות של פני הכדור, כאשר המרכז בראשית הצירים. מכינים מראש את השטח המוצג במערכת הצירים כך שיכלול את כל המרחב שבו נע הכדור. יוצרים שרטוט ראשוני שבו הכדור נמצא בנקודת ההתחלה והכותרת מציינת זמן 0, ושומרים את המזהים )handles( של המשטח ושל הכותרת. הצגת הכדור בלולאת הזמנים נעשית לא ע"י שרטוט מחדש של המשטח, אלא ע"י שינוי העצם הגרפי של המשטח ועדכונו בערכים המחושבים )ע"י הוספת ערך הקואורדינטות של מרכז הכדור בכל זמן לערכי הקואורדינטות של נקודות המשטח(. גם עדכון הכותרת )המציגה את ערך הזמן( נעשה ע"י הכנת מחרוזת מתאימה ועדכון המחרוזת בעצם הגרפי של כותרת הגרף. באופן זה, הצגת העקומה והכותרת בזמנים השונים נראית יותר "חלקה" ורציפה מאשר בשיטה של הפעלת פקודות surf בכל פעם. היררכיה גרפית במטלב עצמים גרפיים במטלב מאורגנים באופן היררכי: כל עצם שייך לעצם שכולל אותו )"הורה"(, כמוראה בתרשים: "שורש" הגרפיקה נוצר כאשר מטלב עולה. כל החלונות הגרפיים הם "בנים" של השורש. המזהה )handle( של השורש הוא תמיד.groot חלון גרפי. עצמים לממשק משתמש )לדוגמא כפתורים, תפריטים(. מערכות-צירים. עצמים גרפיים בסיסיים: עקומות, משטחים, טקסטים. Root Figure UI Objects Axes Primitive Objects עמ' 4 מתוך 11
קבוצות של עצמים גרפיים בסיסיים היוצרים יחד עצם גרפי מורכב. לדוגמא, סדרת עקומות Chart Objects הנוצרת מ- plot.contour עצמים גרפיים מקובצים. ניתן לקבץ עצמים כדי לבצע על כולם פעולות דומות, אבל לא כל Groups Objects הפעולות מוגדרות על צבירים מסוג זה. Colorbar, Legend מערכות צירים הכוללות מידע על גרפים במערכות צירים אחרות: Illustration Objects עצמים ב"שכבת אנוטציה" )שהיא שכבה נפרדת מן הגרפיקה הבסיסית(. Annotation Objects בקורס זה לא נתייחס לארבעת הסוגים האחרונים. בדרך כלל, לעצם ברמה נתונה משויכים מספר עצמים ב"רמת-הבת". למשל ל"שורש" יכולים להיות מספר "ילדים": כל אחד מהם חלון גרפי נפרד. בחלון גרפי יכולים להיות מספר מערכות צירים או מספר.UI Objects במערכת-צירים יכולים להיות מספר עקומות ו/או טקסטים. אחד מן ה"ילדים" הוא ה"עצם הנוכחי" object(,)current וכל פעולה גרפית מבוצעת עליו )אלא אם צוין במפורש על איזה עצם תבוצע הפעולה(. למשל אם יש כמה חלונות גרפיים וחלון מס' 2 הוא החלון הנוכחי, אז פקודת clf תאתחל את חלון מס' 2. אם יש כמה מערכות צירים בחלון מסוים ואחת מהן היא ה- axes,current אז פקודת plot תיצור עקומה במערכת צירים זו. קביעת המיקוד )מיהו ה"עצם הנוכחי"(: פתיחת חלון חדש באופן אוטומטי מעבירה את המיקוד לחלון זה 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 ברירת-מחדל עמ' 5 מתוך 11
תכונות משותפות לכל העצמים סוג העצם מחרוזת-תווים )איננה משפיעה על התצוגה(. שימושי לצורך חיפוש. מידע המשויך לעצם )אינו משפיע על התצוגה(. שימושי לצורך תכנות. האם העצם נראה. האם העצם ייכלל בתוצאות חיפוש. האם ניתן לבחור את העצם ע"י העכבר. עבור קווים, משטחים, טקסטים וכו': האם ייראו החלקים הנמצאים מחוץ למערכת הצירים. Type Tag UserData Visible HandleVisibility HitTest Clipping תכונות משותפות למספר סוגים של עצמים עבור :figure+axes צבע-הרקע. עבור :line צבע הקו. עבור :Text תכונות הטקסט בעצם. עבור :Axes תכונות טקסטים מתחת בהיררכיה, למשל כותרות צירים, טקסטים ליד השנתות וכו'. גם מקרא )legend( נחשב למערכת-צירים ולכן תכונות אלה משפיעות גם על הפונטים במקרא לעקומות. תכונות מרקרים: סימן, גודל, צבע קו תוחם וצבע מילוי )אם יש(. ניתן לשייך מרקרים גם לעקומות וגם לקווי-תיחום בעצמים שהם משטחים. Color FontName FontAngle FontSize FontUnits FontWeight 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 עמ' 6 מתוך 11
Number מספר החלון Units,Position,Visible,Resize,Color,Name,NumberTitle,WindowStyle HandleVisibility,HitTest Children,CurrentAxes, CurrentObject DoubleBuffer,ColorMap,Pointer,CurrentPoint DockControls,UIContextMenu,MenuBar,ToolBar Tag,UserData תכונות החלון עצמו בחירה היררכיה שרטוט בחלון לממשק משתמש למתכנת תכונות מערכת צירים 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 Tag,UserData היררכיה ונראות הצגת מידע אנוטציה למתכנת תכונות קו יצירת קו: 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 אנוטציה Tag,UserData למתכנת תכונות משטחים לקבלת רשימה מלאה יש לחפש בתיעוד.surface properties למשטחים יש סדרת תכונות המגדירות את המשטח )שקיפות, טקסטורה, ברק ועוד(. תכונות אלה לא נכללות כאן. XData,YData,ZData,CData Parent,Visible,HandleVisibility,HitTest,Selected,SelectedHighlight המשטח עצמו היררכיה וניראות עמ' 7 מתוך 11
FaceColor,EdgeColor,LineStyle,Marker,MarkerSize,Clipping, LineWidth, אופן הצגת מידע MarkerEdgeColor, MarkerFaceColor DisplayName Tag,UserData Position,String אנוטציה למתכנת תכונות טקסט לקבלת רשימה מלאה יש לחפש בתיעוד.text properties הטקסט עצמו Parent,Visible,HandleVisibility,HitTest,Selected,SelectedHighlight FontUnits,FontSize,FontName,FontWeight,FontAngle,Rotation, Interpreter, היררכיה וניראות אופן הצגה HorizontalAlignment, VerticalAlignment, Units, Clipping, Margin, Extent Color,BackgroundColor,LineStyle,LineWidth, Tag,UserData עיצוב למתכנת שימוש בתכונות דוגמא 2: הסקריפט d9inset מציג נתוני לידות לפי שנים וחודשים )בדומה ל- d4births (. במערכת הצירים הראשית מוצג המידע הגולמי, ואילו במערכת צירים קטנה יותר )inset( מוצגים הנתונים לאחר נרמול )נטרול מגמה כללית לפי שנים(. כמו-כן מוצגים טקסטים )אחד בצירים הראשיים ושניים ב- inset (. תכונות הטקסטים ב- inset קובעות את מיקום האותיות יחסית לקואורדינטות של נקודת העיגון באופן שונה מברירת המחדל )שהיא שמאל בציר האופקי ומרכז בציר האנכי(. גודל ה- inset מחושב כחלק יחסי )משתנה )Fraction מהצירים הראשיים. כל מערכת צירים מסומנת ב- Tag כדי להקל על זיהוי בהמשך. טיפול בעצמים גרפיים מציאת העצם בפוקוס הפקודות הבאות מחזירות מזהה handle לעצם גרפי שהוא: Current figure gcf Current axes gca Current objet gco עמ' 8 מתוך 11
strc = importdata('shapes\circle1.gif'); himage = image(strc.cdata) set(gcf,'colormap',strc.colormap) himage = Image with properties: CData: [336x448 uint8] CDataMapping: 'direct' חיפוש לפי תכונות 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 מערך של מזהים, יימחקו העצמים שאלה המזהים שלהם. מחיקת כל הטקסטים במערכת הצירים הנוכחית. עמ' 9 מתוך 11
קביעת ערכי ברירת-מחדל ערכי ברירת המחדל של עצם כלשהו הם תכונה של העצם שהם שייכים אליו בהיררכיה הגרפית. למשל, ברירת המחדל לצבע של כל מערכת צירים חדשה שנוצרת בחלון גרפי היא תכונה של החלון. מבנה הפקודה: מזהה של parent object סוג העצם עבורו מגדירים ברירת מחדל. שם התכונות עבורה מגדירים ברירת מחדל ערך ברירת המחדל למשל, כדי להגדיר גופני ברירת-מחדל לצירים: פקודות ממשק נוספות קלט גרפי set(hparent,'defaultobjtypepropname',value) Hparent ObjType PropName value set(gcf,'defaultaxesfontname','times') הפקודות הבאות עוצרות את ביצוע התוכנית ומחכות לקלט מן המשתמש )בדומה ל- input ו- menu (. לאחר סיום התהליך, הקלט עובר לסביבה הקוראת והתוכנית ממשיכה להתבצע. קלט קואורדינטות ע"י הקשת עכבר קלט של קואורדינטות של נקודות לפי הקשת עכבר על חלון עם נתונים מספריים. אם בזמן הפעלת הפקודה לא קיים חלון גרפי, אז ייפתח חלון. אם לא קיימת מערכת-צירים, אז תיווצר מערכת-צירים עם ברירת-מחדל עבור האזור הנראה בה. הקואורדינטות נתונות ביחידות של הנתונים המספריים. ביצוע התוכנית מושהה עד לסיום הקלט. יש שתי אפשרויות לסיום: קלט של n נקודות. קלט של מספר כלשהו של נקודות. הפעולה מסתיימת לאחר הקשה על מקש.ENTER קלט בתיבת טקסט [x,y] = ginput(n) [x,y] = ginput פתיחת חלון ובו מספר תיבות להכנסת טקסט + כפתורי אישור וביטול. מעל כל תיבת-טקסט יש כותרת.)prompt( לאחר שהמשתמש לוחץ על אחד הכפתורים, החלון נסגר והקלט עובר לסביבה הקוראת כמערך תאים שבו כל תא הוא הטקסט שהוזן בכל תיבה )אם נלחץ אישור( או כמערך תאים ריק )אם נלחץ ביטול(, והתוכנית ממשיכה להתבצע. עבור כל תא ב- prompt תיווצר תיבה להכנסת טקסט. ציון כותרת לחלון הממשק + מספר השורות לכל קלט ציון ערכי ברירת-מחדל לקלט: כל ערך חייב להיות מחרוזת. אם הקלט הוא יותר משורה אחת, נוצרת מטריצה של תווים ברוחב של השורה הארוכה inputs = inputdlg(prompts) inputdlg({'no. of curves' 'output file'}) 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'}; inputs = inputdlg(pstr,'',n,defts) inputs{2} inputs = '5' [2x10 char] ans = Noam Cohen Dan Marom ביותר. עמ' 10 מתוך 11
הצגת תיבת הודעות יש במטלב סדרה של פקודות שמייצרות חלון במטרה להציג מידע. פקודות אלה מחזירות מזהה )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 כדוגמא להפעלת הפונקציה ניקח את הנתונים מהקובץ acid.txt plot acid(:,1),acid(:,2:end)) נתחיל משרטוט של כל העקומות: נפעיל את הפונקציה: curvedata=d9curve_select; עמ' 11 מתוך 11