דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. ארכיון code613m
  4. המרת מתאר צורה ל-GraphicsPath

המרת מתאר צורה ל-GraphicsPath

מתוזמן נעוץ נעול הועבר ארכיון code613m
7 פוסטים 3 כותבים 499 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • רחמיםר מנותק
    רחמיםר מנותק
    רחמים מורחק
    כתב ב נערך לאחרונה על ידי
    #1

    יש לי קוד שנותן רק את נקודות המתאר של כל גוף וכמו שרואים בתמונות המצורפות, השאלה שלי האם יש למישהו רעיון איך אפשר לסדר את הנקודות של המתאר שנתקבלו בצורה שיהיה אפשר להשתמש בהם ב 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)

    תגובה 1 תגובה אחרונה
    0
    • dovidD מנותק
      dovidD מנותק
      dovid ניהול
      כתב ב נערך לאחרונה על ידי
      #2

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

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

      פורסם במקור בפורום CODE613 ב25/08/2013 18:25 (+03:00)

      מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

      בכל נושא אפשר ליצור קשר dovid@tchumim.com

      תגובה 1 תגובה אחרונה
      0
      • רחמיםר מנותק
        רחמיםר מנותק
        רחמים מורחק
        כתב ב נערך לאחרונה על ידי
        #3

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

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

        פורסם במקור בפורום CODE613 ב25/08/2013 19:28 (+03:00)

        תגובה 1 תגובה אחרונה
        0
        • A מנותק
          A מנותק
          ayalaleora
          כתב ב נערך לאחרונה על ידי
          #4

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

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

          היוצא מזה-- שיש לך רישום לפי פיקסלים. במידה וצדקתי תמשיך לקרא...

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

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

          פורסם במקור בפורום CODE613 ב28/08/2013 15:28 (+03:00)

          תגובה 1 תגובה אחרונה
          0
          • רחמיםר מנותק
            רחמיםר מנותק
            רחמים מורחק
            כתב ב נערך לאחרונה על ידי
            #5

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

            כעת מה הבעיה?
            והעיקר איך ממירים את רשימת נקודות המתאר לנתיב גרפי?

            פורסם במקור בפורום CODE613 ב28/08/2013 19:15 (+03:00)

            תגובה 1 תגובה אחרונה
            0
            • A מנותק
              A מנותק
              ayalaleora
              כתב ב נערך לאחרונה על ידי
              #6

              עניתי תשובה עכשיו גם על זה והיא נמחקה?!?!?!?!? לתשומת לב המנהלים הקשוחים...

              בכל מקרה שאלת שתי שאלות.

              1. שהפיקסלים אינם לפי הסדר.
              2. איך ממירים וכו'.

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

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

              פורסם במקור בפורום CODE613 ב28/08/2013 19:40 (+03:00)

              תגובה 1 תגובה אחרונה
              0
              • רחמיםר מנותק
                רחמיםר מנותק
                רחמים מורחק
                כתב ב נערך לאחרונה על ידי
                #7

                אתה יכול להראות איזה קוד לדוגמא ? [לא משנה באיזו שפה.]
                תודה רבה.

                פורסם במקור בפורום CODE613 ב28/08/2013 19:44 (+03:00)

                תגובה 1 תגובה אחרונה
                0

                בא תתחבר לדף היומי!
                • התחברות

                • אין לך חשבון עדיין? הרשמה

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