这里是你如何能做到的,但要注意与真正棘手的形状不会有一个空间,包含文本,或者即使有可能比较难找..
你已经知道如何确定文本适合的大小。
我们接下来需要的是一个测试,看看我们的边界矩形是否包含在多边形中。
这里是一个,这使得使用GraphicsPaths
和Regions
..:
static bool PathContainsRect(GraphicsPath gp, RectangleF rect, Graphics g)
{
Region rPath0 = new Region(gp);
Region rPath1 = new Region(gp);
Region rRect = new Region(rect);
rPath1.Union(rRect);
rPath1.Exclude(rPath0);
return rPath1.IsEmpty(g);
}
您需要在您要使用的绘图Graphics
对象养活。
接下来你需要一些算法来找到要测试的点。最好的选择取决于你的多边形。
下面是一个简单的例子:它从中心开始,沿着四个方向分步移动:左上,右上,右下,底部。如果要添加其他4个方向或忽略了一些应该是简单的适应..:
static Point NearestCenterLocation(GraphicsPath gp, Size sz, Graphics g, int step)
{
RectangleF rB = gp.GetBounds();
Point center = new Point((int)(rB.Left + rB.Width/2f - sz.Width/2),
(int)(rB.Top + rB.Height /2f - sz.Height/ 2));
Point ncTL = center; Point ncBR = center;
Point ncT = center; Point ncB = center;
RectangleF nTLRect = new RectangleF(center, sz);
RectangleF nBRRect = new RectangleF(center, sz);
RectangleF nTRect = new RectangleF(center, sz);
RectangleF nBRect = new RectangleF(center, sz);
Point hit = Point.Empty;
do
{
ncTL.Offset(-step, -step);
ncBR.Offset(step, step);
ncT.Offset(-step, 0);
ncB.Offset(step, 0);
nTLRect = new RectangleF(ncTL, sz);
nBRRect = new RectangleF(ncBR, sz);
nTRect = new RectangleF(ncT, sz);
nBRect = new RectangleF(ncB, sz);
hit = (PathContainsRect(gp, nTLRect, g) && ncTL.X > 0) ? ncTL : hit;
hit = (PathContainsRect(gp, nBRRect, g)) ? ncBR : hit;
hit = (PathContainsRect(gp, nTRect, g)) ? ncT : hit;
hit = (PathContainsRect(gp, nBRect, g)) ? ncB : hit;
g.DrawRectangle(Pens.Green, Rectangle.Round(nTLRect)); // test only
g.DrawRectangle(Pens.Blue, Rectangle.Round(nBRRect)); // test only
g.DrawRectangle(Pens.Cyan, Rectangle.Round(nTRect)); // test only
g.DrawRectangle(Pens.Khaki, Rectangle.Round(nBRect)); // test only
} while (hit == Point.Empty);
g.DrawRectangle(Pens.Tomato, new Rectangle(center, sz)); // test only
return hit;
}
它包含图纸要求,以显示它如何在搜索四个方向,直到它找到的第一个打击。中心和结果Rectangles
呈红色。
这是创建测试台代码:
Size sz = new Size(70, 35);
GraphicsPath gp1 = new GraphicsPath();
gp1.FillMode = FillMode.Winding;
gp1.AddRectangle(new Rectangle(0, 0, 350, 120));
gp1.AddRectangle(new Rectangle(0, 0, 120, 300));
gp1.AddRectangle(new Rectangle(250, 0, 100, 300));
Point px = NearestCenterLocation(gp1, sz, g , 10);
using (SolidBrush brush = new SolidBrush(Color.FromArgb(66, Color.Gold)))
g.FillPath(brush, gp1);
g.DrawRectangle(Pens.Tomato, new Rectangle(px, sz));
当然,你可能要向下搜索只在第一个,然后向上,再向左,再向右,然后或从不对角等。
你想在哪里绘制你的字符串?多边形内部或外部?...居中或沿着边缘?给我们一些关于如何计算点和/或绘制多边形的代码,然后解释或模拟如何绘制字符串。移动和旋转图形表面非常简单,以便您的字符串与多边形对齐;我们只需要更多的细节。 –
嗨,我编辑了我的原始文章,以显示我迄今为止所做的工作。我想要将字符串绘制在多边形的中心内部。 – Gene
简单:将文本放置在中心位于多边形边界框的中心。直截了当:将文本的质心置于多边形的质心。真的很难:把文本放到距离所有边缘均匀且最大化的地方。 –