using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Drawing.Drawing2D;
namespace 局部坐标
{
/// <summary>
/// Form1 的摘要说明。
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;
public Form1()
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();
//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
}
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows Form Designer generated code
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(704, 454);
this.Name = "Form1";
this.Text = "Form1";
}
#endregion
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
protected override void OnPaint(PaintEventArgs e)
{
Graphics g = e.Graphics;
//把客户区设置为白色
g.FillRectangle(Brushes.White, this.ClientRectangle);
//定义相对于X轴镜像的转换矩阵,使得Y轴朝上
Matrix mat=new Matrix(1, 0, 0, -1, 0, 0);
g.Transform = mat;
//将坐标原点移动到屏幕中心
Rectangle rect= this.ClientRectangle;
int w = rect.Width;
int h= rect.Height;
g.TranslateTransform(w / 2, -h / 2);
//在全局坐标下绘制椭圆
g.DrawEllipse(Pens.Red, -100, -100, 200, 200);
g.FillRectangle(Brushes.Black, 100 - 2, 0 + 2, 4, 4);
g.DrawRectangle(Pens.Blue, 0 - 2, -100 + 2, 4, 4);
g.DrawRectangle(Pens.Blue, -100 - 2, 0 + 2, 4, 4);
g.DrawRectangle(Pens.Blue, 0 - 2, 100 + 2, 4, 4);
//创建一个椭圆,然后在局部坐标系中进行几何变换
GraphicsPath gp=new GraphicsPath();
gp.AddEllipse(-100, -100, 200, 200);
Matrix mat2=new Matrix();
//平移变换
mat2.Translate(150, 150);
//旋转变换,缺省时按顺时针方向旋转
mat2.Rotate(30);
gp.Transform(mat2);
g.DrawPath(Pens.Blue, gp);
PointF[] p= gp.PathPoints;
g.FillRectangle(Brushes.Black, p[0].X - 2, p[0].Y + 2, 4, 4);
g.DrawRectangle(Pens.Blue, p[3].X - 2, p[3].Y + 2, 4, 4);
g.DrawRectangle(Pens.Blue, p[6].X - 2, p[6].Y + 2, 4, 4);
g.DrawRectangle(Pens.Blue, p[9].X - 2, p[9].Y + 2, 4, 4);
gp.Dispose();
}
}
}