Вам нужно использовать масштаб вместо того, чтобы переводить фиксированную величину для каждого пикселя, или она искажается таким образом.

сейчас пытаюсь переместить список точек, используя его центр в качестве ориентира с желаемым смещением. Но у меня проблемы.

Я реализовал текущую функцию:

    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 класс является собственной реализацией, очень похожей на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

Но я получаю эту "толстую форму":

Красные пиксели - это тесты, которые я делаю.

Черные пиксели это форма.

Синие пиксели - это переведенные пиксели.

Но, как вы можете видеть, он не пропорционален оси X / Y.

Я следовал за этим двумя ответами:

Пропорциональный перевод

Учитывая начальную и конечную точку и расстояние, рассчитайте точку вдоль линии

Но в первом ответе мне не хватает класса Matrix на Unity3D.

Итак, я не знаю, что мне не хватает.

Ответы на вопрос(1)

Ваш ответ на вопрос