2

问题:在保持多边形质心的同时,将 n 个像素缓冲区添加到现有多边形(保证是闭合的、不重叠的和顺时针方向的点)。

当前:我有一个包含 System.Drawing Path 和 System.Drawing Region 的 PolyRegion 类。当我实例化该类时,我会将因子缓冲区添加到路径并缩放/转换它。如果相对于质心进行缩放,则结果会发生偏移。

示例:绿色多边形是原始多边形。当我将其缩放 n 倍时,我得到/想要紫色多边形(以质心为中心)。

在此处输入图像描述

问题:如何相对于质心进行缩放?我最好缩放点数组中的每个点还是缩放路径/区域?

代码:

public PolyRegion(Int32 Id, List<Point> Points)
{
    this.Id = Id;
    this.Points = Points;
    this.Path = this.CreatePath();

    float factor = 10;
    float wScale = (float)((this.Path.GetBounds().Width - factor) / this.Path.GetBounds().Width);
    float hScale = (float)((this.Path.GetBounds().Height - factor) / this.Path.GetBounds().Height);
    Matrix transformMatrix = new Matrix();
    transformMatrix.Scale(wScale, hScale);
    this.Path.Transform(transformMatrix);

    this.Region = new Region(this.Path);
    this.Area = CalculateArea();  
}
4

2 回答 2

0

这更像是一个数学/几何问题而不是编程问题:

1) 将图形从质心位置 (x, y) 平移到 (0,0) 坐标

2)按您想要的因素进行扩展。

3) 平移回原始质心。

于 2013-12-03T17:07:48.367 回答
0

我决定放弃矩阵和区域比例和变换,采用更纯粹的方法。

首先我计算我的 polgon 的质心:

private Point GetCentroid()
{
int centroidX = 0;
int centroidY = 0;
int pointCount = this.Points.Count();

for (int i = 0; i < pointCount; i++)
{
centroidX = centroidX + this.Points[i].X;
centroidY = centroidY + this.Points[i].Y;
}

centroidX = centroidX / pointCount;
centroidY = centroidY / pointCount;

return new Point(centroidX, centroidY);
}

然后循环遍历每个点并按 S 和 T 缓冲它(我的缓冲因子):

private List<Point> GetBufferedPoints()
{
int c = this.Centroid.X;
int d = this.Centroid.Y;
int s = this.BufferFactor;
int t = this.BufferFactor;
int pointCount = this.Points.Count();
PointsBuffered = new List<Point>();

for (int i = 0; i < pointCount; i++)
{
int x = this.Points[i].X;
int y = this.Points[i].Y;
PointsBuffered.Add(new Point((s * (x - c)) + c, (t * (y - d)) + d));
}

return PointsBuffered;
}

结果:

在此处输入图像描述

于 2013-12-04T19:32:20.150 回答