• Skip to content
  • Skip to link menu
KDE 4.0 API Reference
  • KDE API Reference
  • kdeedu
  • Sitemap
  • Contact Us
 

kalzium

kalziumgradienttype.cpp

Go to the documentation of this file.
00001 /***************************************************************************
00002  *   Copyright (C) 2005, 2006      by Pino Toscano, toscano.pino@tiscali.it      *
00003  *                                                                         *
00004  *   This program is free software; you can redistribute it and/or modify  *
00005  *   it under the terms of the GNU General Public License as published by  *
00006  *   the Free Software Foundation; either version 2 of the License, or     *
00007  *   (at your option) any later version.                                   *
00008  *                                                                         *
00009  *   This program is distributed in the hope that it will be useful,       *
00010  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
00011  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
00012  *   GNU General Public License for more details.                          *
00013  *                                                                         *
00014  *   You should have received a copy of the GNU General Public License     *
00015  *   along with this program; if not, write to the                         *
00016  *   Free Software Foundation, Inc.,                                       *
00017  *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.         *
00018  ***************************************************************************/
00019 
00020 #include "kalziumgradienttype.h"
00021 
00022 #include "element.h"
00023 #include "prefs.h"
00024 #include "kalziumdataobject.h"
00025 
00026 #include <QVariant>
00027 
00028 #include <klocale.h>
00029 #include <kdebug.h>
00030 
00031 #include <math.h>
00032 
00033 KalziumGradientTypeFactory::KalziumGradientTypeFactory()
00034 {
00035     m_gradients << KalziumCovalentRadiusGradientType::instance();
00036     m_gradients << KalziumVanDerWaalsRadiusGradientType::instance();
00037     m_gradients << KalziumMassGradientType::instance();
00038     m_gradients << KalziumBoilingPointGradientType::instance();
00039     m_gradients << KalziumMeltingPointGradientType::instance();
00040     m_gradients << KalziumElectronegativityGradientType::instance();
00041     m_gradients << KalziumElectronaffinityGradientType::instance();
00042     m_gradients << KalziumDiscoverydateGradientType::instance();
00043     m_gradients << KalziumIonizationGradientType::instance();
00044 }
00045 
00046 KalziumGradientTypeFactory* KalziumGradientTypeFactory::instance()
00047 {
00048     static KalziumGradientTypeFactory kttf;
00049     return &kttf;
00050 }
00051 
00052 KalziumGradientType* KalziumGradientTypeFactory::build( int id ) const
00053 {
00054     if ( ( id < 0 ) || ( id >= m_gradients.count() ) )
00055         return 0;
00056 
00057     return m_gradients.at( id );
00058 }
00059 
00060 KalziumGradientType* KalziumGradientTypeFactory::build( const QByteArray& id ) const
00061 {
00062     for ( int i = 0; i < m_gradients.count(); i++ )
00063     {
00064         if ( m_gradients.at( i )->name() == id )
00065             return m_gradients.at( i );
00066     }
00067     
00068     // not found
00069     return 0;
00070 }
00071 
00072 QStringList KalziumGradientTypeFactory::gradients() const
00073 {
00074     QStringList l;
00075     for ( int i = 0; i < m_gradients.count(); i++ )
00076     {
00077         l << m_gradients.at( i )->description();
00078     }
00079     return l;
00080 }
00081 
00082 
00083 KalziumGradientType::KalziumGradientType()
00084 {
00085 }
00086 
00087 KalziumGradientType::~KalziumGradientType()
00088 {
00089 }
00090 
00091 KalziumGradientType* KalziumGradientType::instance()
00092 {
00093     return 0;
00094 }
00095 
00096 double KalziumGradientType::elementCoeff( int el ) const
00097 {
00098     double val = value( el );
00099     if( val <= 0.0 ) return -1;
00100     
00101     if(logarithmicGradient()) {
00102         double result = ( log(val) - log(minValue()) ) / ( log(maxValue()) - log(minValue()) );
00103         
00104         // now we perform a "gamma-correction" on the result. Indeed, logarithmic gradients
00105         // often have the problem that all high values have roughly the same color. Note that
00106         // as firstColor() is not necessarily black and secondColor() is not necessarily white,
00107         // this is not exactly a "gamma-correction" in the usual sense.
00108         const double gamma = 1.4;
00109         result = exp(gamma * log(result));
00110         return result;
00111     }
00112     else {
00113         return ( val - minValue() ) / ( maxValue() - minValue() );
00114     }
00115 }
00116 
00117 QColor KalziumGradientType::firstColor() const
00118 {
00119     return Qt::white;
00120 }
00121 
00122 QColor KalziumGradientType::secondColor() const
00123 {
00124     return Qt::red;
00125 }
00126 
00127 QColor KalziumGradientType::notAvailableColor() const
00128 {
00129     return Qt::lightGray;
00130 }
00131 
00132 QColor KalziumGradientType::calculateColor( const double coeff ) const
00133 {
00134     if ( ( coeff < 0.0 ) || ( coeff > 1.0 ) ) return notAvailableColor();
00135 
00136     QColor color2 = secondColor();
00137     QColor color1 = firstColor();
00138 
00139     int red = static_cast<int>( (color2.red() - color1.red()) * coeff + color1.red() );
00140     int green = static_cast<int>( (color2.green() - color1.green()) * coeff + color1.green() );
00141     int blue = static_cast<int>( (color2.blue() - color1.blue()) * coeff + color1.blue() );
00142     
00143     return QColor( red, green, blue );
00144 }
00145 
00146 KalziumCovalentRadiusGradientType* KalziumCovalentRadiusGradientType::instance()
00147 {
00148     static KalziumCovalentRadiusGradientType kcrgt;
00149     return &kcrgt;
00150 }
00151 
00152 KalziumCovalentRadiusGradientType::KalziumCovalentRadiusGradientType()
00153   : KalziumGradientType()
00154 {
00155 }
00156 
00157 QByteArray KalziumCovalentRadiusGradientType::name() const
00158 {
00159     return "CovalentRadius";
00160 }
00161 
00162 QString KalziumCovalentRadiusGradientType::description() const
00163 {
00164     return i18n( "Covalent Radius" );
00165 }
00166 
00167 double KalziumCovalentRadiusGradientType::value( int el ) const
00168 {
00169     QVariant v = KalziumDataObject::instance()->element( el )->dataAsVariant( ChemicalDataObject::radiusCovalent );
00170     if ( v.type() != QVariant::Double ) return -1;
00171     return v.toDouble();
00172 }
00173 
00174 double KalziumCovalentRadiusGradientType::minValue() const
00175 {
00176     return 0.32;
00177 }
00178 
00179 double KalziumCovalentRadiusGradientType::maxValue() const
00180 {
00181     return 2.25;
00182 }
00183 
00184 bool KalziumCovalentRadiusGradientType::logarithmicGradient() const
00185 {
00186     return Prefs::logarithmicCovalentRadiusGradient();
00187 }
00188 
00189 
00190 KalziumVanDerWaalsRadiusGradientType* KalziumVanDerWaalsRadiusGradientType::instance()
00191 {
00192     static KalziumVanDerWaalsRadiusGradientType kvdwrgt;
00193     return &kvdwrgt;
00194 }
00195 
00196 KalziumVanDerWaalsRadiusGradientType::KalziumVanDerWaalsRadiusGradientType()
00197   : KalziumGradientType()
00198 {
00199 }
00200 
00201 QByteArray KalziumVanDerWaalsRadiusGradientType::name() const
00202 {
00203     return "KalziumVanDerWaalsRadiusGradientType";
00204 }
00205 
00206 QString KalziumVanDerWaalsRadiusGradientType::description() const
00207 {
00208     return i18n( "van Der Waals" );
00209 }
00210 
00211 double KalziumVanDerWaalsRadiusGradientType::value( int el ) const
00212 {
00213     QVariant v = KalziumDataObject::instance()->element( el )->dataAsVariant( ChemicalDataObject::radiusVDW );
00214     if ( v.type() != QVariant::Double ) return -1;
00215     return v.toDouble();
00216 }
00217 
00218 double KalziumVanDerWaalsRadiusGradientType::minValue() const
00219 {
00220     return 1.2;
00221 }
00222 
00223 double KalziumVanDerWaalsRadiusGradientType::maxValue() const
00224 {
00225     return 3.0;
00226 }
00227 
00228 bool KalziumVanDerWaalsRadiusGradientType::logarithmicGradient() const
00229 {
00230     return Prefs::logarithmicVanDerWaalsRadiusGradient();
00231 }
00232 
00233 
00234 KalziumMassGradientType* KalziumMassGradientType::instance()
00235 {
00236     static KalziumMassGradientType kargt;
00237     return &kargt;
00238 }
00239 
00240 KalziumMassGradientType::KalziumMassGradientType()
00241   : KalziumGradientType()
00242 {
00243 }
00244 
00245 QByteArray KalziumMassGradientType::name() const
00246 {
00247     return "AtomicMass";
00248 }
00249 
00250 QString KalziumMassGradientType::description() const
00251 {
00252     return i18n( "Atomic Mass" );
00253 }
00254 
00255 double KalziumMassGradientType::value( int el ) const
00256 {
00257     QVariant v = KalziumDataObject::instance()->element( el )->dataAsVariant( ChemicalDataObject::mass );
00258     if ( v.type() != QVariant::Double ) return -1;
00259     return v.toDouble();
00260 }
00261 
00262 double KalziumMassGradientType::minValue() const
00263 {
00264     return 1.00794;
00265 }
00266 
00267 double KalziumMassGradientType::maxValue() const
00268 {
00269     return 292.0;
00270 }
00271 
00272 bool KalziumMassGradientType::logarithmicGradient() const
00273 {
00274     return Prefs::logarithmicMassGradient();
00275 }
00276 
00277 KalziumBoilingPointGradientType* KalziumBoilingPointGradientType::instance()
00278 {
00279     static KalziumBoilingPointGradientType kbpgt;
00280     return &kbpgt;
00281 }
00282 
00283 KalziumBoilingPointGradientType::KalziumBoilingPointGradientType()
00284   : KalziumGradientType()
00285 {
00286 }
00287 
00288 QByteArray KalziumBoilingPointGradientType::name() const
00289 {
00290     return "BoilingPoint";
00291 }
00292 
00293 QString KalziumBoilingPointGradientType::description() const
00294 {
00295     return i18n( "Boiling Point" );
00296 }
00297 
00298 double KalziumBoilingPointGradientType::value( int el ) const
00299 {
00300     QVariant v = KalziumDataObject::instance()->element( el )->dataAsVariant( ChemicalDataObject::boilingpoint );
00301     if ( v.type() != QVariant::Double ) return -1;
00302     return v.toDouble();
00303 }
00304 
00305 double KalziumBoilingPointGradientType::minValue() const
00306 {
00307     return 4.216;
00308 }
00309 
00310 double KalziumBoilingPointGradientType::maxValue() const
00311 {
00312     return 5870.0;
00313 }
00314 
00315 bool KalziumBoilingPointGradientType::logarithmicGradient() const
00316 {
00317     return Prefs::logarithmicBoilingPointGradient();
00318 }
00319 
00320 KalziumMeltingPointGradientType* KalziumMeltingPointGradientType::instance()
00321 {
00322     static KalziumMeltingPointGradientType kmpgt;
00323     return &kmpgt;
00324 }
00325 
00326 KalziumMeltingPointGradientType::KalziumMeltingPointGradientType()
00327   : KalziumGradientType()
00328 {
00329 }
00330 
00331 QByteArray KalziumMeltingPointGradientType::name() const
00332 {
00333     return "MeltingPoint";
00334 }
00335 
00336 QString KalziumMeltingPointGradientType::description() const
00337 {
00338     return i18n( "Melting Point" );
00339 }
00340 
00341 double KalziumMeltingPointGradientType::value( int el ) const
00342 {
00343     QVariant v = KalziumDataObject::instance()->element( el )->dataAsVariant( ChemicalDataObject::meltingpoint );
00344     if ( v.type() != QVariant::Double ) return -1;
00345     return v.toDouble();
00346 }
00347 
00348 double KalziumMeltingPointGradientType::minValue() const
00349 {
00350     return 0.94;
00351 }
00352 
00353 double KalziumMeltingPointGradientType::maxValue() const
00354 {
00355     return 3825.0;
00356 }
00357 
00358 bool KalziumMeltingPointGradientType::logarithmicGradient() const
00359 {
00360     return Prefs::logarithmicMeltingPointGradient();
00361 }
00362 
00363 
00364 KalziumElectronegativityGradientType* KalziumElectronegativityGradientType::instance()
00365 {
00366     static KalziumElectronegativityGradientType kegt;
00367     return &kegt;
00368 }
00369 
00370 KalziumElectronegativityGradientType::KalziumElectronegativityGradientType()
00371   : KalziumGradientType()
00372 {
00373 }
00374 
00375 QByteArray KalziumElectronegativityGradientType::name() const
00376 {
00377     return "Electronegativity";
00378 }
00379 
00380 QString KalziumElectronegativityGradientType::description() const
00381 {
00382     return i18n( "Electronegativity (Pauling)" );
00383 }
00384 
00385 double KalziumElectronegativityGradientType::value( int el ) const
00386 {
00387     QVariant v = KalziumDataObject::instance()->element( el )->dataAsVariant( ChemicalDataObject::electronegativityPauling );
00388     if ( v.type() != QVariant::Double ) return -1;
00389     return v.toDouble();
00390 }
00391 
00392 double KalziumElectronegativityGradientType::minValue() const
00393 {
00394     return 0.7;
00395 }
00396 
00397 double KalziumElectronegativityGradientType::maxValue() const
00398 {
00399     return 3.98;
00400 }
00401 
00402 bool KalziumElectronegativityGradientType::logarithmicGradient() const
00403 {
00404     return Prefs::logarithmicElectronegativityGradient();
00405 }
00406 
00408 
00409 KalziumDiscoverydateGradientType* KalziumDiscoverydateGradientType::instance()
00410 {
00411     static KalziumDiscoverydateGradientType kegt;
00412     return &kegt;
00413 }
00414 
00415 KalziumDiscoverydateGradientType::KalziumDiscoverydateGradientType()
00416   : KalziumGradientType()
00417 {
00418 }
00419 
00420 QByteArray KalziumDiscoverydateGradientType::name() const
00421 {
00422     return "Discoverydate";
00423 }
00424 
00425 QString KalziumDiscoverydateGradientType::description() const
00426 {
00427     return i18n( "Discoverydate" );
00428 }
00429 
00430 double KalziumDiscoverydateGradientType::value( int el ) const
00431 {
00432     QVariant v = KalziumDataObject::instance()->element( el )->dataAsVariant( ChemicalDataObject::date );
00433 
00434     return v.toDouble();
00435 }
00436 
00437 double KalziumDiscoverydateGradientType::minValue() const
00438 {
00439     return 1699.0;
00440 }
00441 
00442 double KalziumDiscoverydateGradientType::maxValue() const
00443 {
00444     return 1994.0;
00445 }
00446 
00447 bool KalziumDiscoverydateGradientType::logarithmicGradient() const
00448 {
00449     return Prefs::logarithmicDiscoverydateGradient();
00450 }
00451 
00452 
00454 
00455 KalziumElectronaffinityGradientType* KalziumElectronaffinityGradientType::instance()
00456 {
00457     static KalziumElectronaffinityGradientType kegt;
00458     return &kegt;
00459 }
00460 
00461 KalziumElectronaffinityGradientType::KalziumElectronaffinityGradientType()
00462   : KalziumGradientType()
00463 {
00464 }
00465 
00466 QByteArray KalziumElectronaffinityGradientType::name() const
00467 {
00468     return "Electronaffinity";
00469 }
00470 
00471 QString KalziumElectronaffinityGradientType::description() const
00472 {
00473     return i18n( "Electronaffinity" );
00474 }
00475 
00476 double KalziumElectronaffinityGradientType::value( int el ) const
00477 {
00478     QVariant v = KalziumDataObject::instance()->element( el )->dataAsVariant( ChemicalDataObject::electronAffinity );
00479 
00480     return v.toDouble();
00481 }
00482 
00483 double KalziumElectronaffinityGradientType::minValue() const
00484 {
00485     return 0.0;
00486 }
00487 
00488 double KalziumElectronaffinityGradientType::maxValue() const
00489 {
00490     return 3.7;
00491 }
00492 
00493 bool KalziumElectronaffinityGradientType::logarithmicGradient() const
00494 {
00495     return Prefs::logarithmicElectronaffinityGradient();
00496 }
00497 
00499 
00500 KalziumIonizationGradientType* KalziumIonizationGradientType::instance()
00501 {
00502     static KalziumIonizationGradientType kegt;
00503     return &kegt;
00504 }
00505 
00506 KalziumIonizationGradientType::KalziumIonizationGradientType()
00507   : KalziumGradientType()
00508 {
00509 }
00510 
00511 QByteArray KalziumIonizationGradientType::name() const
00512 {
00513     return "Ionization";
00514 }
00515 
00516 QString KalziumIonizationGradientType::description() const
00517 {
00518     return i18n( "First Ionization" );
00519 }
00520 
00521 double KalziumIonizationGradientType::value( int el ) const
00522 {
00523     QVariant v = KalziumDataObject::instance()->element( el )->dataAsVariant( ChemicalDataObject::ionization );
00524 
00525     return v.toDouble();
00526 }
00527 
00528 double KalziumIonizationGradientType::minValue() const
00529 {
00530     return 0.0;//3.89;
00531 }
00532 
00533 double KalziumIonizationGradientType::maxValue() const
00534 {
00535     return 25.0;
00536 }
00537 
00538 bool KalziumIonizationGradientType::logarithmicGradient() const
00539 {
00540     return Prefs::logarithmicIonizationGradient();
00541 }

kalzium

Skip menu "kalzium"
  • Main Page
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members
  • Related Pages

kdeedu

Skip menu "kdeedu"
  • kalzium
  • kanagram
  • kig
  • klettres
  • kstars
  • libkdeedu
  •   keduvocdocument
  •   docs
  •   src
  • parley
Generated for kdeedu by doxygen 1.5.4
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal