2 回答

TA貢獻1801條經驗 獲得超16個贊
有了GraphicsPath,您可以使用以下方法來鏡像路徑:
GraphicsPath MirrorLeft(GraphicsPath path)
{
var r = path.GetBounds();
var p = (GraphicsPath)path.Clone();
p.Transform(new Matrix(-1, 0, 0, 1, 2 * r.Left, 0));
return p;
}
GraphicsPath MirrorRight(GraphicsPath path)
{
var r = path.GetBounds();
var p = (GraphicsPath)path.Clone();
p.Transform(new Matrix(-1, 0, 0, 1, 2 * (r.Left + r.Width), 0));
return p;
}
MirrorLeft,以路徑左側為軸鏡像路徑,以路徑MirrorRight右側為軸。
下圖中,紅色弧線為原圖,綠色為左鏡,藍色為鏡右:
這里是上面輸出的代碼:
protected override void OnPaint(PaintEventArgs e)
{
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
using (var path1 = new GraphicsPath())
{
path1.AddArc(new Rectangle(100, 100, 200, 200), -90, 90);
using (var pen1 = new Pen(Color.Red, 3))
e.Graphics.DrawPath(pen1, path1);
using (var path2 = MirrorLeft(path1))
using (var pen2 = new Pen(Color.Green, 3))
e.Graphics.DrawPath(pen2, path2);
using (var path3 = MirrorRight(path1))
using (var pen3 = new Pen(Color.Blue, 3))
e.Graphics.DrawPath(pen3, path3);
}
base.OnPaint(e);
}

TA貢獻1833條經驗 獲得超4個贊
您可以簡單地翻轉Graphics對象:
e.Graphics.DrawLines(Pens.Black, pointList.ToArray());
e.Graphics.ScaleTransform(-1, 1);
// you need to know at which x value the flipping axis should be!
e.Graphics.TranslateTransform(..., 0);
e.Graphics.DrawLines(Pens.Red, pointList.ToArray());
請注意,您需要知道要翻轉的位置(鏡像軸)。對于您顯示的效果,您需要向右移動圖形左邊緣(最小值)的兩倍..:
int xmin = pointList.Min(x => x.X);
int xmax = pointList.Max(x => x.X);
e.Graphics.TranslateTransform(xmin * 2, 0);
另請注意,除非您相應地移動 Graphics 對象,否則Graphics
只能顯示正值。所以沒有TranslateTransform
你的數字將永遠不會顯示。(我已經為演示更改了它們。)
另請注意,應始終繪制連接Graphics.DrawLines
線,否則連接將因筆寬較大和/或半透明顏色而變得混亂。
正如 Jimi 所指出的,如果您想繼續繪圖,您將需要e.Graphics.ResetTransform();
在翻轉之后執行 a,或者,如果您已經通過將畫布轉換為正域來準備整個繪圖,則恢復它在翻轉之前的狀態。對于第一個存儲狀態:
var state = e.Graphics.Save();
然后恢復它:
e.Graphics.Restore(state);
請注意,您需要注意這兩個命令需要一對一匹配!
- 2 回答
- 0 關注
- 130 瀏覽
添加回答
舉報