Translating/transforming?从其中心开始的点列表 offset/distance

Translating/transforming? list of points from its center with an offset/distance

好吧,我目前正在尝试使用点的中心作为具有所需偏移量的参考来移动点列表。但是我遇到了问题。

我实现了当前功能:

    public static IEnumerable<Point> Translate(this IEnumerable<Vector2> points, float offset, Vector2 pivot)
    {
        foreach (Vector2 v in points)
        {
            float magnitude = (v - pivot).magnitude;
            Vector2 n = (v - pivot).normalized;

            Vector2 _v = n * (magnitude + offset) + pivot;
            yield return new Point(_v);
        }
    }

注意: Point class 是自己的实现,与 System.Drawing.Point.

非常相似

我计算法线(中心和当前点之间的方向),然后我乘以幅度和偏移量。

我这样称呼它:

        Polygon pol = File.ReadAllText(PolyPath).Deserialize<Polygon>();

        Point[] ps = pol.Vertices.Select(v => (v - pol.Position) + offset).ToArray();

        var textureCenter = new Vector2(tex.Width / 2, tex.Height / 2); // This is 221 / 2 & 137 / 2
        var es_incr = ps.Select(p => (Vector2)p).Translate(effectDistance.x, textureCenter).ToList();

       // Then I draw es_incr using Bresenham algorithm: https://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm

但我明白了 "fat shape":

但如您所见,它在 x/y 轴上不成比例。

我遵循了这两个答案:

Proportional Translation

Given a start and end point, and a distance, calculate a point along a line

但在第一个答案中,我在 Unity3D 上缺少 Matrix class。

所以,我不知道我错过了什么。

您需要使用比例尺而不是为每个像素平移一个固定量,否则它会像那样扭曲。

float avgMagnitude = points.Average(v => ((Vector2)v - pivot).magnitude);
scale = (offset + avgMagnitude) / avgMagnitude;