2012-08-09 10 views
6

मैं एक काले और सफेद छवियों पिक्सल के एक हस्ताक्षरित दूरी क्षेत्र की गणना करने की कोशिश कर रहा हूं, लेकिन मुझे लगता है कि मैंने कहीं भी अपना कोड गलत पाया है। के रूप में यह मेरा इनपुट और आउटपुट है:एक 2 डी हस्ताक्षरित दूरी क्षेत्र कंप्यूटिंग

इनपुट

Input

आउटपुट

Output

मुद्दा मैं आ रही है एस के बीच में काली रेखा है, मेरे समझने के लिए मुझे विश्वास है कि यह पूरी तरह से हल्का भूरा होना चाहिए?

for (int x = 0; x < source.width; ++x) 
    { 
     for(int y = 0; y < source.height; ++y) 
     { 
      // Get pixel 
      float a = source.GetPixel(x, y).r; 

      // Distance to closest pixel which is the inverse of a 
      // start on float.MaxValue so we can be sure we found something 
      float distance = float.MaxValue; 

      // Search coordinates, x min/max and y min/max 
      int fxMin = Math.Max(x - searchDistance, 0); 
      int fxMax = Math.Min(x + searchDistance, source.width); 
      int fyMin = Math.Max(y - searchDistance, 0); 
      int fyMax = Math.Min(y + searchDistance, source.height); 

      for (int fx = fxMin; fx < fxMax; ++fx) 
      { 
       for (int fy = fyMin; fy < fyMax; ++fy) 
       { 
        // Get pixel to compare to 
        float p = source.GetPixel(fx, fy).r; 

        // If not equal a 
        if (a != p) 
        { 
         // Calculate distance 
         float xd = x - fx; 
         float yd = y - fy; 
         float d = Math.Sqrt((xd * xd) + (yd * yd)); 

         // Compare absolute distance values, and if smaller replace distnace with the new oe 
         if (Math.Abs(d) < Math.Abs(distance)) 
         { 
          distance = d; 
         } 
        } 
       } 
      } 

      // If we found a new distance, otherwise we'll just use A 

      if (distance != float.MaxValue) 
      { 

       // Clamp distance to -/+ 
       distance = Math.Clamp(distance, -searchDistance, +searchDistance); 

       // Convert from -search,+search to 0,+search*2 and then convert to 0.0, 1.0 and invert 
       a = 1f - Math.Clamp((distance + searchDistance)/(searchDistance + searchDistance), 0, 1); 
      } 

      // Write pixel out 
      target.SetPixel(x, y, new Color(a, a, a, 1)); 
     } 
    } 

उत्तर

3

अपने अपराधी इस हालत बयान है:

// If not equal a 
if (a != p) 
{ 

इसका मतलब यह है कि आप केवल करने के लिए एक काले पिक्सेल से कम से कम दूरी पर रुचि रखते हैं

इस कोड मैं का उपयोग कर रहा है एक सफेद पिक्सेल, या यदि 'ए' सफेद है, तो आप निकटतम ब्लैक पिक्सेल की तलाश में हैं।

आपको लगता है कि परीक्षण बदलते हैं तो सिर्फ देखने के लिए:

if (p == white) 
{ 

तो फिर तुम शायद आप क्या अपेक्षा मिल जाएगा।

(मैंने इसका परीक्षण नहीं किया, तो उम्मीद है कि यह सही है)।

(इसके अलावा, अगर यह सही नहीं था, यह अपने Math.Clamp विधि पोस्ट करने के लिए अच्छा होगा, क्योंकि यह गणित कक्षा में पुस्तकालय विधि में एक निर्मित नहीं है।)

एक आखिरी बात, नहीं सुनिश्चित करें कि एल्गोरिदम चाहता है कि आप स्वयं को पिक्सेल की तुलना करें या नहीं, तो आपको उस लूप के लिए अपने घोंसले के भीतर खाते की आवश्यकता हो सकती है।

(मूल रूप से, आप क्या उम्मीद करेंगे उत्पादन बीच में एक सफेद पिक्सेल के साथ एक पूरी तरह से काला छवि के की तरह दिखना चाहिए? बीच पिक्सेल के उत्पादन में काला होना चाहिए, क्योंकि वहाँ आस-पास कोई सफेद पिक्सेल, या यह होना चाहिए सफेद।)