X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fspray-context.cpp;h=0cf74f59b97d5e617f8a841dbab2333bc478d278;hb=42382dfb4164b919ffcdf03766da9f8be4e43b42;hp=b1ec47e02c208b23799b128428608ddcfc2cb6ae;hpb=f9c09e56a08972fb879ec3a261b52889090903da;p=inkscape.git diff --git a/src/spray-context.cpp b/src/spray-context.cpp index b1ec47e02..0cf74f59b 100644 --- a/src/spray-context.cpp +++ b/src/spray-context.cpp @@ -1,5 +1,3 @@ -#define __SP_SPRAY_CONTEXT_C__ - /* * Spray Tool * @@ -12,6 +10,8 @@ * Vincent MONTAGNE * Pierre BARBRY-BLOT * Steren GIANNINI (steren.giannini@gmail.com) + * Jon A. Cruz + * Abhishek Sharma * * Copyright (C) 2009 authors * @@ -56,7 +56,6 @@ #include "path-chemistry.h" #include "sp-gradient.h" #include "sp-stop.h" -#include "sp-stop-fns.h" #include "sp-gradient-reference.h" #include "sp-linear-gradient.h" #include "sp-radial-gradient.h" @@ -82,6 +81,8 @@ #include "helper/action.h" #include + +using Inkscape::DocumentUndo; using namespace std; @@ -100,25 +101,6 @@ static gint sp_spray_context_root_handler(SPEventContext *ec, GdkEvent *event); static SPEventContextClass *parent_class = 0; -/* - RAND is a macro which returns a pseudo-random numbers from a uniform - distribution on the interval [0 1] -*/ -#define RAND ((double) rand())/((double) RAND_MAX) - -/* - TWOPI = 2.0*pi -*/ -#define TWOPI 2.0*3.141592653589793238462643383279502884197169399375 - -/* - RANDN is a macro which returns a pseudo-random numbers from a normal - distribution with mean zero and standard deviation one. This macro uses Box - Muller's algorithm -*/ -#define RANDN sqrt(-2.0*log(RAND))*cos(TWOPI*RAND) - - /** * This function returns pseudo-random numbers from a normal distribution * @param mu : mean @@ -126,7 +108,8 @@ static SPEventContextClass *parent_class = 0; */ inline double NormalDistribution(double mu,double sigma) { - return (mu+sigma*RANDN); + // use Box Muller's algorithm + return mu + sigma * sqrt( -2.0 * log(g_random_double_range(0, 1)) ) * cos( 2.0*M_PI*g_random_double_range(0, 1) ); } @@ -170,9 +153,9 @@ void sp_spray_rotate_rel(Geom::Point c,SPDesktop */*desktop*/,SPItem *item, Geom Geom::Translate const s(c); Geom::Matrix affine = Geom::Matrix(s).inverse() * Geom::Matrix(rotation) * Geom::Matrix(s); // Rotate item. - sp_item_set_i2d_affine(item, sp_item_i2d_affine(item) * (Geom::Matrix)affine); + item->set_i2d_affine(item->i2d_affine() * (Geom::Matrix)affine); // Use each item's own transform writer, consistent with sp_selection_apply_affine() - sp_item_write_transform(item, SP_OBJECT_REPR(item), item->transform); + item->doWriteTransform(SP_OBJECT_REPR(item), item->transform); // Restore the center position (it's changed because the bbox center changed) if (item->isCenterSet()) { item->setCenter(c); @@ -184,8 +167,8 @@ void sp_spray_rotate_rel(Geom::Point c,SPDesktop */*desktop*/,SPItem *item, Geom void sp_spray_scale_rel(Geom::Point c, SPDesktop */*desktop*/, SPItem *item, Geom::Scale const &scale) { Geom::Translate const s(c); - sp_item_set_i2d_affine(item, sp_item_i2d_affine(item) * s.inverse() * scale * s ); - sp_item_write_transform(item, SP_OBJECT_REPR(item), item->transform); + item->set_i2d_affine(item->i2d_affine() * s.inverse() * scale * s ); + item->doWriteTransform(SP_OBJECT_REPR(item), item->transform); } static void sp_spray_context_init(SPSprayContext *tc) @@ -440,29 +423,22 @@ double get_move_standard_deviation(SPSprayContext *tc) * @param[in] choice : */ -void random_position( double &radius, double &angle, double &a, double &s, int choice) +void random_position( double &radius, double &angle, double &a, double &s, int /*choice*/) { - angle = g_random_double_range(0, M_PI*2); - - choice = 0; - - switch(choice) { - - case 0: // 0 : uniform repartition - radius = ( 1 - pow( g_random_double_range( 0, 1 ), 2 ) ); - //radius = g_random_double_range( 0, 1 ); - break; + // angle is taken from an uniform distribution + angle = g_random_double_range(0, M_PI*2.0); - case 1: // 1 : gaussian repartition - // generates a number following a normal distribution - double radius_temp =-1; - while(!((radius_temp>=0)&&(radius_temp<=1))) - { - radius_temp = NormalDistribution( a, s ); - } - radius = radius_temp; - break; + // radius is taken from a Normal Distribution + double radius_temp =-1; + while(!((radius_temp>=0)&&(radius_temp<=1))) + { + radius_temp = NormalDistribution( a, s ); } + // Because we are in polar coordinates, a special treatment has to be done to the radius. + // Otherwise, positions taken from an uniform repartition on radius and angle will not seam to + // be uniformily distributed on the disk (more at the center and less at the boundary). + // We counter this effect with a 0.5 exponent. This is empiric. + radius = pow( radius_temp, 0.5); } @@ -505,14 +481,14 @@ bool sp_spray_recursive(SPDesktop *desktop, dr=dr*radius; if (mode == SPRAY_MODE_COPY) { - Geom::OptRect a = item->getBounds(sp_item_i2doc_affine(item)); + Geom::OptRect a = item->getBounds(item->i2doc_affine()); if (a) { SPItem *item_copied; if(_fid<=population) { // duplicate SPDocument *doc = SP_OBJECT_DOCUMENT(item); - Inkscape::XML::Document* xml_doc = sp_document_repr_doc(doc); + Inkscape::XML::Document* xml_doc = doc->getReprDoc(); Inkscape::XML::Node *old_repr = SP_OBJECT_REPR(item); Inkscape::XML::Node *parent = old_repr->parent(); Inkscape::XML::Node *copy = old_repr->duplicate(xml_doc); @@ -553,11 +529,11 @@ bool sp_spray_recursive(SPDesktop *desktop, i++; } SPDocument *doc = SP_OBJECT_DOCUMENT(father); - Inkscape::XML::Document* xml_doc = sp_document_repr_doc(doc); + Inkscape::XML::Document* xml_doc = doc->getReprDoc(); Inkscape::XML::Node *old_repr = SP_OBJECT_REPR(father); Inkscape::XML::Node *parent = old_repr->parent(); - Geom::OptRect a = father->getBounds(sp_item_i2doc_affine(father)); + Geom::OptRect a = father->getBounds(father->i2doc_affine()); if (a) { if (i==2) { Inkscape::XML::Node *copy1 = old_repr->duplicate(xml_doc); @@ -588,19 +564,19 @@ bool sp_spray_recursive(SPDesktop *desktop, selection->clear(); selection->add(item_copied); selection->add(unionResult); - sp_selected_path_union(selection->desktop()); + sp_selected_path_union_skip_undo(selection->desktop()); selection->add(father); Inkscape::GC::release(copy2); did = true; } } } else if (mode == SPRAY_MODE_CLONE) { - Geom::OptRect a = item->getBounds(sp_item_i2doc_affine(item)); + Geom::OptRect a = item->getBounds(item->i2doc_affine()); if (a) { if(_fid<=population) { SPItem *item_copied; SPDocument *doc = SP_OBJECT_DOCUMENT(item); - Inkscape::XML::Document* xml_doc = sp_document_repr_doc(doc); + Inkscape::XML::Document* xml_doc = doc->getReprDoc(); Inkscape::XML::Node *old_repr = SP_OBJECT_REPR(item); Inkscape::XML::Node *parent = old_repr->parent(); @@ -903,16 +879,16 @@ case GDK_SCROLL_LEFT: tc->has_dilated = false; switch (tc->mode) { case SPRAY_MODE_COPY: - sp_document_done(sp_desktop_document(SP_EVENT_CONTEXT(tc)->desktop), - SP_VERB_CONTEXT_SPRAY, _("Spray with copies")); + DocumentUndo::done(sp_desktop_document(SP_EVENT_CONTEXT(tc)->desktop), + SP_VERB_CONTEXT_SPRAY, _("Spray with copies")); break; case SPRAY_MODE_CLONE: - sp_document_done(sp_desktop_document(SP_EVENT_CONTEXT(tc)->desktop), - SP_VERB_CONTEXT_SPRAY, _("Spray with clones")); + DocumentUndo::done(sp_desktop_document(SP_EVENT_CONTEXT(tc)->desktop), + SP_VERB_CONTEXT_SPRAY, _("Spray with clones")); break; case SPRAY_MODE_SINGLE_PATH: - sp_document_done(sp_desktop_document(SP_EVENT_CONTEXT(tc)->desktop), - SP_VERB_CONTEXT_SPRAY, _("Spray in single path")); + DocumentUndo::done(sp_desktop_document(SP_EVENT_CONTEXT(tc)->desktop), + SP_VERB_CONTEXT_SPRAY, _("Spray in single path")); break; } } @@ -1077,5 +1053,5 @@ break; fill-column:99 End: */ -// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 : +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :