7
This file is part of MyGUI.
9
MyGUI is free software: you can redistribute it and/or modify
10
it under the terms of the GNU Lesser General Public License as published by
11
the Free Software Foundation, either version 3 of the License, or
12
(at your option) any later version.
14
MyGUI is distributed in the hope that it will be useful,
15
but WITHOUT ANY WARRANTY; without even the implied warranty of
16
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
GNU Lesser General Public License for more details.
19
You should have received a copy of the GNU Lesser General Public License
20
along with MyGUI. If not, see <http://www.gnu.org/licenses/>.
22
#include "MyGUI_Precompiled.h"
23
#include "MyGUI_GeometryUtility.h"
28
namespace geometry_utility
31
VectorFloatPoint cropPolygon(FloatPoint* _baseVerticiesPos, size_t _size, const IntCoord& _cropRectangle)
33
VectorFloatPoint resultVerticiesPos;
34
resultVerticiesPos.resize(_size);
35
for (size_t i = 0; i < _size; ++i)
37
resultVerticiesPos[i] = _baseVerticiesPos[i];
40
cropPolygonSide(resultVerticiesPos, _cropRectangle.left, Left);
41
cropPolygonSide(resultVerticiesPos, _cropRectangle.right(), Right);
42
cropPolygonSide(resultVerticiesPos, _cropRectangle.top, Top);
43
cropPolygonSide(resultVerticiesPos, _cropRectangle.bottom(), Bottom);
45
return resultVerticiesPos;
48
void cropPolygonSide(VectorFloatPoint& _verticies, int _sideCoord, Side _side)
50
VectorFloatPoint newVerticies;
51
int invert = (_side == Right || _side == Bottom) ? -1 : 1;
52
for (size_t i = 0; i < _verticies.size(); ++i)
54
FloatPoint& v0 = _verticies[i];
55
FloatPoint& v1 = _verticies[(i + 1) % _verticies.size()];
61
if (invert* v0.left >= invert* _sideCoord && invert* v1.left >= invert * _sideCoord)
62
newVerticies.push_back(v0);
63
// intersect side (1st vertex in)
64
else if (invert* v0.left >= invert * _sideCoord && invert * v1.left < invert * _sideCoord)
66
newVerticies.push_back(v0);
67
float c = (v0.left - _sideCoord) / (_sideCoord - v1.left);
68
newVerticies.push_back(FloatPoint((float)_sideCoord, (v0.top + c * v1.top) / (c + 1)));
70
// intersect side (2nd vertex in)
71
else if (invert* v0.left <= invert * _sideCoord && invert * v1.left > invert * _sideCoord)
73
float c = (v0.left - _sideCoord) / (_sideCoord - v1.left);
74
newVerticies.push_back(FloatPoint((float)_sideCoord, (v0.top + c * v1.top) / (c + 1)));
76
// else don't add any verticies
81
if (invert* v0.top >= invert* _sideCoord && invert* v1.top >= invert * _sideCoord)
82
newVerticies.push_back(v0);
83
// intersect side (1st vertex in)
84
else if (invert* v0.top >= invert * _sideCoord && invert * v1.top < invert * _sideCoord)
86
newVerticies.push_back(v0);
87
float c = (v0.top - _sideCoord) / (_sideCoord - v1.top);
88
newVerticies.push_back(FloatPoint((v0.left + c * v1.left) / (c + 1), (float)_sideCoord));
90
// intersect side (2nd vertex in)
91
else if (invert* v0.top <= invert * _sideCoord && invert * v1.top > invert * _sideCoord)
93
float c = (v0.top - _sideCoord) / (_sideCoord - v1.top);
94
newVerticies.push_back(FloatPoint((v0.left + c * v1.left) / (c + 1), (float)_sideCoord));
96
// else don't add any verticies
101
_verticies = newVerticies;
104
FloatPoint getPositionInsideRect(const FloatPoint& _point, const FloatPoint& _corner0, const FloatPoint& _corner1, const FloatPoint& _corner2)
108
FloatPoint point = _point - _corner0;
109
FloatPoint dirX = _corner1 - _corner0;
110
FloatPoint dirY = _corner2 - _corner0;
112
float div = dirX.left * dirY.top - dirX.top * dirY.left;
116
(point.top * dirX.left - point.left * dirX.top) / div,
117
(point.left * dirY.top - point.top * dirY.left) / div
121
FloatPoint getUVFromPositionInsideRect(const FloatPoint& _point, const FloatPoint& _v0, const FloatPoint& _v1, const FloatPoint& _baseUV)
124
_baseUV.left + _point.left * _v0.left + _point.top * _v1.left,
125
_baseUV.top + _point.left * _v0.top + _point.top * _v1.top
129
} // namespace geometry_utility
2
* This source file is part of MyGUI. For the latest info, see http://mygui.info/
3
* Distributed under the MIT License
4
* (See accompanying file COPYING.MIT or copy at http://opensource.org/licenses/MIT)
7
#include "MyGUI_Precompiled.h"
8
#include "MyGUI_GeometryUtility.h"
13
namespace geometry_utility
16
VectorFloatPoint cropPolygon(FloatPoint* _baseVerticiesPos, size_t _size, const IntCoord& _cropRectangle)
18
VectorFloatPoint resultVerticiesPos;
19
resultVerticiesPos.resize(_size);
20
for (size_t i = 0; i < _size; ++i)
22
resultVerticiesPos[i] = _baseVerticiesPos[i];
25
cropPolygonSide(resultVerticiesPos, _cropRectangle.left, Left);
26
cropPolygonSide(resultVerticiesPos, _cropRectangle.right(), Right);
27
cropPolygonSide(resultVerticiesPos, _cropRectangle.top, Top);
28
cropPolygonSide(resultVerticiesPos, _cropRectangle.bottom(), Bottom);
30
return resultVerticiesPos;
33
void cropPolygonSide(VectorFloatPoint& _verticies, int _sideCoord, Side _side)
35
VectorFloatPoint newVerticies;
36
int invert = (_side == Right || _side == Bottom) ? -1 : 1;
37
for (size_t i = 0; i < _verticies.size(); ++i)
39
FloatPoint& v0 = _verticies[i];
40
FloatPoint& v1 = _verticies[(i + 1) % _verticies.size()];
46
if (invert * v0.left >= invert * _sideCoord && invert * v1.left >= invert * _sideCoord)
47
newVerticies.push_back(v0);
48
// intersect side (1st vertex in)
49
else if (invert * v0.left >= invert * _sideCoord && invert * v1.left < invert * _sideCoord)
51
newVerticies.push_back(v0);
52
float c = (v0.left - _sideCoord) / (_sideCoord - v1.left);
53
newVerticies.push_back(FloatPoint((float)_sideCoord, (v0.top + c * v1.top) / (c + 1)));
55
// intersect side (2nd vertex in)
56
else if (invert * v0.left <= invert * _sideCoord && invert * v1.left > invert * _sideCoord)
58
float c = (v0.left - _sideCoord) / (_sideCoord - v1.left);
59
newVerticies.push_back(FloatPoint((float)_sideCoord, (v0.top + c * v1.top) / (c + 1)));
61
// else don't add any verticies
66
if (invert * v0.top >= invert * _sideCoord && invert * v1.top >= invert * _sideCoord)
67
newVerticies.push_back(v0);
68
// intersect side (1st vertex in)
69
else if (invert * v0.top >= invert * _sideCoord && invert * v1.top < invert * _sideCoord)
71
newVerticies.push_back(v0);
72
float c = (v0.top - _sideCoord) / (_sideCoord - v1.top);
73
newVerticies.push_back(FloatPoint((v0.left + c * v1.left) / (c + 1), (float)_sideCoord));
75
// intersect side (2nd vertex in)
76
else if (invert * v0.top <= invert * _sideCoord && invert * v1.top > invert * _sideCoord)
78
float c = (v0.top - _sideCoord) / (_sideCoord - v1.top);
79
newVerticies.push_back(FloatPoint((v0.left + c * v1.left) / (c + 1), (float)_sideCoord));
81
// else don't add any verticies
86
_verticies = newVerticies;
89
FloatPoint getPositionInsideRect(const FloatPoint& _point, const FloatPoint& _corner0, const FloatPoint& _corner1, const FloatPoint& _corner2)
93
FloatPoint point = _point - _corner0;
94
FloatPoint dirX = _corner1 - _corner0;
95
FloatPoint dirY = _corner2 - _corner0;
97
float div = dirX.left * dirY.top - dirX.top * dirY.left;
101
(point.top * dirX.left - point.left * dirX.top) / div,
102
(point.left * dirY.top - point.top * dirY.left) / div);
105
FloatPoint getUVFromPositionInsideRect(const FloatPoint& _point, const FloatPoint& _v0, const FloatPoint& _v1, const FloatPoint& _baseUV)
108
_baseUV.left + _point.left * _v0.left + _point.top * _v1.left,
109
_baseUV.top + _point.left * _v0.top + _point.top * _v1.top);
112
} // namespace geometry_utility