summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJabier Arraiza Cenoz <jabier.arraiza@marker.es>2016-03-24 01:27:33 +0000
committerJabiertxof <jtx@jtx.marker.es>2016-03-24 01:27:33 +0000
commit13783613a9af3770294713af80a8e17b51089266 (patch)
tree81c062f6202312b12f1cf637a825cb25bef8bffb /src
parentupdate to trunk (diff)
downloadinkscape-13783613a9af3770294713af80a8e17b51089266.tar.gz
inkscape-13783613a9af3770294713af80a8e17b51089266.zip
Fixing Krzysztof review
(bzr r13682.1.36)
Diffstat (limited to 'src')
-rw-r--r--src/live_effects/lpe-mirror_symmetry.cpp66
-rw-r--r--src/live_effects/lpe-mirror_symmetry.h1
2 files changed, 31 insertions, 36 deletions
diff --git a/src/live_effects/lpe-mirror_symmetry.cpp b/src/live_effects/lpe-mirror_symmetry.cpp
index d25225797..60ad13fc8 100644
--- a/src/live_effects/lpe-mirror_symmetry.cpp
+++ b/src/live_effects/lpe-mirror_symmetry.cpp
@@ -83,23 +83,28 @@ LPEMirrorSymmetry::doBeforeEffect (SPLPEItem const* lpeitem)
Point point_a(boundingbox_X.max(), boundingbox_Y.min());
Point point_b(boundingbox_X.max(), boundingbox_Y.max());
Point point_c(boundingbox_X.max(), boundingbox_Y.middle());
- if(mode == MT_Y) {
+ if (mode == MT_Y) {
point_a = Geom::Point(boundingbox_X.min(),center[Y]);
point_b = Geom::Point(boundingbox_X.max(),center[Y]);
}
- if(mode == MT_X) {
+ if (mode == MT_X) {
point_a = Geom::Point(center[X],boundingbox_Y.min());
point_b = Geom::Point(center[X],boundingbox_Y.max());
}
- if( mode == MT_X || mode == MT_Y ) {
+ if ( mode == MT_X || mode == MT_Y ) {
Geom::Path path;
path.start( point_a );
path.appendNew<Geom::LineSegment>( point_b );
reflection_line.set_new_value(path.toPwSb(), true);
line_separation.setPoints(point_a, point_b);
center.param_setValue(path.pointAt(0.5), true);
- } else if( mode == MT_FREE) {
+ } else if ( mode == MT_FREE) {
Geom::PathVector line_m(reflection_line.get_pathvector());
+ Geom::Line line_symm;
+ line_symm->setPoints(line_m->initialPoint(), line_m->finalPoint());
+ Geom::GenericRect bbox(boundingbox_X.min(), boundingbox_Y.min(), boundingbox_X.max(), boundingbox_Y.max());
+ line_m[0].initialPoint = bbox->nearestEdgePoint(line_m->initialPoint());
+ line_m[0].finalPoint = bbox->nearestEdgePoint(line_m->finalPoint())
if(!are_near(previous_center,center, 0.01)) {
Geom::Point trans = center - line_m[0].pointAt(0.5);
line_m[0] *= Geom::Affine(1,0,0,1,trans[X],trans[Y]);
@@ -111,6 +116,7 @@ LPEMirrorSymmetry::doBeforeEffect (SPLPEItem const* lpeitem)
center.param_setValue(line_m[0].pointAt(0.5), true);
point_a = line_m[0].initialPoint();
point_b = line_m[0].finalPoint();
+ reflection_line.set_new_value(line_m[0].toPwSb(), true);
line_separation.setPoints(point_a, point_b);
}
previous_center = center;
@@ -138,52 +144,42 @@ LPEMirrorSymmetry::doOnApply (SPLPEItem const* lpeitem)
previous_center = center;
}
-int
-LPEMirrorSymmetry::pointSideOfLine(Geom::Point point_a, Geom::Point point_b, Geom::Point point_x)
-{
- //http://stackoverflow.com/questions/1560492/how-to-tell-whether-a-point-is-to-the-right-or-left-side-of-a-line
- double pos = (point_b[Geom::X]-point_a[Geom::X])*(point_x[Geom::Y]-point_a[Geom::Y]) - (point_b[Geom::Y]-point_a[Geom::Y])*(point_x[Geom::X]-point_a[Geom::X]);
- return (pos < 0) ? -1 : (pos > 0);
-}
Geom::PathVector
LPEMirrorSymmetry::doEffect_path (Geom::PathVector const & path_in)
{
// Don't allow empty path parameter:
- if ( reflection_line.get_pathvector().empty() ) {
+ Geom::PathVector line_m(reflection_line.get_pathvector());
+ if ( line_m.empty() ) {
return path_in;
}
Geom::PathVector const original_pathv = pathv_to_linear_and_cubic_beziers(path_in);
Geom::PathVector path_out;
- Geom::Path line_m_expanded;
- Geom::Point line_start = line_separation.pointAt(-100000.0);
- Geom::Point line_end = line_separation.pointAt(100000.0);
- line_m_expanded.start( line_start);
- line_m_expanded.appendNew<Geom::LineSegment>( line_end);
-
+
if (!discard_orig_path && !fuse_paths) {
path_out = path_in;
}
- Geom::Point point_a(line_start);
- Geom::Point point_b(line_end);
+ Geom::Point point_a(line_separation.initialPoint());
+ Geom::Point point_b(line_separation.finalPoint());
- Geom::Affine m1(1.0, 0.0, 0.0, 1.0, point_a[0], point_a[1]);
+ Geom::Translate m1(point_a[0], point_a[1]);
double hyp = Geom::distance(point_a, point_b);
double c = (point_b[0] - point_a[0]) / hyp; // cos(alpha)
double s = (point_b[1] - point_a[1]) / hyp; // sin(alpha)
Geom::Affine m2(c, -s, s, c, 0.0, 0.0);
- Geom::Affine sca(1.0, 0.0, 0.0, -1.0, 0.0, 0.0);
+ Geom::Scale sca(1.0, -1.0);
Geom::Affine m = m1.inverse() * m2;
m = m * sca;
m = m * m2.inverse();
m = m * m1;
- if(fuse_paths && !discard_orig_path) {
+ if (fuse_paths && !discard_orig_path) {
for (Geom::PathVector::const_iterator path_it = original_pathv.begin();
- path_it != original_pathv.end(); ++path_it) {
+ path_it != original_pathv.end(); ++path_it)
+ {
if (path_it->empty()) {
continue;
}
@@ -197,22 +193,22 @@ LPEMirrorSymmetry::doEffect_path (Geom::PathVector const & path_in)
end_open = true;
}
}
- Geom::Path original = (Geom::Path)(*path_it);
- if(end_open && path_it->closed()) {
+ Geom::Path original = path_it;
+ if (end_open && path_it->closed()) {
original.close(false);
original.appendNew<Geom::LineSegment>( original.initialPoint() );
original.close(true);
}
- Geom::Crossings cs = crossings(original, line_m_expanded);
- for(unsigned int i = 0; i < cs.size(); i++) {
+ Geom::Crossings cs = crossings(original, line_m);
+ for (unsigned int i = 0; i < cs.size(); i++) {
double timeEnd = cs[i].ta;
Geom::Path portion = original.portion(time_start, timeEnd);
Geom::Point middle = portion.pointAt((double)portion.size()/2.0);
- position = pointSideOfLine(line_start, line_end, middle);
- if(oposite_fuse) {
+ position = Geom::sgn(Geom::cross(point_b - point_a, middle - point_a));
+ if (oposite_fuse) {
position *= -1;
}
- if(position == 1) {
+ if (position == 1) {
Geom::Path mirror = portion.reversed() * m;
mirror.setInitial(portion.finalPoint());
portion.append(mirror);
@@ -225,11 +221,11 @@ LPEMirrorSymmetry::doEffect_path (Geom::PathVector const & path_in)
portion.clear();
time_start = timeEnd;
}
- position = pointSideOfLine(line_start, line_end, original.finalPoint());
- if(oposite_fuse) {
+ position = position = Geom::sgn(Geom::cross(point_b - point_a, original.finalPoint() - point_a ));
+ if (oposite_fuse) {
position *= -1;
}
- if(cs.size()!=0 && position == 1) {
+ if (cs.size()!=0 && position == 1) {
Geom::Path portion = original.portion(time_start, original.size());
portion = portion.reversed();
Geom::Path mirror = portion.reversed() * m;
@@ -250,7 +246,7 @@ LPEMirrorSymmetry::doEffect_path (Geom::PathVector const & path_in)
}
portion.clear();
}
- if(cs.size() == 0 && position == 1) {
+ if (cs.size() == 0 && position == 1) {
temp_path.push_back(original);
temp_path.push_back(original * m);
}
diff --git a/src/live_effects/lpe-mirror_symmetry.h b/src/live_effects/lpe-mirror_symmetry.h
index f4e4678a7..cd6f2a0ce 100644
--- a/src/live_effects/lpe-mirror_symmetry.h
+++ b/src/live_effects/lpe-mirror_symmetry.h
@@ -44,7 +44,6 @@ public:
virtual ~LPEMirrorSymmetry();
virtual void doOnApply (SPLPEItem const* lpeitem);
virtual void doBeforeEffect (SPLPEItem const* lpeitem);
- virtual int pointSideOfLine(Geom::Point A, Geom::Point B, Geom::Point X);
virtual Geom::PathVector doEffect_path (Geom::PathVector const & path_in);
/* the knotholder entity classes must be declared friends */
friend class MS::KnotHolderEntityCenterMirrorSymmetry;