שינוי גודל ומיקום הרכיבים בדף

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

רכיבים משתנים

ה-API של Slides מאפשר לשנות את המיקום של רכיבים בדף ולשנות את קנה המידה שלהם. כדי לעשות את זה, קודם צריך לקבוע איזה סוג של טרנספורמציה צריך להחיל, ואז להחיל את הטרנספורמציה באמצעות השיטה presentations.batchUpdate שמכילה לפחות רכיב UpdatePageElementTransformRequest אחד.

אפשר ליצור טרנספורמציות באחד משני applyModes:

  • ABSOLUTE ממירה מחליפה את מטריצת הטרנספורמציה הקיימת של הרכיב. אם תשמיטו את כל הפרמטרים שהחרגתם בבקשה לעדכון הטרנספורמציה, הם יהיו אפס.

  • הטרנספורמציות RELATIVE מוכפלות במטריצת הטרנספורמציה הקיימת של הרכיב (סדר הכפל חשוב):

$$A' = BA$$

המרות יחסיות מזיזות את רכיב הדף או משנים את הגודל שלו מהמיקום הנוכחי שלו. לדוגמה, הזזת צורה ב-100 נקודות שמאלה או סיבוב של 40 מעלות. המרות מוחלטות משמיטות את פרטי המיקום וקנה המידה הקיימים, לדוגמה, העברת צורה למרכז הדף או התאמתה ברוחב ספציפי.

בדרך כלל ניתן לבטא טרנספורמציות מורכבות כרצף של טרנספורמציות פשוטות יותר. חישוב מראש של טרנספורמציה - שילוב של כמה טרנספורמציות באמצעות הכפלת מטריצות - יכול לעיתים קרובות להפחית את התקורה.

בפעולות מסוימות, עליכם לדעת מהם הפרמטרים הקיימים של הטרנספורמציה של רכיב. אם אין לכם את הערכים האלה, תוכלו לאחזר אותם באמצעות הבקשה presentations.pages.get.

תרגום

תרגום הוא פשוט הפעולה של העברת רכיב בדף למיקום חדש באותו דף. תרגומים מוחלטים מזיזים את הרכיב לנקודה ספציפית, ותרגומים יחסיים מזיזים את הרכיב למרחק מסוים.

מטריצת טרנספורמציה בסיסית של תרגום היא בתבנית הבאה:

$$T=\begin{bmatrix} 1 & 0 & translate\_x\\ 0 & 1 & translate\_y\\ 0 & 0 & 1 \end{bmatrix}$$

כשמשתמשים ב-UpdatePageElementTransformRequest כדי לתרגם רכיב (בלי לשנות את הגודל, הגזירה או הכיוון שלו), אפשר להשתמש באחד מהמבנים הבאים של AffineTransform:

// Absolute translation:
{
  'transform': {
    'scaleX':  current scaleX value,
    'scaleY':  current scaleY value,
    'shearX':  current shearX value,
    'shearY':  current shearY value,
    'translateX': X coordinate to move to,
    'translateY': Y coordinate to move to,
    'unit': 'EMU' // or 'PT'
  }
}

// Relative translation (scaling must also be provided to avoid a matrix multiplication error):
{
  'transform': {
    'scaleX':  1,
    'scaleY':  1,
    'translateX': X coordinate to move by,
    'translateY': Y coordinate to move by,
    'unit': 'EMU' // or 'PT'
  }
}

שינוי קנה מידה

Scaling הוא הפעולה של מתיחה או לחיצה על רכיב לאורך מימדי ה-X או ה-Y, כדי לשנות את גודלו. מטריצת טרנספורמציה בסיסית של קנה מידה היא:

$$S=\begin{bmatrix} scale\_x & 0 & 0\\ 0 & scale\_y & 0\\ 0 & 0 & 1 \end{bmatrix}$$

אפשר להשתמש בטופס המטריצה הזה ישירות בתור טרנספורמציה RELATIVE כדי לשנות את גודל הרכיב, אבל זה יכול להשפיע גם על חיתוך הגזירה והתרגום של הרכיב. כדי לשנות את גודל הרכיב בלי להשפיע על הגזירה או התרגום שלו, עוברים למסגרת העזר.

