2012-08-05 43 views
5

Tôi phải vẽ một mẫu tổ ong và nhận ra từng ô (hàng, cột) trên mousemove. Honeycomb graph descriptionNhận tọa độ của ô trên mẫu Honeycomb

đây là cách tôi tạo biểu đồ.

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; 
    } 

và điều này tôi đang làm để có được tọa độ của biểu đồ. nhưng vấn đề là tôi có thể lấy cột hoàn hảo. nhưng đối với hàng tôi nghĩ rằng có một sự khác biệt nhỏ trong tính toán. cho ví dụ. trên hàng 99, cho vòng tròn (1/4) nó nói {row 98} và cho vòng tròn còn lại nó nói {row 99}. độ lệch tăng khi số hàng tăng lên.

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; 
    } 

hy vọng tôi đã giải thích rõ vấn đề của mình.

EDIT: các VERTICAL_PIXEL_OFFSET là 1 và kích thước vòng tròn là 16

+0

Có thể vì bạn đang làm việc với bitmap. Bạn có thể vẽ các vòng tròn riêng lẻ có thể giúp với độ chính xác. – usr

+0

@usr có thể, nhưng lưới tôi sẽ làm việc trên, có thể tối đa 500 hàng và 500 cột (250000 vòng tròn), sẽ không quá nhiều chi phí để duy trì danh sách nhiều vòng kết nối đó và lặp qua chúng để có được mousemove? –

+0

'row' được tính bằng cách chia cho' zoomedCircleSize' là 'double', nhưng kết quả được chuyển đổi thành' int'. Bạn có thể mất một số độ chính xác ở đây. – Slagh

Trả lời

2

Tôi cũng đăng này trên MSDN, Stefan Hoffmann đã được loại, đủ để gửi một SSCCE làm thế nào để làm điều đó. Về cơ bản, ý tưởng là tính toán trước các honeycombs, như @usr được đề xuất trong phần bình luận. Đây là liên kết đến MSDN bài đăng.

0

Quan sát nhanh: bạn có phải sử dụng vòng kết nối - hình lục giác sẽ đơn giản hóa sự cố không?

+0

vâng tôi phải sử dụng vòng kết nối. –

Các vấn đề liên quan