Changeset 177


Ignore:
Timestamp:
03/15/14 22:59:10 (10 years ago)
Author:
Maciej Komosinski
Message:

Optimizations and simplifications

Location:
cpp/frams/genetics/fF
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • cpp/frams/genetics/fF/conv_fF.cpp

    r176 r177  
    88#include <common/nonstd_stl.h>
    99
    10 GenoConv_fF0::GenoConv_fF0() 
     10GenoConv_fF0::GenoConv_fF0()
    1111{
    1212        name = "7-value Foraminifera encoding";
     
    1919}
    2020
    21 GenoConv_fF0::~GenoConv_fF0() 
     21GenoConv_fF0::~GenoConv_fF0()
    2222{
    2323        delete[] cosines;
     
    3131                return ""; //so we return an invalid f0 genotype
    3232
    33         double div_radius_length = 1;//div_radius_length=1 or kx=ky=kz=1
     33        double div_radius_length = 1; //div_radius_length=1 or kx=ky=kz=1
    3434        double radius = 1;
    3535
    3636        Model m;
    3737        m.open();
     38
     39        m.vis_style = "foram"; //dedicated visual look for Foraminifera
     40
    3841        // subsequent parts (chambers) are placed relative to the previous part's orientation and location
    3942        Part *p1, *p2;
     
    4144        fF_chamber3d **chambers = new fF_chamber3d*[gp.number_of_chambers];
    4245
    43         for (int i = 0; i < gp.number_of_chambers; i++) {
     46        for (int i = 0; i < gp.number_of_chambers; i++)
    4447                createSphere(i, chambers, radius, div_radius_length, gp.translation, gp.angle1, gp.angle2, gp.scalex, gp.scaley, gp.scalez);
    45         }
    4648
    4749        p1 = m.addNewPart(Part::SHAPE_ELLIPSOID);
     
    4951
    5052
    51         for (int i = 1; i < gp.number_of_chambers; i++, p1 = p2) {
     53        for (int i = 1; i < gp.number_of_chambers; i++, p1 = p2)
     54        {
    5255                p2 = m.addNewPart(Part::SHAPE_ELLIPSOID);
    5356                p2->scale = p1->scale.entrywiseProduct(Pt3D(gp.scalex, gp.scaley, gp.scalez)); //each part's scale is its predecessor's scale * scaling
     
    106109                double ppz;
    107110
    108                 if (which == 1) {
     111                if (which == 1)
     112                {
    109113                        ppx = pcx;
    110114                        ppy = pcy;
    111115                        ppz = pcz;
    112116                }
    113                 else {
     117                else
     118                {
    114119                        ppx = chambers[which - 2]->holeX;
    115120                        ppy = chambers[which - 2]->holeY;
     
    189194        double kz = 1;
    190195
    191         if (which > 0) {
    192                 for (int kt = 1; kt < (which + 1); kt++) {
     196        if (which > 0)
     197        {
     198                for (int kt = 1; kt < (which + 1); kt++)
     199                {
    193200                        kx = kx * kx_;
    194201                        ky = ky * ky_;
     
    197204        }
    198205
    199         int i, j;
    200         double x, y, z;
     206        bool all_k_ones = kx_ == 1 && ky_ == 1 && kz_ == 1;
     207
     208        double rx = all_k_ones ? radius : kx;
     209        double ry = all_k_ones ? radius : ky;
     210        double rz = all_k_ones ? radius : kz;
    201211
    202212        double **points = new double*[fF_SIZE];
    203         for (int i = 0; i < fF_SIZE; i++) {
     213        for (int i = 0; i < fF_SIZE; i++)
     214        {
    204215                points[i] = new double[4];
    205216        }
    206217
    207         for (i = 0; i < fF_LONGITUDE_NUM; i++) {
    208                 if (kx_ == 1 && ky_ == 1 && kz_ == 1) {
    209                         y = ceny + radius * cosines[i];
    210                 }
    211                 else {
    212                         y = ceny + ky * cosines[i];
    213                 }
    214                 for (j = 0; j < fF_LATITUDE_NUM; j++) {
    215                         if (kx_ == 1 && ky_ == 1 && kz_ == 1) {
    216                                 points[(i * fF_LATITUDE_NUM) + j][0] = x = cenx + radius * cosines[j] * sines[i];
    217                                 points[(i * fF_LATITUDE_NUM) + j][1] = y;
    218                                 points[(i * fF_LATITUDE_NUM) + j][2] = z = cenz + radius * sines[j] * sines[i];
    219                         }
    220                         else {
    221                                 points[(i * fF_LATITUDE_NUM) + j][0] = x = cenx + kx * cosines[j] * sines[i];
    222                                 points[(i * fF_LATITUDE_NUM) + j][1] = y;
    223                                 points[(i * fF_LATITUDE_NUM) + j][2] = z = cenz + kz * sines[j] * sines[i];
    224                         }
    225 
    226                         points[(i * fF_LATITUDE_NUM) + j][3] = 1.0;
     218        for (int i = 0; i < fF_LONGITUDE_NUM; i++)
     219        {
     220                double y = ceny + ry * cosines[i];
     221
     222                for (int j = 0; j < fF_LATITUDE_NUM; j++)
     223                {
     224                        double x = cenx + rx * cosines[j] * sines[i];
     225                        double z = cenz + rz * sines[j] * sines[i];
     226                        double *p = points[(i * fF_LATITUDE_NUM) + j];
     227                        p[0] = x;
     228                        p[1] = y;
     229                        p[2] = z;
     230                        p[3] = 1.0;
     231
    227232                        if (x < minX) minX = x;
    228233                        if (x > maxX) maxX = x;
     
    231236
    232237                        if (z < minZ) minZ = z;
    233                 };
    234         };
     238                }
     239        }
    235240        return points;
    236241
     
    244249void GenoConv_fF0::search_hid(int nr, fF_chamber3d **spheres, double kx_, double ky_, double kz_)
    245250{
    246         int i, j;
    247         if (nr != 0) {
    248                 for (i = 0; i < nr; i++) {
    249                         for (j = 0; j < fF_AMOUNT; j++) {
    250                                 double X = spheres[nr]->points[j][0];
    251                                 double Y = spheres[nr]->points[j][1];
    252                                 double Z = spheres[nr]->points[j][2];
    253 
    254                                 double srX0 = spheres[i]->centerX;
    255                                 double srY0 = spheres[i]->centerY;
    256                                 double srZ0 = spheres[i]->centerZ;
    257 
    258                                 double a2;
    259                                 double b2;
    260                                 double c2;
    261 
    262                                 if (kx_ != 1) {
    263                                         a2 = (kx_ * kx_);
    264                                 }
    265                                 else {
    266                                         a2 = (spheres[i]->radius * spheres[i]->radius);
    267                                 }
    268 
    269                                 if (ky_ != 1) {
    270                                         b2 = (ky_ * ky_);
    271 
    272                                 }
    273                                 else {
    274                                         b2 = (spheres[i]->radius * spheres[i]->radius);
    275                                 }
    276 
    277                                 c2 = (kz_ * spheres[i]->radius) * (kz_ * spheres[i]->radius);
    278 
    279                                 double up1 = (X - srX0) * (X - srX0);
    280                                 double up2 = (Y - srY0) * (Y - srY0);
    281                                 double up3 = (Z - srZ0) * (Z - srZ0);
    282 
    283                                 double exp = up1 / a2;
    284                                 double exp2 = up2 / b2;
    285                                 double exp3 = up3 / c2;
    286 
    287                                 double result = exp + exp2 + exp3;
    288 
    289                                 if (result < (fF_THICK_RATIO)
    290                                         ) {
    291                                         spheres[nr]->points[j][3] = 0;
    292                                 }
     251        double kxsq = kx_*kx_;
     252        double kysq = ky_*ky_;
     253        double kzsq = kz_*kz_;
     254
     255        for (int i = 0; i < nr; i++)
     256        {
     257                double srX0 = spheres[i]->centerX;
     258                double srY0 = spheres[i]->centerY;
     259                double srZ0 = spheres[i]->centerZ;
     260
     261                double radsq = spheres[i]->radius * spheres[i]->radius;
     262
     263                double a2 = kx_ != 1 ? kxsq : radsq;
     264                double b2 = ky_ != 1 ? kysq : radsq;
     265                double c2 = kzsq * radsq;
     266
     267                for (int j = 0; j < fF_AMOUNT; j++)
     268                {
     269                        double *p = spheres[nr]->points[j];
     270                        double X = p[0];
     271                        double Y = p[1];
     272                        double Z = p[2];
     273
     274                        double up1 = (X - srX0) * (X - srX0);
     275                        double up2 = (Y - srY0) * (Y - srY0);
     276                        double up3 = (Z - srZ0) * (Z - srZ0);
     277
     278                        double exp1 = up1 / a2;
     279                        double exp2 = up2 / b2;
     280                        double exp3 = up3 / c2;
     281
     282                        double result = exp1 + exp2 + exp3;
     283
     284                        if (result < fF_THICK_RATIO)
     285                        {
     286                                p[3] = 0.0;
    293287                        }
    294288                }
     
    298292int GenoConv_fF0::find_hole(int which, double x, double y, double z, fF_chamber3d **chambers, double kx_, double ky_, double kz_)
    299293{
    300         int i;
    301         double distance;
    302         int found = 0;
    303         double dist_found = 0;
    304         int first = 1;
    305 
    306         for (i = 0; i < fF_AMOUNT; i++) {
    307                 if (chambers[which]->points[i][3] != 0) //it is not inside another chamber
    308                 {
    309                         distance = sqrt((chambers[which]->points[i][0] - x)*(chambers[which]->points[i][0] - x) +
    310                                 (chambers[which]->points[i][1] - y)*(chambers[which]->points[i][1] - y) +
    311                                 (chambers[which]->points[i][2] - z)*(chambers[which]->points[i][2] - z));
    312                         if (first != 0) {
     294        int found = -1;
     295        double distsq_found;
     296
     297        double kxsq = kx_*kx_;
     298        double kysq = ky_*ky_;
     299        double kzsq = kz_*kz_;
     300
     301        for (int i = 0; i < fF_AMOUNT; i++)
     302        {
     303                double *p = chambers[which]->points[i];
     304                if (p[3] != 0) //it is not inside another chamber
     305                {
     306                        double distancesq = (p[0] - x)*(p[0] - x) + (p[1] - y)*(p[1] - y) + (p[2] - z)*(p[2] - z);
     307                        if (found < 0)
     308                        {
    313309                                found = i;
    314                                 dist_found = distance;
    315                                 first = 0;
     310                                distsq_found = distancesq;
    316311                        }
    317                         if (distance < dist_found) {
    318                                 if (which != 0) {
     312                        if (distancesq < distsq_found)
     313                        {
     314                                if (which != 0)
     315                                {
     316                                        double X = p[0];
     317                                        double Y = p[1];
     318                                        double Z = p[2];
    319319                                        bool good = true;
    320                                         for (int j = 0; j < which; j++) {
     320                                        for (int j = 0; j < which && good; j++)
     321                                        {
     322                                                double srX0 = chambers[j]->centerX;
     323                                                double srY0 = chambers[j]->centerY;
     324                                                double srZ0 = chambers[j]->centerZ;
     325
     326                                                double radsq = chambers[j]->radius * chambers[j]->radius;
     327
     328                                                double a2 = kxsq * radsq;
     329                                                double b2 = kysq * radsq;
     330                                                double c2 = kzsq * radsq;
     331
     332                                                double up1 = (X - srX0) * (X - srX0);
     333                                                double up2 = (Y - srY0) * (Y - srY0);
     334                                                double up3 = (Z - srZ0) * (Z - srZ0);
     335
     336                                                double exp1 = up1 / a2;
     337                                                double exp2 = up2 / b2;
     338                                                double exp3 = up3 / c2;
     339
     340                                                double result = exp1 + exp2 + exp3;
     341                                                if (result < 1.0)
    321342                                                {
    322                                                         double X = chambers[which]->points[i][0];
    323                                                         double Y = chambers[which]->points[i][1];
    324                                                         double Z = chambers[which]->points[i][2];
    325 
    326                                                         double srX0 = chambers[j]->centerX;
    327                                                         double srY0 = chambers[j]->centerY;
    328                                                         double srZ0 = chambers[j]->centerZ;
    329 
    330                                                         double a2 = (kx_ * chambers[j]->radius) * (kx_ * chambers[j]->radius);
    331                                                         double b2 = (ky_ * chambers[j]->radius) * (ky_ * chambers[j]->radius);
    332                                                         double c2 = (kz_ * chambers[j]->radius) * (kz_ * chambers[j]->radius);
    333 
    334                                                         double up1 = (X - srX0) * (X - srX0);
    335                                                         double up2 = (Y - srY0) * (Y - srY0);
    336                                                         double up3 = (Z - srZ0) * (Z - srZ0);
    337 
    338                                                         double exp1 = up1 / a2;
    339                                                         double exp2 = up2 / b2;
    340                                                         double exp3 = up3 / c2;
    341 
    342                                                         double result = exp1 + exp2 + exp3;
    343                                                         if (result < 1.0)
    344                                                         {
    345                                                                 good = false;
    346                                                         }
     343                                                        good = false;
    347344                                                }
    348345                                        }
    349                                         if (good) {
     346                                        if (good)
     347                                        {
    350348                                                found = i;
    351                                                 dist_found = distance;
     349                                                distsq_found = distancesq;
    352350                                        }
    353351                                }
     
    356354        }
    357355
    358         return (found);
    359 }
     356        return found;
     357}
  • cpp/frams/genetics/fF/fF_genotype.cpp

    r176 r177  
    99{
    1010        { "fF", 1, 7, "fF" },
    11         { "n", 0, PARAM_CANOMITNAME, "number of chambers", "d 1 15 1", FIELD(number_of_chambers), },
     11        { "n", 0, PARAM_CANOMITNAME, "number of chambers", "d 1 15 6", FIELD(number_of_chambers), },
    1212        { "sx", 0, PARAM_CANOMITNAME, "scale x", "f 1.0 1.1 1.05", FIELD(scalex), },
    1313        { "sy", 0, PARAM_CANOMITNAME, "scale y", "f 1.0 1.1 1.05", FIELD(scaley), },
Note: See TracChangeset for help on using the changeset viewer.