2012-08-05 7 views
5

पर सेल सह ordinates प्राप्त करने के लिए मुझे एक मधुमक्खी पैटर्न आकर्षित करने और mousemove पर प्रत्येक सेल (पंक्ति, स्तंभ) को पहचानने के लिए है। Honeycomb graph descriptionहनीकॉम पैटर्न

इस प्रकार मैं ग्राफ उत्पन्न कर रहा हूं।

protected override void GenerateGridBitmap() 
    { 
     if (_circleGrid != null) 
     { 
      _circleGrid.Dispose(); 
      _circleGrid = null; 
     } 
     Bitmap _texture = new Bitmap(circleSize, circleSize); 
     using (Graphics g = Graphics.FromImage(_texture)) 
     { 
      g.SmoothingMode = SmoothingMode.HighQuality; 
      g.InterpolationMode = InterpolationMode.HighQualityBicubic; 
      g.PixelOffsetMode = PixelOffsetMode.HighQuality; 
      Rectangle r = new Rectangle(0, 0, circleSize, circleSize); 
      g.DrawEllipse(Pens.Black, r); 
     } 

     Bitmap rowBlock = new Bitmap(CanvasSize.Width - (circleSize/ 2), circleSize); 

     using (Brush b = new TextureBrush(_texture)) 
     { 
      using (Graphics g = Graphics.FromImage(rowBlock)) 
      { 
       g.CompositingQuality = CompositingQuality.HighQuality; 
       g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; 
       g.SmoothingMode = SmoothingMode.HighQuality; 
       g.FillRectangle(b, new Rectangle(new Point(0, 0), rowBlock.Size)); 
      } 
     } 
     //rowBlock.Save("rowblock.bmp"); 
     _circleGrid = new Bitmap(CanvasSize.Width, CanvasSize.Height); 
     using (Graphics g = Graphics.FromImage(_circleGrid)) 
     { 
      g.CompositingQuality = CompositingQuality.HighQuality; 
      g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; 
      g.SmoothingMode = SmoothingMode.HighQuality; 
      int x, y; 
      for (int i = 0; i < rows; i++) 
      { 
       x = 0; 
       if (i % 2 != 0) 
        x = (circleSize/ 2); 

       y = (i * circleSize); 
       if (i != 0) 
       { 
        y -= (VERTICAL_PIXEL_OFFSET * i); 
       } 
       g.DrawImage(rowBlock, x, y); 
       //g.DrawImage(DrawCodedCrystal(i,rowBlock), x, y); 
       Console.WriteLine(i); 
      } 
     } 
     _circleGrid.Save("grid.bmp"); 
     Console.WriteLine(_circleGrid.Size); 
     _texture.Dispose(); 
     _texture = null; 
     rowBlock.Dispose(); 
     rowBlock = null; 
    } 

और यह मैं ग्राफ के निर्देशांक प्राप्त करने के लिए क्या कर रहा हूं। लेकिन समस्या यह है कि मैं कॉलम को पूरी तरह से प्राप्त करने में सक्षम हूं। लेकिन पंक्ति के लिए मुझे लगता है कि गणना में एक छोटा सा अंतर है। उदाहरण के लिए। 99 पंक्ति पर, (1/4) सर्कल के लिए यह {पंक्ति 98} कहता है और शेष चक्र के लिए यह {पंक्ति 99} कहता है। पंक्तियों की संख्या बढ़ने के कारण विचलन बढ़ता है।

protected override CanvasCell GetCanvasCellAt(int x, int y) 
    { 

     Rectangle rect = GetImageViewPort(); 
     Point pt = new Point(x, y); 

     CanvasCell c = new CanvasCell() { Row = -1, Column = -1 }; 
     if (rect.Contains(pt)) 
     { 
      double zoomedCircleSize = CircleSize * ZoomFactor; 
      Point p = pt;// PointToClient(new Point(x, y)); 
      p.X -= (int)(rect.X + (AutoScrollPosition.X)); 
      p.Y -= (int)(rect.Y + (AutoScrollPosition.Y)); 

      int row = (int)((p.Y)/(zoomedCircleSize)); 
      //row = (int)((p.Y + (row * ZoomFactor))/zoomedCircleSize); 
      int col; 
      if (row % 2 != 0) 
      { 
       if (p.X >= 0 && p.X < (zoomedCircleSize/2)) 
       { 
        col = -1; 
       } 
       else 
        col = (int)((p.X - (zoomedCircleSize/2))/zoomedCircleSize); 
      } 
      else 
      { 
       if (p.X > (zoomedCircleSize * cols)) 
       { 
        col = -1; 
       } 
       else 
       { 
        col = (int)((p.X)/zoomedCircleSize); 

       } 
      } 
      //if (!GetRectangle(row, col).ContainsWithInBoundingCircle(p)) 
      //{ 
      // c.Column = -1; 
      // c.Row = -1; 
      //} 
      //else 
      { 
       c.Column = col; 
       c.Row = row; 
      } 
     } 
     // 

     return c; 
    } 

आशा है कि मैं अपनी समस्या को समझाने में स्पष्ट था।

संपादित करें: VERTICAL_PIXEL_OFFSET 1 और मंडली का आकार 16

+0

शायद ऐसा इसलिए है क्योंकि आप बिटमैप्स के साथ काम कर रहे हैं। आप व्यक्तिगत रूप से मंडलियों को आकर्षित कर सकते हैं जो सटीकता के साथ मदद कर सकते हैं। – usr

+0

@usr हो सकता है, लेकिन जिस ग्रिड पर मैं काम कर रहा हूं, 500 पंक्तियों और 500 कॉलम (250000 सर्किल) तक हो सकता है, क्या वह कई सर्किलों की सूची बनाए रखने के लिए बहुत अधिक ओवरहेड नहीं होगा और एक के माध्यम से एक MouseMove? –

+0

'पंक्ति' की गणना 'zoomedCircleSize' द्वारा विभाजित के साथ की जाती है जो' डबल 'है, लेकिन परिणाम को वापस' int' में परिवर्तित कर दिया जाता है। आप शायद यहां कुछ सटीकता खो रहे हैं। – Slagh

उत्तर

2

मैं भी MSDN पर इस पोस्ट, स्टीफन हॉफमन कि कैसे करना है की एक SSCCE पोस्ट करने के लिए तरह पर्याप्त था है। असल में विचार हनीकॉम को पूर्ववत करना था, क्योंकि @usr ने टिप्पणी अनुभाग में सुझाव दिया था। यहां MSDN पोस्ट का लिंक है।

0

एक त्वरित अवलोकन: क्या आपको मंडलियों का उपयोग करना है - क्या हेक्सगोन समस्या को सरल बनाते हैं?

+0

हाँ मुझे मंडलियों का उपयोग करना है। –

संबंधित मुद्दे