我正在繪制一個使用圖形變換旋轉的影像,但我無法獲得旋轉影像的位置和大小。
繪畫事件:
graphics.TranslateTransform(BaseX, BaseY);
graphics.RotateTransform((float)Rotation);
graphics.DrawImage(Image, X - BaseX, Y - BaseY, Image.Width, Image.Height);
ToRectangle 方法:
public Rectangle ToRotatedRectangle() {
// Code here to rotate X, Y, Image.Width and Image.Height values
return new Rectangle(rotatedX, rotatedY, rotatedWidth, rotatedHeight);
}
我看過其他幾個可以獲得旋轉大小的帖子,但沒有一個包含 X 和 Y 值。我曾嘗試單獨旋轉它們,但位置不正確。
uj5u.com熱心網友回復:
注意:'graphics.RotateTransform(X)' 將影像順時針旋轉 X度,而 'Math.Cos(X)' 和 'Math.Sin(X)' 基于 X弧度計算。
根據您的平移/旋轉,我們可以使用 trig 計算 sin 和 cos 值。
graphics.TranslateTransform(BaseX, BaseY);
graphics.RotateTransform((float)Rotation);
...
var sin = Math.Sin(Rotation * Math.PI / 180.0);
var cos = Math.Cos(Rotation * Math.PI / 180.0);
使用線性代數將得到的圖形矩陣乘以任何給定的 (X,Y),如下所示
// (X, Y) =>
// | cos -sin BaseX | | X | | X*cos-Y*sin BaseX |
// | sin cos BaseY | | Y | = | X*sin Y*cos BaseY |
// | 0 0 1 | | 1 | | 1 |
// => (X*cos-Y*sin BaseX, X*sin Y*cos BaseY)
圖形上繪制的 4 個角點是:
var (x1, y1) = (X-BaseX, Y-BaseY);
var (x2, y2) = (X-BaseX Image.Width, Y-BaseY);
var (x3, y3) = (X-BaseX, Y-BaseY Image.Height);
var (x4, y4) = (X-BaseX Image.Width, Y-BaseY Image.Height);
因此,在平移/旋轉之后,它們變成
var (X1, Y1) = (cos*(X-BaseX)-sin*(Y-BaseY) BaseX, sin*(X-BaseX) cos*(Y-BaseY) BaseY);
var (X2, Y2) = (cos*(X-BaseX Image.Width)-sin*(Y-BaseY) BaseX, sin*(X-BaseX Image.Width) cos*(Y-BaseY) BaseY);
var (X3, Y3) = (cos*(X-BaseX)-sin*(Y-BaseY Image.Height) BaseX, sin*(X-BaseX) cos*(Y-BaseY Image.Height) BaseY);
var (X4, Y4) = (cos*(X-BaseX Image.Width)-sin*(Y-BaseY Image.Height) BaseX, sin*(X-BaseX Image.Width) cos*(Y-BaseY Image.Height) BaseY);
要獲得左上角,您需要每個 X 和 Y 值中的最小值。寬度和高度將是最大和最小 X 和 Y 之間的差異,可以簡化如下所示。
var (X, Y) = (Math.Min(Math.Min(X1, X2), Math.Min(X3, X4)), Math.Min(Math.Min(Y1, Y2), Math.Min(Y3, Y4)));
var (Width, Height) = (Math.Abs(cos*Image.Width) Math.Abs(sin*Image.Height), Math.Abs(sin*Image.Width) Math.Abs(cos*Image.Height));
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/510008.html
標籤:C#表格系统绘图
上一篇:如何在ComboBoxWindows表單中獲得價值?C#
下一篇:僅父滾動條(無子滾動條)
