yangyin
2024-08-20 98e49c0dd42840a094837f7acae532bc237a719a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
namespace Yw.WinFrmUI.HydroL2d
{
    /// <summary>
    /// 坐标
    /// </summary>
    public class Coordinate
    {
        /// <summary>
        /// 唯一构造函数(内部计算)
        /// </summary>
        /// <param name="origin">旋转中心点</param>
        /// <param name="angle">旋转角度(顺时针)</param>
        /// <param name="size">尺寸</param>
        /// <param name="horiz">水平定位方式</param>
        /// <param name="veriz">垂直定位方式</param>
        public Coordinate
            (
                PointF origin,
                float angle,
                SizeF size,
                StringAlignment horiz = StringAlignment.Near,
                StringAlignment veriz = StringAlignment.Near
            )
        {
            _origin = origin;
            _angle = angle;
            _size = size;
            _horizAlignment = horiz;
            _vertiAlignment = veriz;
 
            //原始左上角坐标
            _beforeLeftTop = PointF.Empty;
            switch (horiz)
            {
                case StringAlignment.Near: _beforeLeftTop.X = _origin.X; break;
                case StringAlignment.Center: _beforeLeftTop.X = _origin.X - _size.Width / 2f; break;
                case StringAlignment.Far: _beforeLeftTop.X = _origin.X - _size.Width; break;
                default: break;
            }
            switch (veriz)
            {
                case StringAlignment.Near: _beforeLeftTop.Y = _origin.Y; break;
                case StringAlignment.Center: _beforeLeftTop.Y = _origin.Y - _size.Height / 2f; break;
                case StringAlignment.Far: _beforeLeftTop.Y = _origin.Y - _size.Height; break;
                default: break;
            }
            _beforeRectf = new RectangleF(_beforeLeftTop, _size);
 
            _beforeRightTop = new PointF(_beforeLeftTop.X + _size.Width, _beforeLeftTop.Y);
            _beforeLeftBottom = new PointF(_beforeLeftTop.X, _beforeLeftTop.Y + _size.Height);
            _beforeRightBottom = new PointF(_beforeRightTop.X, _beforeLeftBottom.Y);
 
            _afterLeftTop = _origin.RotatePointF(_beforeLeftTop, _angle);
            _afterRightTop = _origin.RotatePointF(_beforeRightTop, _angle);
            _afterLeftBottom = _origin.RotatePointF(_beforeLeftBottom, _angle);
            _afterRightBottom = _origin.RotatePointF(_beforeRightBottom, _angle);
        }
 
 
 
        /// <summary>
        /// 旋转中心点
        /// </summary>
        public PointF Origin
        {
            get { return _origin; }
            private set { _origin = value; }
        }
        private PointF _origin;
 
        /// <summary>
        /// 旋转角度
        /// </summary>
        public float Angle
        {
            get { return _angle; }
            private set { _angle = value; }
        }
        private float _angle;
 
        /// <summary>
        /// 尺寸
        /// </summary>
        public SizeF Size
        {
            get { return _size; }
            private set { _size = value; }
        }
        private SizeF _size;
 
        /// <summary>
        /// 水平方向
        /// </summary>
        public StringAlignment HorizAlignment
        {
            get { return _horizAlignment; }
            private set { _horizAlignment = value; }
        }
        private StringAlignment _horizAlignment;
 
        /// <summary>
        /// 垂直方向
        /// </summary>
        public StringAlignment VertiAlignment
        {
            get { return _vertiAlignment; }
            private set { _vertiAlignment = value; }
        }
        private StringAlignment _vertiAlignment;
 
        /// <summary>
        /// 旋转之前的矩形
        /// </summary>
        public RectangleF BeforeRectf
        {
            get { return _beforeRectf; }
            private set { _beforeRectf = value; }
        }
        private RectangleF _beforeRectf;
 
        /// <summary>
        /// 旋转之前左上角点坐标
        /// </summary>
        public PointF BeforeLeftTop
        {
            get { return _beforeLeftTop; }
            private set { _beforeLeftTop = value; }
        }
        private PointF _beforeLeftTop;
 
        /// <summary>
        /// 旋转之前右上点坐标
        /// </summary>
        public PointF BeforeRightTop
        {
            get { return _beforeRightTop; }
            private set { _beforeRightTop = value; }
        }
        private PointF _beforeRightTop;
 
        /// <summary>
        /// 旋转之前左下角点坐标
        /// </summary>
        public PointF BeforeLeftBottom
        {
            get { return _beforeLeftBottom; }
            private set { _beforeLeftBottom = value; }
        }
        private PointF _beforeLeftBottom;
 
        /// <summary>
        /// 旋转之前右下角坐标
        /// </summary>
        public PointF BeforeRightBottom
        {
            get { return _beforeRightBottom; }
            private set { _beforeRightBottom = value; }
        }
        private PointF _beforeRightBottom;
 
        /// <summary>
        /// 旋转之后左上角点坐标
        /// </summary>
        public PointF AfterLeftTop
        {
            get { return _afterLeftTop; }
            private set { _afterLeftTop = value; }
        }
        private PointF _afterLeftTop;
 
        /// <summary>
        /// 旋转之后右上角坐标
        /// </summary>
        public PointF AfterRightTop
        {
            get { return _afterRightTop; }
            private set { _afterRightTop = value; }
        }
        private PointF _afterRightTop;
 
        /// <summary>
        /// 旋转之后左下角
        /// </summary>
        public PointF AfterLeftBottom
        {
            get { return _afterLeftBottom; }
            private set { _afterLeftBottom = value; }
        }
        private PointF _afterLeftBottom;
 
        /// <summary>
        /// 旋转之后右下角
        /// </summary>
        public PointF AfterRightBottom
        {
            get { return _afterRightBottom; }
            set { _afterRightBottom = value; }
        }
        private PointF _afterRightBottom;
 
        /// <summary>
        /// 获取图片文本坐标对象
        /// </summary>
        /// <param name="origin">旋转中心点</param>
        /// <param name="angle">旋转角度(顺时针)</param>
        /// <param name="size">图片文本的尺寸</param>
        /// <param name="horiz">水平定位方式</param>
        /// <param name="veriz">垂直定位方式</param>
        /// <returns>图片文本坐标对象</returns>
        public static Coordinate GetCoordinate(PointF origin, float angle, SizeF size, StringAlignment horiz = StringAlignment.Near, StringAlignment veriz = StringAlignment.Near)
        {
            return new Coordinate(origin, angle, size, horiz, veriz);
        }
 
 
    }
 
}