С точки зрения API это очень широкий вопрос. Все API, связанные с графикой, имеют преобразования. То же самое относится и к классам в пространстве имен System.Numerics , которые используются в основном в операциях SIMD. В терминах геометрии ответ ясен, вам нужно применить правильное преобразование ко всем точкам. В данном конкретном случае это отражение .
Некоторые API напрямую поддерживают отражение, например Vector2.Reflect :
var points=new[]{
new Vector2(0,0),
new Vector2(30,0),
new Vector2(30,-100),
new Vector2(0,-100),
};
var reflect_y=new Vector2(1,0);
var reflected = points.Select(p=>Vector2.Reflect(p,reflect_y))
.ToArray();
Распечатка отраженных точек дает:
0, 0
-30, 0
-30, -100
0, -100
В других случаях можно вычислить матрицу преобразования и умножить на нее каждую точку:
![Reflection Matrix](https://i.stack.imgur.com/D7qzl.gif)
Эта статья объясняет математику и показывает значения, которые нужно использовать для отражения по осям X, Y или обоим. В этом случае желаемая матрица:
![Reflect Y](https://i.stack.imgur.com/VhSOf.gif)
Преобразования в компьютерной графике применяются в виде матриц 3х2, где в третьем столбце применяется транспонирование вдоль каждой оси. В этом случае мы не хотим перемещать результат, поэтому третий столбец содержит 0.
![enter image description here](https://i.stack.imgur.com/kJGyu.gif)
На этот раз Vector2.Transform используется вместо Reflect
:
var reflect_y=new Matrix3x2(-1,0,0,1,0,0);
var reflected = ( from point in points
select Vector2.Transform(point,reflect_y)
).ToArray();
В GDI + преобразование представляется объектом Matrix . Отражение недоступно, но его можно заменить на Matrix.Scale , если мы хотим отразить только по осям X или Y. Например:
var m=new Matrix();
m.Scale(1,-1);
m.TransformVectors(points);
Отражает массив точек, умножая все значения X на 1 и все значения Y на -1.