पर सेल सह ordinates प्राप्त करने के लिए मुझे एक मधुमक्खी पैटर्न आकर्षित करने और mousemove पर प्रत्येक सेल (पंक्ति, स्तंभ) को पहचानने के लिए है। हनीकॉम पैटर्न
इस प्रकार मैं ग्राफ उत्पन्न कर रहा हूं।
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
शायद ऐसा इसलिए है क्योंकि आप बिटमैप्स के साथ काम कर रहे हैं। आप व्यक्तिगत रूप से मंडलियों को आकर्षित कर सकते हैं जो सटीकता के साथ मदद कर सकते हैं। – usr
@usr हो सकता है, लेकिन जिस ग्रिड पर मैं काम कर रहा हूं, 500 पंक्तियों और 500 कॉलम (250000 सर्किल) तक हो सकता है, क्या वह कई सर्किलों की सूची बनाए रखने के लिए बहुत अधिक ओवरहेड नहीं होगा और एक के माध्यम से एक MouseMove? –
'पंक्ति' की गणना 'zoomedCircleSize' द्वारा विभाजित के साथ की जाती है जो' डबल 'है, लेकिन परिणाम को वापस' int' में परिवर्तित कर दिया जाता है। आप शायद यहां कुछ सटीकता खो रहे हैं। – Slagh