המרת מתאר צורה ל-GraphicsPath
-
יש לי קוד שנותן רק את נקודות המתאר של כל גוף וכמו שרואים בתמונות המצורפות, השאלה שלי האם יש למישהו רעיון איך אפשר לסדר את הנקודות של המתאר שנתקבלו בצורה שיהיה אפשר להשתמש בהם ב GraphicsPath כלומר אני רוצה לשמור את רשימת הנקודות ולהשתמש בהם שוב במקומות אחרים ע''י GraphicsPath שיצייר לי את הצורה עם הנקודות.
הנה הקוד:
Function Outline_only(ByVal bmp As Bitmap) As Bitmap Dim newbmp As New Bitmap(bmp) For X = 0 To bmp.Width - 1 For Y = 0 To bmp.Height - 1 If bmp.GetPixel(X, Y) <> Color.FromArgb(255, 255, 255) Then Dim p_arr(7) As Point get_8_points(X, Y, p_arr) Dim Is_missing_point As Boolean = False For Each p As Point In p_arr If p.X > -1 AndAlso p.Y > -1 AndAlso _ p.X < bmp.Width AndAlso p.Y < bmp.Height Then If bmp.GetPixel(p.X, p.Y) = Color.FromArgb(255, 255, 255) Then Is_missing_point = True Exit For End If Else Is_missing_point = True Exit For End If Next If Is_missing_point = False Then newbmp.SetPixel(X, Y, Color.FromArgb(255, 255, 255)) End If End If Next Next Return newbmp End Function Private Sub get_8_points(X As Integer, Y As Integer, ByRef arr() As Point) arr(0) = New Point(X - 1, Y) arr(1) = New Point(X + 1, Y) arr(2) = New Point(X, Y - 1) arr(3) = New Point(X, Y + 1) arr(4) = New Point(X - 1, Y - 1) arr(5) = New Point(X + 1, Y + 1) arr(6) = New Point(X - 1, Y + 1) arr(7) = New Point(X + 1, Y - 1) End Sub
תמונה/קובץ מצורף לא נמצא
תמונה/קובץ מצורף לא נמצאפורסם במקור בפורום CODE613 ב22/08/2013 22:23 (+03:00)
-
תמיד טוב לשפר את הביצועים של הקוד, אבל כרגע זה לא קריטי כל כך.
אולי בהמשך אחפש את הספריות שעליהן אתה מדבר.מה שבוער לי כרגע זה לדעת איך אחר שקיבלתי רשימה של כל הנקודות של המתאר אני מסדר אותם אחד אחר השני, ומעביר אותם כארגומנט לציור GraphicsPath? שהרי הGraphicsPath הוא בעצם נקודות שמתוח בינהם קו ישר, ולפי הסדר שהם מסודרות כך סדר הקוים, מנקודה ראשונה לשניה קו, ומשניה לשלישית קו וכו', והבעיה היא שסדר הנקודות שאני מקבל לאחר הלולאה הוא לא מתאים ומתקבלת צורה לא נכונה.
פורסם במקור בפורום CODE613 ב25/08/2013 19:28 (+03:00)
-
לא עברתי על הלולאה.. אבל כיון שאתה ממציא את הגלגל מחדש כמו שהכתיר אותך בתואר זה דוד ל.ט. אנסה לגלגל אותו אתך....
כיון שכנראה אתה עובר על התמונה ואתה בודק אם זה לבן אז עבור לנקודה הבאה אם זה שחור הכנס אותו לזיכרון והמשך לבדוק עד הנקודה הלבנה הבאה וציין אותה גם וכמובן אחד פחות. כך אתה עובר להנאתך שורה שורה. או לחילופין טור אחר טור.
היוצא מזה-- שיש לך רישום לפי פיקסלים. במידה וצדקתי תמשיך לקרא...
לאחר שגמרת לעבור בלולאה. אתה מתחיל מנקודה אקראית ובודק ב8 רוחותיו אם יש נקודה כזאת ברישמה ששמרת בזיכרון במידה ומצאת אותה אתה עובר אליה וגם שם בודק וכמובן מבקש מהקוד שלא לחפש ברוח שממנה באתה וכן הלאה וכן הלאה, וכל זאת כיון שאתה עובד לפי פיקסל שצמוד אחד לשני.
אמנם יכול להיות לך בזה בעיה במידה לדוגמא שיש שלשה נקודות סמוכים בצורת האות "ר" אם תתחיל מהנקודה האמצעית זה יצא משולש במקום "ר" וזה לא בעיה אם אתה לא משנה את היחס כיון שבאמת שלשה נקודות צמודים אפשר לראות אותם גם כמשולש וגם כ-"ר" כי זה הנקודה הכי קטנה ביקום. אבל במידה ותגדיל את היחס שכנראה לכן אתה רוצה להפוך אותו למערך גרפיטי אז יהיה לך שישו ושימחו. ועוד בעיה במידה ויש לך ארבע נקודות סמוכות בצורת הניקוד "ָ" קמץ, אם תתחיל מהראשון ותעבור לשני ולשלישי הנקודה התחתונה לעולם לא תגיע אליה.
אז תצטרך לעשות קוד משוכלל שבודק במידה ומצא יותר מנקודה אחת בטווח של ה-8 רוחות אז הוא מנסה לבדוק אם יש המשך או שזה נקודה בודדת וכו' .
רק אל תשכח להתקשר אליי כשאתה גומר, כיון שבטח עד אז אני כבר יהיה בגיל שלא כל כך זוכרים.....פורסם במקור בפורום CODE613 ב28/08/2013 15:28 (+03:00)
-
השיטה למצוא את נקודות המתאר כלומר את הנקודות הכי חיצוניות באובייקט הן כדלקמן:
עוברים פיקסיל אחר פיקסיל אם הפקסיל הנבדק שחור עושים רשימה של 8 פיקסילים שמסביבו ואז בודקים את הרשימה אם אחד מהשמונה פיקסילים לא שחור הפקסיל הנבדק נכנס לרשימת נקודות המתאר. כי אם כל השמונה פיקסילים המקיפים הם שחורים ברור שהפיקסיל הנבדק אינו בקצה אלא בתוך.כעת מה הבעיה?
והעיקר איך ממירים את רשימת נקודות המתאר לנתיב גרפי?פורסם במקור בפורום CODE613 ב28/08/2013 19:15 (+03:00)
-
עניתי תשובה עכשיו גם על זה והיא נמחקה?!?!?!?!? לתשומת לב המנהלים הקשוחים...
בכל מקרה שאלת שתי שאלות.
- שהפיקסלים אינם לפי הסדר.
- איך ממירים וכו'.
זה שהפיקסלים לא לפי הסדר הפיתרון הוא לא לעבור שורה שורה ולחפש פיקסל ב8 רוחותיו אלא אחרי שקבעת שהנקודה היא נקודת מתאר אתה תחפש בתוך ה-8 את הנקודה הבאה במידה ויש כמה נקודות תואמות תמיד הולכים קודם לרחוקה ותמיד לבדוק אם כבר נכנסה לרשימה אז ללכת לאפשרות השנייה ואם אין אפשרות שנייה אז לבדוק אם מהנקודה הזאת שכבר נכנסה אין עוד נקודות אז הגעת ליעד אם יש אז זה סתם נקודה שצריך לעבור עליה פעמיים בצורות מורכבות מסוימות.
לשאלה השנייה.. לאחר שזה לפי הסדר אני כבר לא צריך להסביר לך איך להמיר כי זה סתם בלולאה פשוטה
פורסם במקור בפורום CODE613 ב28/08/2013 19:40 (+03:00)