summaryrefslogtreecommitdiffstats
path: root/kpovmodeler/pmjuliafractaledit.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kpovmodeler/pmjuliafractaledit.cpp')
-rw-r--r--kpovmodeler/pmjuliafractaledit.cpp380
1 files changed, 380 insertions, 0 deletions
diff --git a/kpovmodeler/pmjuliafractaledit.cpp b/kpovmodeler/pmjuliafractaledit.cpp
new file mode 100644
index 00000000..43f351c5
--- /dev/null
+++ b/kpovmodeler/pmjuliafractaledit.cpp
@@ -0,0 +1,380 @@
+/*
+**************************************************************************
+ description
+ --------------------
+ copyright : (C) 2002 by Andreas Zehender
+ email : zehender@kde.org
+**************************************************************************
+
+**************************************************************************
+* *
+* This program is free software; you can redistribute it and/or modify *
+* it under the terms of the GNU General Public License as published by *
+* the Free Software Foundation; either version 2 of the License, or *
+* (at your option) any later version. *
+* *
+**************************************************************************/
+
+
+#include "pmjuliafractaledit.h"
+#include "pmjuliafractal.h"
+#include "pmvectoredit.h"
+#include "pmlineedits.h"
+
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qcombobox.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+
+PMJuliaFractalEdit::PMJuliaFractalEdit( QWidget* parent, const char* name )
+ : Base( parent, name )
+{
+ m_pDisplayedObject = 0;
+}
+
+void PMJuliaFractalEdit::createTopWidgets( )
+{
+ Base::createTopWidgets( );
+
+ QHBoxLayout* hl;
+ QGridLayout* gl;
+
+ topLayout( )->addWidget( new QLabel( i18n( "Julia parameter:" ), this ) );
+ m_pJuliaParameter = new PMVectorEdit( "", "i", "j", "k", this );
+ topLayout( )->addWidget( m_pJuliaParameter );
+
+ hl = new QHBoxLayout( topLayout( ) );
+ hl->addWidget( new QLabel( i18n( "Algebra type:" ), this ) );
+ m_pAlgebraType = new QComboBox( false, this );
+ m_pAlgebraType->insertItem( i18n( "Quaternion" ) );
+ m_pAlgebraType->insertItem( i18n( "Hypercomplex" ) );
+ hl->addWidget( m_pAlgebraType );
+ hl->addStretch( 1 );
+
+ hl = new QHBoxLayout( topLayout( ) );
+ hl->addWidget( new QLabel( i18n( "Function type:" ), this ) );
+ m_pFunctionType = new QComboBox( false, this );
+ m_pFunctionType->insertItem( "sqr" );
+ m_pFunctionType->insertItem( "cube" );
+ m_pFunctionType->insertItem( "exp" );
+ m_pFunctionType->insertItem( "reciprocal" );
+ m_pFunctionType->insertItem( "sin" );
+ m_pFunctionType->insertItem( "asin" );
+ m_pFunctionType->insertItem( "sinh" );
+ m_pFunctionType->insertItem( "asinh" );
+ m_pFunctionType->insertItem( "cos" );
+ m_pFunctionType->insertItem( "acos" );
+ m_pFunctionType->insertItem( "cosh" );
+ m_pFunctionType->insertItem( "acosh" );
+ m_pFunctionType->insertItem( "tan" );
+ m_pFunctionType->insertItem( "atan" );
+ m_pFunctionType->insertItem( "tanh" );
+ m_pFunctionType->insertItem( "atanh" );
+ m_pFunctionType->insertItem( "log" );
+ m_pFunctionType->insertItem( "pwr" );
+ hl->addWidget( m_pFunctionType );
+ hl->addStretch( 1 );
+
+ hl = new QHBoxLayout( topLayout( ) );
+ m_pExponentsLabel = new QLabel( i18n( "Exponent:" ), this );
+ hl->addWidget( m_pExponentsLabel );
+ m_pExponents = new PMVectorEdit( "", "i", this );
+ hl->addWidget( m_pExponents );
+ hl->addStretch( 1 );
+
+ hl = new QHBoxLayout( topLayout( ) );
+ gl = new QGridLayout( hl, 2, 2 );
+ gl->addWidget( new QLabel( i18n( "Maximum iterations:" ), this ), 0, 0 );
+ m_pMaxIterations = new PMIntEdit( this );
+ m_pMaxIterations->setValidation( true, 1, false, 0 );
+ gl->addWidget( m_pMaxIterations, 0, 1 );
+ gl->addWidget( new QLabel( i18n( "Precision:" ), this ), 1, 0 );
+ m_pPrecision = new PMFloatEdit( this );
+ m_pPrecision->setValidation( true, 1.0, false, 0.0 );
+ gl->addWidget( m_pPrecision, 1, 1 );
+ hl->addStretch( 1 );
+
+ topLayout( )->addWidget( new QLabel( i18n( "Slice normal:" ), this ) );
+ m_pSliceNormal = new PMVectorEdit( "", "i", "j", "k", this );
+ topLayout( )->addWidget( m_pSliceNormal );
+
+ hl = new QHBoxLayout( topLayout( ) );
+ hl->addWidget( new QLabel( i18n( "Slice distance:" ), this ) );
+ m_pSliceDistance = new PMFloatEdit( this );
+ hl->addWidget( m_pSliceDistance );
+ hl->addStretch( 1 );
+
+ connect( m_pJuliaParameter, SIGNAL( dataChanged( ) ), SIGNAL( dataChanged( ) ) );
+ connect( m_pAlgebraType, SIGNAL( activated( int ) ),
+ SLOT( slotAlgebraTypeSelected( int ) ) );
+ connect( m_pFunctionType, SIGNAL( activated( int ) ),
+ SLOT( slotFunctionTypeSelected( int ) ) );
+ connect( m_pExponents, SIGNAL( dataChanged( ) ), SIGNAL( dataChanged( ) ) );
+ connect( m_pMaxIterations, SIGNAL( dataChanged( ) ), SIGNAL( dataChanged( ) ) );
+ connect( m_pPrecision, SIGNAL( dataChanged( ) ), SIGNAL( dataChanged( ) ) );
+ connect( m_pSliceNormal, SIGNAL( dataChanged( ) ), SIGNAL( dataChanged( ) ) );
+ connect( m_pSliceDistance, SIGNAL( dataChanged( ) ), SIGNAL( dataChanged( ) ) );
+}
+
+void PMJuliaFractalEdit::displayObject( PMObject* o )
+{
+ if( o->isA( "JuliaFractal" ) )
+ {
+ bool readOnly = o->isReadOnly( );
+ m_pDisplayedObject = ( PMJuliaFractal* ) o;
+
+ m_pJuliaParameter->setVector( m_pDisplayedObject->juliaParameter( ) );
+ switch( m_pDisplayedObject->algebraType( ) )
+ {
+ case PMJuliaFractal::Quaternion:
+ m_pAlgebraType->setCurrentItem( 0 );
+ break;
+ case PMJuliaFractal::Hypercomplex:
+ m_pAlgebraType->setCurrentItem( 1 );
+ break;
+ }
+ switch( m_pDisplayedObject->functionType( ) )
+ {
+ case PMJuliaFractal::FTsqr:
+ m_pFunctionType->setCurrentItem( 0 );
+ break;
+ case PMJuliaFractal::FTcube:
+ m_pFunctionType->setCurrentItem( 1 );
+ break;
+ case PMJuliaFractal::FTexp:
+ m_pFunctionType->setCurrentItem( 2 );
+ break;
+ case PMJuliaFractal::FTreciprocal:
+ m_pFunctionType->setCurrentItem( 3 );
+ break;
+ case PMJuliaFractal::FTsin:
+ m_pFunctionType->setCurrentItem( 4 );
+ break;
+ case PMJuliaFractal::FTasin:
+ m_pFunctionType->setCurrentItem( 5 );
+ break;
+ case PMJuliaFractal::FTsinh:
+ m_pFunctionType->setCurrentItem( 6 );
+ break;
+ case PMJuliaFractal::FTasinh:
+ m_pFunctionType->setCurrentItem( 7 );
+ break;
+ case PMJuliaFractal::FTcos:
+ m_pFunctionType->setCurrentItem( 8 );
+ break;
+ case PMJuliaFractal::FTacos:
+ m_pFunctionType->setCurrentItem( 9 );
+ break;
+ case PMJuliaFractal::FTcosh:
+ m_pFunctionType->setCurrentItem( 10 );
+ break;
+ case PMJuliaFractal::FTacosh:
+ m_pFunctionType->setCurrentItem( 11 );
+ break;
+ case PMJuliaFractal::FTtan:
+ m_pFunctionType->setCurrentItem( 12 );
+ break;
+ case PMJuliaFractal::FTatan:
+ m_pFunctionType->setCurrentItem( 13 );
+ break;
+ case PMJuliaFractal::FTtanh:
+ m_pFunctionType->setCurrentItem( 14 );
+ break;
+ case PMJuliaFractal::FTatanh:
+ m_pFunctionType->setCurrentItem( 15 );
+ break;
+ case PMJuliaFractal::FTlog:
+ m_pFunctionType->setCurrentItem( 16 );
+ break;
+ case PMJuliaFractal::FTpwr:
+ m_pFunctionType->setCurrentItem( 17 );
+ break;
+ }
+ m_pExponents->setVector( m_pDisplayedObject->exponent( ) );
+ if( m_pDisplayedObject->functionType( ) == PMJuliaFractal::FTpwr )
+ {
+ m_pExponents->show( );
+ m_pExponentsLabel->show( );
+ }
+ else
+ {
+ m_pExponents->hide( );
+ m_pExponentsLabel->hide( );
+ }
+
+ m_pMaxIterations->setValue( m_pDisplayedObject->maximumIterations( ) );
+ m_pPrecision->setValue( m_pDisplayedObject->precision( ) );
+ m_pSliceNormal->setVector( m_pDisplayedObject->sliceNormal( ) );
+ m_pSliceDistance->setValue( m_pDisplayedObject->sliceDistance( ) );
+
+ m_pJuliaParameter->setReadOnly( readOnly );
+ m_pAlgebraType->setEnabled( !readOnly );
+ m_pFunctionType->setEnabled( !readOnly );
+ m_pExponents->setReadOnly( readOnly );
+ m_pMaxIterations->setReadOnly( readOnly );
+ m_pPrecision->setReadOnly( readOnly );
+ m_pSliceNormal->setReadOnly( readOnly );
+ m_pSliceDistance->setReadOnly( readOnly );
+
+ Base::displayObject( o );
+ }
+ else
+ kdError( PMArea ) << "PMJuliaFractalEdit: Can't display object\n";
+}
+
+void PMJuliaFractalEdit::saveContents( )
+{
+ if( m_pDisplayedObject )
+ {
+ Base::saveContents( );
+ PMVector p( 4 );
+
+ m_pDisplayedObject->setJuliaParameter( m_pJuliaParameter->vector( ) );
+ switch( m_pAlgebraType->currentItem( ) )
+ {
+ case 0:
+ m_pDisplayedObject->setAlgebraType( PMJuliaFractal::Quaternion );
+ break;
+ case 1:
+ m_pDisplayedObject->setAlgebraType( PMJuliaFractal::Hypercomplex );
+ break;
+ default:
+ m_pDisplayedObject->setAlgebraType( PMJuliaFractal::Quaternion );
+ break;
+ }
+ switch( m_pFunctionType->currentItem( ) )
+ {
+ case 0:
+ m_pDisplayedObject->setFunctionType( PMJuliaFractal::FTsqr );
+ break;
+ case 1:
+ m_pDisplayedObject->setFunctionType( PMJuliaFractal::FTcube );
+ break;
+ case 2:
+ m_pDisplayedObject->setFunctionType( PMJuliaFractal::FTexp );
+ break;
+ case 3:
+ m_pDisplayedObject->setFunctionType( PMJuliaFractal::FTreciprocal );
+ break;
+ case 4:
+ m_pDisplayedObject->setFunctionType( PMJuliaFractal::FTsin );
+ break;
+ case 5:
+ m_pDisplayedObject->setFunctionType( PMJuliaFractal::FTasin );
+ break;
+ case 6:
+ m_pDisplayedObject->setFunctionType( PMJuliaFractal::FTsinh );
+ break;
+ case 7:
+ m_pDisplayedObject->setFunctionType( PMJuliaFractal::FTasinh );
+ break;
+ case 8:
+ m_pDisplayedObject->setFunctionType( PMJuliaFractal::FTcos );
+ break;
+ case 9:
+ m_pDisplayedObject->setFunctionType( PMJuliaFractal::FTacos );
+ break;
+ case 10:
+ m_pDisplayedObject->setFunctionType( PMJuliaFractal::FTcosh );
+ break;
+ case 11:
+ m_pDisplayedObject->setFunctionType( PMJuliaFractal::FTacosh );
+ break;
+ case 12:
+ m_pDisplayedObject->setFunctionType( PMJuliaFractal::FTtan );
+ break;
+ case 13:
+ m_pDisplayedObject->setFunctionType( PMJuliaFractal::FTatan );
+ break;
+ case 14:
+ m_pDisplayedObject->setFunctionType( PMJuliaFractal::FTtanh );
+ break;
+ case 15:
+ m_pDisplayedObject->setFunctionType( PMJuliaFractal::FTatanh );
+ break;
+ case 16:
+ m_pDisplayedObject->setFunctionType( PMJuliaFractal::FTlog );
+ break;
+ case 17:
+ m_pDisplayedObject->setFunctionType( PMJuliaFractal::FTpwr );
+ break;
+ default:
+ m_pDisplayedObject->setFunctionType( PMJuliaFractal::FTsqr );
+ break;
+ }
+ if( m_pExponents->isVisible( ) )
+ m_pDisplayedObject->setExponent( m_pExponents->vector( ) );
+ m_pDisplayedObject->setMaximumIterations( m_pMaxIterations->value( ) );
+ m_pDisplayedObject->setPrecision( m_pPrecision->value( ) );
+ m_pDisplayedObject->setSliceNormal( m_pSliceNormal->vector( ) );
+ m_pDisplayedObject->setSliceDistance( m_pSliceDistance->value( ) );
+ }
+}
+
+bool PMJuliaFractalEdit::isDataValid( )
+{
+ if( !m_pJuliaParameter->isDataValid( ) )
+ return false;
+ if( m_pExponents->isVisible( ) )
+ if( !m_pExponents->isDataValid( ) )
+ return false;
+ if( !m_pMaxIterations->isDataValid( ) )
+ return false;
+ if( !m_pPrecision->isDataValid( ) )
+ return false;
+ if( !m_pSliceNormal->isDataValid( ) )
+ return false;
+ PMVector v = m_pSliceNormal->vector( );
+ if( approxZero( v.abs( ) ) )
+ {
+ KMessageBox::error( this, i18n( "The slice normal vector may not be a null vector." ),
+ i18n( "Error" ) );
+ return false;
+ }
+ if( approxZero( v[3] ) )
+ {
+ KMessageBox::error( this, i18n( "The 'k' component of the slice normal vector may not be zero." ),
+ i18n( "Error" ) );
+ return false;
+ }
+
+ if( !m_pSliceDistance->isDataValid( ) )
+ return false;
+
+ if( m_pAlgebraType->currentItem( ) == 0 )
+ {
+ if( m_pFunctionType->currentItem( ) > 1 )
+ {
+ KMessageBox::error( this, i18n( "Only the functions 'sqr' and 'cube' "
+ "are defined in the quaternion algebra." ),
+ i18n( "Error" ) );
+ return false;
+ }
+ }
+
+
+ return Base::isDataValid( );
+}
+
+void PMJuliaFractalEdit::slotAlgebraTypeSelected( int )
+{
+ emit dataChanged( );
+}
+
+void PMJuliaFractalEdit::slotFunctionTypeSelected( int index )
+{
+ if( index == 17 )
+ {
+ m_pExponents->show( );
+ m_pExponentsLabel->show( );
+ }
+ else
+ {
+ m_pExponents->hide( );
+ m_pExponentsLabel->hide( );
+ }
+ emit dataChanged( );
+}
+
+#include "pmjuliafractaledit.moc"