我使用矩陣放大了圖形路徑。我怎麼能設定新的路徑恰好在較小的路徑上,而不在它的旁邊?像長方形的充氣。矩陣和圖形路徑
Q
矩陣和圖形路徑
0
A
回答
1
GraphicsPath的核心是一些帶有控制點的點,指定如何混合這些點(當應用拉伸時)。當您將矩陣運算應用於圖形路徑時,它會根據您在矩陣中執行的操作更新所有這些點。
考慮到這一點,如果我理解正確的問題,你可以通過獲取圖形路徑的界限開始:
var graphicsBounds = myPath.GetBounds();
從那裏,你可以創建抵消在爲中心的界限的矩陣(0 ,0),縮放(可以在x/y方向上縮放),然後偏移回屏幕上的原始位置。這應該在原始邊界的中心對稱地擴展路徑。該矩陣代碼看起來像這樣:
Matrix myMatrix = new Matrix();
myMatrix.TranslateTransform(graphicsBounds.X + graphicsBounds.Width/2.0f, graphicsBounds.Y + graphicsBounds.Height/2.0f);
myMatrix.Scale(scaleX, scaleY);
myMatrix.TranslateTransform(-graphicsBounds.X - graphicsBounds.Width/2.0f, -graphicsBounds.Y - graphicsBounds.Height/2.0f);
還記得 - 矩陣順序(默認)應用於相反。所以你應該從下到上閱讀這些矩陣操作。這可能不完全正確,但至少應該有所幫助。祝你好運!
0
這我如何使用變換
在這種情況下,代碼放在pictureBox1的Paint事件適合圖形成boundning rectange。發送包含在GraphicsPath中的圖形的邊界並將界限映射到用戶函數GetMatrixFitRectInBounds()的矩陣返回,以在繪製之前應用於picturebox的Graphics.Transform屬性。
這說明使用矩陣進行改造的總體思路:
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
//GraphicsPath is a great to store for graphics if repainted frequently
var myPath = new GraphicsPath();
//Add simple ellipse
myPath.AddEllipse(new Rectangle(0, 0, 50, 50));
//Get transform to fit a rectange within a bounding rectange
var T = GetMatrixFitRectInBounds(myPath.GetBounds(), new RectangleF(pictureBox1.ClientRectangle.Location, pictureBox1.ClientRectangle.Size));
//Apply transformation matrix
e.Graphics.Transform = T;
// Create a pen for the path
Pen myPen = new Pen(Color.Black, 1);
//Draw path to picturebox
e.Graphics.DrawPath(myPen, myPath);
}
-
//Return Matrix to scale a rectange within a rectangle
private Matrix GetMatrixFitRectInBounds(RectangleF fitrect, RectangleF boundsrect)
{
var T = new Matrix();
var bounds_center = new PointF(boundsrect.Width/2, boundsrect.Height/2);
//Set translation centerpoint
T.Translate(bounds_center.X, bounds_center.Y);
//Get smallest size to scale to fit boundsrect
float scale = Math.Min(boundsrect.Width/fitrect.Width, boundsrect.Height/fitrect.Height);
T.Scale(scale, scale);
//Move fitrect to center of boundsrect
T.Translate(bounds_center.X - fitrect.X - fitrect.Width/2f, bounds_center.Y - fitrect.Y - fitrect.Height/2f);
//Restore translation point
T.Translate(-bounds_center.X, -bounds_center.Y);
return T;
}
結果:
由於有可能大量的計算涉及在創建矩陣時,它可能是kep t在繪畫之外並且僅在邊界改變時創建。 GraphicPath也可以在Paint事件之外創建,並且只有在底層數據發生變化時纔會更新。
相關問題
- 1. IronPython:創建圖形路徑並將點陣添加到圖形路徑
- 2. SVG矩陣到Android圖形矩陣
- 3. C#路徑中的半圓形矩形
- 4. SVG - 沿着路徑的動畫矩形;矩形中心總是在路徑上
- 5. 從鄰接矩陣計算路徑矩陣
- 6. 矩陣圖形表示 - java
- 7. 查找矩陣中的最短路徑
- 8. 查找最長遞增路徑矩陣
- 9. 查找矩陣中是否有路徑?
- 10. 在鄰接矩陣中尋找路徑
- 11. 矩陣中的最短路徑
- 12. 矩陣中的最短路徑與作弊路徑的障礙
- 13. 用於矩形貼圖的U矩陣
- 14. 如何在給定開始和結束時創建矩形路徑矩形
- 15. 路徑上的矩形碰撞檢測
- 16. 矩形中包含的XNA Vector2路徑
- 17. 圖形數據庫和歐拉路徑
- 18. 矩形矩陣和標註數據點的表面圖
- 19. 定向圖鄰接矩陣尋找路徑
- 20. 遞歸查找圖矩陣DFS中的所有路徑DFS
- 21. RLE尋找矩陣矩形
- 22. 查找2D矩陣中的路徑和內部字段
- 23. 圓形視圖路徑
- 24. Android圖形路徑()消失
- 25. 如何在草圖中從矩形中減去矢量路徑
- 26. 以矩陣形式獲得矩陣行
- 27. 從矩陣生成的矩陣與Matlab生成的Python圖形
- 28. 在圖像/矩陣中創建隨機白色矩形/陣列
- 29. 矢量和矩陣如何處理計算機圖形,如矩陣旋轉?
- 30. 轉換工作不同路徑和矩形
注意縮放也會縮放線寬。爲了保持原始筆的寬度,可以在繪製縮放的圖形之前通過反比例縮放筆寬來取消它,如下所示:'Pen myPen = new Pen(Color.Blue,linewidth/scale)'。 – flodis