45 gridSize.rwidth() = qCeil(
bounds.width() / dstStep.x());
46 gridSize.rheight() = qCeil(
bounds.height() / dstStep.y());
64 std::vector<Split> verticalSplits;
65 std::vector<Split> horizontalSplits;
67 for (
int y = 0; y < gridSize.height(); y++) {
68 const qreal yProportion = qreal(y) / (gridSize.height() - 1);
80 verticalSplits.push_back({
p0, relP1, relP2,
p3, yCoord1, yCoord2, yProportion});
83 for (
int x = 0; x < gridSize.width(); x++) {
84 const qreal xProportion = qreal(x) / (gridSize.width() - 1);
96 horizontalSplits.push_back({
q0, relQ1, relQ2,
q3, xCoord1, xCoord2, xProportion});
99 for (
int y = 0; y < gridSize.height(); y++) {
100 for (
int x = 0; x < gridSize.width(); x++) {
101 const Split &ySplit = verticalSplits[y];
102 const Split &xSplit = horizontalSplits[x];
104 const QPointF transf1 = bezierCurve(ySplit.p0,
105 ySplit.p0 + ySplit.relP1,
106 ySplit.p3 + ySplit.relP2,
111 const QPointF transf2 = bezierCurve(xSplit.p0,
112 xSplit.p0 + xSplit.relP1,
113 xSplit.p3 + xSplit.relP2,
118 const QPointF transf = 0.5 * (transf1 + transf2);
120 const QPointF localPt(
lerp(xSplit.coord1, xSplit.coord2, ySplit.proportion),
121 lerp(ySplit.coord1, ySplit.coord2, xSplit.proportion));
124 origPoints.append(orig);
125 transfPoints.append(transf);
136 gridSize.rwidth() = qCeil(
bounds.width() / dstStep.x());
137 gridSize.rheight() = qCeil(
bounds.height() / dstStep.y());
154 std::vector<Split> verticalSplits;
155 std::vector<Split> horizontalSplits;
157 for (
int y = 0; y < gridSize.height(); y++) {
158 const qreal yProportion = qreal(y) / (gridSize.height() - 1);
166 verticalSplits.push_back({
p0,
p3, yCoord1, yCoord2, yProportion});
169 for (
int x = 0; x < gridSize.width(); x++) {
170 const qreal xProportion = qreal(x) / (gridSize.width() - 1);
178 horizontalSplits.push_back({
q0,
q3, xCoord1, xCoord2, xProportion});
181 for (
int y = 0; y < gridSize.height(); y++) {
182 for (
int x = 0; x < gridSize.width(); x++) {
183 const Split &ySplit = verticalSplits[y];
184 const Split &xSplit = horizontalSplits[x];
186 const QPointF Sc =
lerp(xSplit.p0, xSplit.p3, ySplit.proportion);
187 const QPointF Sd =
lerp(ySplit.p0, ySplit.p3, xSplit.proportion);
194 const QPointF transf = Sc + Sd - Sb;
196 const QPointF localPt(
lerp(xSplit.coord1, xSplit.coord2, ySplit.proportion),
197 lerp(ySplit.coord1, ySplit.coord2, xSplit.proportion));
200 origPoints.append(orig);
201 transfPoints.append(transf);
QPointF calculateLocalPos(const std::array< QPointF, 12 > &points, const QPointF &globalPoint)
calculates local (u,v) coordinates of the patch corresponding to globalPoint
QPointF calculateGlobalPos(const std::array< QPointF, 12 > &points, const QPointF &localPoint)
calculates global coordinate corresponding to the patch coordinate (u, v)