summaryrefslogtreecommitdiffstats
path: root/src/livarot/PathConversion.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/livarot/PathConversion.cpp')
-rw-r--r--src/livarot/PathConversion.cpp48
1 files changed, 21 insertions, 27 deletions
diff --git a/src/livarot/PathConversion.cpp b/src/livarot/PathConversion.cpp
index ed5f03f80..42df898e6 100644
--- a/src/livarot/PathConversion.cpp
+++ b/src/livarot/PathConversion.cpp
@@ -119,15 +119,12 @@ void Path::ConvertWithBackData(double treshhold)
if ( nbInterm >= 1 ) {
Geom::Point bx = curX;
- Geom::Point cx = curX;
- Geom::Point dx = curX;
+ Geom::Point dx = nData->p;
+ Geom::Point cx = 2 * bx - dx;
- dx = nData->p;
ip++;
nData = dynamic_cast<PathDescrIntermBezierTo *>(descr_cmd[ip]);
- cx = 2 * bx - dx;
-
for (int k = 0; k < nbInterm - 1; k++) {
bx = cx;
cx = dx;
@@ -323,15 +320,12 @@ void Path::Convert(double treshhold)
RecBezierTo(midX, curX, nextX, treshhold, 8);
} else if ( nbInterm > 1 ) {
Geom::Point bx = curX;
- Geom::Point cx = curX;
- Geom::Point dx = curX;
+ Geom::Point dx = nData->p;
+ Geom::Point cx = 2 * bx - dx;
- dx = nData->p;
ip++;
nData = dynamic_cast<PathDescrIntermBezierTo *>(descr_cmd[ip]);
- cx = 2 * bx - dx;
-
for (int k = 0; k < nbInterm - 1; k++) {
bx = cx;
cx = dx;
@@ -565,15 +559,12 @@ void Path::ConvertEvenLines(double treshhold)
RecBezierTo(midX, curX, nextX, treshhold, 8, 4 * treshhold);
} else if ( nbInterm > 1 ) {
Geom::Point bx = curX;
- Geom::Point cx = curX;
- Geom::Point dx = curX;
+ Geom::Point dx = nData->p;
+ Geom::Point cx = 2 * bx - dx;
- dx = nData->p;
ip++;
nData = dynamic_cast<PathDescrIntermBezierTo *>(descr_cmd[ip]);
- cx = 2 * bx - dx;
-
for (int k = 0; k < nbInterm - 1; k++) {
bx = cx;
cx = dx;
@@ -822,13 +813,14 @@ void Path::DoArc(Geom::Point const &iS, Geom::Point const &iE,
double sang;
double eang;
Geom::Point dr_temp;
- ArcAnglesAndCenter(iS, iE, rx, ry, angle, large, wise, sang, eang, dr_temp);
+ ArcAnglesAndCenter(iS, iE, rx, ry, angle*M_PI/180.0, large, wise, sang, eang, dr_temp);
Geom::Point dr = dr_temp;
/* TODO: This isn't as good numerically as treating iS and iE as primary. E.g. consider
the case of low curvature (i.e. very large radius). */
Geom::Scale const ar(rx, ry);
- Geom::Rotate cb( angle + sang );
+ Geom::Rotate cb(sang);
+ Geom::Rotate cbangle(angle*M_PI/180.0);
if (wise) {
double const incr = -0.1;
@@ -838,7 +830,7 @@ void Path::DoArc(Geom::Point const &iS, Geom::Point const &iE,
Geom::Rotate const omega(incr);
for (double b = sang + incr ; b > eang ; b += incr) {
cb = omega * cb;
- AddPoint( cb.vector() * ar + dr );
+ AddPoint( cb.vector() * ar * cbangle + dr );
}
} else {
@@ -850,7 +842,7 @@ void Path::DoArc(Geom::Point const &iS, Geom::Point const &iE,
Geom::Rotate const omega(incr);
for (double b = sang + incr ; b < eang ; b += incr) {
cb = omega * cb;
- AddPoint( cb.vector() * ar + dr);
+ AddPoint( cb.vector() * ar * cbangle + dr);
}
}
}
@@ -965,13 +957,14 @@ void Path::DoArc(Geom::Point const &iS, Geom::Point const &iE,
double sang;
double eang;
Geom::Point dr_temp;
- ArcAnglesAndCenter(iS, iE, rx, ry, angle, large, wise, sang, eang, dr_temp);
+ ArcAnglesAndCenter(iS, iE, rx, ry, angle*M_PI/180.0, large, wise, sang, eang, dr_temp);
Geom::Point dr = dr_temp;
/* TODO: This isn't as good numerically as treating iS and iE as primary. E.g. consider
the case of low curvature (i.e. very large radius). */
Geom::Scale const ar(rx, ry);
- Geom::Rotate cb(angle + sang);
+ Geom::Rotate cb(sang);
+ Geom::Rotate cbangle(angle*M_PI/180.0);
if (wise) {
double const incr = -0.1;
@@ -981,7 +974,7 @@ void Path::DoArc(Geom::Point const &iS, Geom::Point const &iE,
Geom::Rotate const omega(incr);
for (double b = sang + incr; b > eang; b += incr) {
cb = omega * cb;
- AddPoint(cb.vector() * ar + dr, piece, (sang - b) / (sang - eang));
+ AddPoint(cb.vector() * ar * cbangle + dr, piece, (sang - b) / (sang - eang));
}
} else {
@@ -993,7 +986,7 @@ void Path::DoArc(Geom::Point const &iS, Geom::Point const &iE,
Geom::Rotate const omega(incr);
for (double b = sang + incr ; b < eang ; b += incr) {
cb = omega * cb;
- AddPoint(cb.vector() * ar + dr, piece, (b - sang) / (eang - sang));
+ AddPoint(cb.vector() * ar * cbangle + dr, piece, (b - sang) / (eang - sang));
}
}
}
@@ -1083,13 +1076,14 @@ void Path::DoArc(Geom::Point const &iS, Geom::Point const &iE,
double sang;
double eang;
Geom::Point dr_temp;
- ArcAnglesAndCenter(iS, iE, rx, ry, angle, large, wise, sang, eang, dr_temp);
+ ArcAnglesAndCenter(iS, iE, rx, ry, angle*M_PI/180.0, large, wise, sang, eang, dr_temp);
Geom::Point dr = dr_temp;
/* TODO: This isn't as good numerically as treating iS and iE as primary. E.g. consider
the case of low curvature (i.e. very large radius). */
Geom::Scale const ar(rx, ry);
- Geom::Rotate cb(angle + sang);
+ Geom::Rotate cb(sang);
+ Geom::Rotate cbangle(angle*M_PI/180.0);
if (wise) {
double const incr = -0.1;
@@ -1099,7 +1093,7 @@ void Path::DoArc(Geom::Point const &iS, Geom::Point const &iE,
Geom::Rotate const omega(incr);
for (double b = sang + incr; b > eang ;b += incr) {
cb = omega * cb;
- AddPoint(cb.vector() * ar + dr, piece, (sang - b) / (sang - eang));
+ AddPoint(cb.vector() * ar * cbangle + dr, piece, (sang - b) / (sang - eang));
}
} else {
@@ -1110,7 +1104,7 @@ void Path::DoArc(Geom::Point const &iS, Geom::Point const &iE,
Geom::Rotate const omega(incr);
for (double b = sang + incr ; b < eang ; b += incr) {
cb = omega * cb;
- AddPoint(cb.vector() * ar + dr, piece, (b - sang) / (eang - sang));
+ AddPoint(cb.vector() * ar * cbangle + dr, piece, (b - sang) / (eang - sang));
}
}
}