סיבוב

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

$$R=\begin{bmatrix} cos(\theta) & sin(\theta) & 0\\ -sin(\theta) & cos(\theta) & 0\\ 0 & 0 & 1 \end{bmatrix}$$

בדומה לקנה מידה, אפשר להשתמש בצורת המטריצה הזו ישירות בתור טרנספורמציה RELATIVE לסיבוב רכיב, אבל הפעולה הזו גורמת לסיבוב של הרכיב בערך המקור של הדף. כדי לסובב את הרכיב סביב המרכז שלו או על נקודה אחרת, צריך לעבור למסגרת ההפניה הזו.

איך המרגש?

השתקפות שמשקפת רכיב על קו או ציר מסוים. למטריצת הטרנספורמציה הבסיסית של ציר ה-x וה-y יש את הצורות הבאות:

$$F_x=\begin{bmatrix} 1 & 0 & 0\\ 0 & -1 & 0\\ 0 & 0 & 1\\ \end{bmatrix}\qquad\qquad F_y=\begin{bmatrix} -1 & 0 & 0\\ 0 & 1 & 0\\ 0 & 0 & 1\\ \end{bmatrix}$$

בדומה לקנה מידה, אפשר להשתמש בטופס המטריצה הזו ישירות בתור טרנספורמציה RELATIVE שמשקף רכיב, אבל כך הגורם לתרגום גם כן. כדי לשקף את הרכיב ללא תרגום, עוברים למסגרת ההפניה שלו.

מסגרות הפניה לרכיבים

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

כדי לשנות רכיב בתוך מסגרת הפניה משלו, צריך לתחום אותו בין שני תרגומים אחרים: תרגום קודם T1 שמעביר את מרכז הרכיבים למקור הדף, ותרגום הבא T2 שמחזיר את הרכיב בחזרה למיקום המקורי. ניתן לבטא את הפעולה המלאה כמכפלת מטריצה:

$$A' = T2 \times B \times T1 \times A$$

אפשר גם לעבור למסגרות התייחסות אחרות על ידי תרגום של נקודות שונות למקור. הנקודות האלה הופכות למרכז של מסגרת הייחוס החדשה.

אפשר לבצע כל אחת מהטרנספורמציות בנפרד כבקשות טרנספורמציה רציפות מסוג RELATIVE. במצב אידיאלי, צריך לחשב מראש את הערך A' שמופיע למעלה באמצעות הכפלת מטריצות ולהחיל את התוצאה כטרנספורמציה אחת של ABSOLUTE. לחלופין, מחשבים מראש את המכפלה של T2 * B * T1 ומחילים אותה כטרנספורמציה אחת של RELATIVE. הן יעילות יותר מבחינת פעולות ה-API, ולאחר מכן שליחת בקשות הטרנספורמציה בנפרד.

מגבלות

חלק משדות המיקום והגודל לא תואמים לסוגים מסוימים של רכיבי דף. הטבלה שבהמשך מסכמת את התאימות של רכיבים מסוימים בדף לשדות של מידות ומיקום.

שדה צורה וידאו טבלה
תרגום
קנה מידה לא**
חיתוך לא לא

** כדי לעדכן את המאפיינים של שורות ועמודות בטבלה, משתמשים ב-UpdateTableRowPropertiesRequest וב-UpdateTableColumnPropertiesRequest.

כל שדות הגודל והמיקום עשויים לספק תוצאות לא צפויות אם ברכיב הדף יש חיתוך. כל המגבלות כפופות לשינויים. מידע עדכני זמין במאמר Google Slides API.

ה-API של Slides עשוי לארגן מחדש את הערכים שלכם

כשיוצרים רכיב בדף, אפשר לציין גודל וטרנספורמציה שמספקים תוצאה חזותית מסוימת. עם זאת, ה-API עשוי להחליף את הערכים שסיפקתם בערכים אחרים שיניבו את אותו מראה חזותי. באופן כללי, אם כותבים מידה באמצעות ה-API, לא בטוח שהגודל יוחזר. עם זאת, אתם אמורים לקבל את אותן התוצאות אם תבצעו את הטרנספורמציה לחשבון.