גרפיקת הצב

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

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

הצב נע באמצעות פקודות היחסיות למיקומו הנוכחי, כגון "זוז קדימה 10 צעדים" ו"פנה שמאלה 90 מעלות". ניתן לשלוט גם בעט שהצב נושא על ידי הפעלתו, קביעת צבעו או שינוי עוביו. תלמיד יכול להבין (לחזות ולנתח) את תנועת הצב על ידי דמיון הפעולות שהיה מבצע אילו היה הוא עצמו הצב. סימור פאפרט כינה זאת חשיבה "גופנית-סינטונית". מערכת גרפיקת צב מלאה דורשת בקרת זרימה, פרוצדורות ורקורסיה; תוכנות רבות לציור באמצעות צב לוקות בחסר בהיבטים אלו. מאבני בניין אלו ניתן לבנות צורות מורכבות יותר כמו ריבועים, משולשים, עיגולים וצורות מורכבות אחרות. הרעיון של גרפיקת צב שימושי, למשל, במערכת לינדנמאייר (L-system) ליצירת פרקטלים.

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

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

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

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

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

המאמר של Verhoeff (2010) מיישם גישה של שני וקטורים ומפתח תיאוריה אלגברית להוכחת תכונות גאומטריות מתוך פקודות התכנות. אחת התובנות היא שפקודת "צלילה" (dive) היא למעשה קיצור של רצף פניות וגלגולים.

ספריית "Cheloniidae" היא דוגמה לספריית גרפיקת צב בתלת-ממד עבור Java, המשתמשת במושגים כמו עלרוד (pitch) וגלגול בתוך "צב קרטזי סיבובי".

 פעולות 
 תנועה וניווט 
המודול מדמה סמן וירטואלי המחזיק "עט", אשר נע על גבי מערכת צירים קרטזית דו-ממדית. ראשית הצירים (0,0) ממוקמת כברירת מחדל במרכז החלון. התנועה במרחב מתבצעת באופן יחסי לכיוון הנוכחי של הצב או באופן מוחלט ביחס למערכת הצירים.
 תנועה קווית: הפקודה `turtle.forward(n)` מניעה את הצב קדימה $n$ פיקסלים בכיוון אליו הוא פונה כעת.
 ניהול זוויות: כיוון ברירת המחדל (0 מעלות) הוא לכיוון מזרח. הזוויות מוגדרות כך ש-90 מעלות פונה לצפון, 180 למערב ו-270 לדרום.
 שינוי כיוון יחסי מתבצע באמצעות turtle.right(angle) ו-turtle.left(angle).
 קביעת כיוון מוחלט (ללא תלות בכיוון הקודם) מתבצעת באמצעות turtle.setheading(angle).
 מיקום: ניתן להעביר את הצב ישירות לנקודה (x,y) באמצעות turtle.goto(x, y). את המיקום הנוכחי ניתן לדלות באמצעות turtle.pos() או בנפרד על ידי  ו-.

 שליטה בתוצר הגרפי 
הציור מתבצע על ידי ניהול המאפיינים של ה"עט" הווירטואלי.
 מצבי העט: כברירת מחדל, העט נמצא במצב "מוריד" (pendown) ומשרטט תוך כדי תנועה. ניתן להרימו באמצעות  כדי לנוע ללא השארת עקבות.
 עיצוב: ניתן לשנות את רוחב הקו בפיקסלים (turtle.pensize) ואת צבע הציור (turtle.pencolor).
 צורות ומילוי: המודול תומך בציור מעגלים (turtle.circle), נקודות (turtle.dot) ומילוי צורות סגורות. מילוי מתבצע על ידי הגדרת צבע (turtle.fillcolor), הכרזה על תחילת המילוי (turtle.begin_fill), ציור הצורה, וסיום הפעולה (turtle.end_fill).

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

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

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

 פעולות 
תנועה וניווטשליטה בעט ובצבענראות ומצב הצבפקודה (וקיצור)תיאור הפעולהפקודה (וקיצור)תיאור הפעולהפקודה (וקיצור)תיאור הפעולהforward(d) / fd(d)התקדמות קדימה למרחק d.pendown() / pd()הורדת העט (הצב יצייר בתנועה).showturtle() / st()הצגת הצב על המסך.backward(d) / bk(d)תנועה אחורה למרחק d.penup() / pu()הרמת העט (הצב יזוז בלי לצייר).hideturtle() / ht()הסתרת הצב (מאיץ את הציור).right(angle) / rt(angle)פנייה ימינה במספר מעלות.pensize(width) / widthקביעת עובי הקו.shape("name")שינוי צורת הצב
(למשל: "צב", "עיגול", "חץ" וכו').left(angle) / lt(angle)פנייה שמאלה במספר מעלות.pencolor(color)קביעת צבע קו המתאר (העט).position() / pos()החזרת המיקום הנוכחי (x, y).goto(x, y)
/ setpos(x, y)מעבר לנקודה ספציפית (x, y).fillcolor(color)קביעת צבע המילוי של צורות סגורות.xcor() / ycor()קבלת ערך ה-x או ה-y הנוכחי.setx(x) / sety(y)שינוי רק של קואורדינטת ה-x או ה-y.color(pen, fill)קביעת צבע העט וצבע המילוי בו-זמנית.heading()קבלת הזווית הנוכחית של הצב.setheading(angle) / sethקביעת הזווית המוחלטת של הצבbegin_fill()סימון התחלת צורה שמיועדת למילוי צבע.distance(x, y)חישוב המרחק מהצב לנקודה מסוימת.home()חזרה לנקודה (0, 0) ולכיוון מזרח.end_fill()סיום הצורה ומילוי השטח שנוצר בצבע שנבחר.circle(r, extent)ציור מעגל ברדיוס r
(ניתן לציין זווית כדי לצייר קשת).clear()מחיקת הציורים (הצב נשאר במקומו).dot(size, color)ציור נקודה במקום הנוכחי.reset()מחיקת הציורים והחזרת הצב ל-(0, 0).stamp()החתמת צורת הצב על המסך במיקום הנוכחי.undo()ביטול הפעולה האחרונה.speed(s)קביעת מהירות הציור
(10-0, כש-0 הכי מהיר).

 דוגמאות 
קוד הפייתון הבא משתמש במודול turtle כדי ליצור ספירלת צבעי קשת:import turtle as t

t.shape("turtle")

x = 1
t.speed(10)
colors = ["red", "orange", "yellow", "green", "blue", "purple"]

for i in range(100):
 for i in colors:
 t.forward(x * 0.3)
 t.left(60)
 t.color(i)
 t.right(30.5)
 x = x + 1

קישורים חיצוניים

 חגית כהן ורחל פרלמן, פייתון Turtle, מור טק, המרכז הארצי למורים במקצועות הטכנולוגיים בטכניון



הערות שוליים

קטגוריה:פייתון