00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include "TernaryPoint.h"
00031 #include "TernaryConstants.h"
00032
00033 #include <limits>
00034
00035 #include <QChar>
00036 #include <QTextStream>
00037
00038 TernaryPoint::TernaryPoint()
00039 : m_a( -1.0 )
00040 , m_b( -1.0 )
00041 {
00042 Q_ASSERT( !isValid() );
00043 }
00044
00045 TernaryPoint::TernaryPoint( double a, double b )
00046 : m_a( -1.0 )
00047 , m_b( -1.0 )
00048 {
00049 set( a, b );
00050 }
00051
00052 void TernaryPoint::set( double a, double b )
00053 {
00054 if ( a >= 0.0 && a <= 1.0
00055 && b >= 0.0 && b <= 1.0
00056 && 1.0 - a - b >= -2.0 * std::numeric_limits<double>::epsilon() ) {
00057 m_a = a;
00058 m_b = b;
00059 Q_ASSERT( isValid() );
00060 } else {
00061 m_a = -1.0;
00062 m_b = -1.0;
00063 Q_ASSERT( ! isValid() );
00064 }
00065 }
00066
00067 bool TernaryPoint::isValid() const
00068 {
00069 return
00070 m_a >= 0.0 && m_a <= 1.0
00071 && m_b >= 0.0 && m_b <= 1.0
00072 && 1.0 - m_a + m_b >= - std::numeric_limits<double>::epsilon();
00073 }
00074
00075 QDebug operator<<( QDebug stream, const TernaryPoint& point )
00076 {
00077 QString string;
00078 QTextStream text( &string );
00079 text << "[TernaryPoint: ";
00080 if ( point.isValid() ) {
00081 text.setFieldWidth( 2 );
00082 text.setPadChar( QLatin1Char( '0' ) );
00083 text << ( int ) ( point.a() * 100.0 ) << "%|"
00084 << ( int ) ( point.b() * 100.0 ) << "%|"
00085 << ( int ) ( point.c() * 100.0 ) << "%]";
00086 } else {
00087 text << "a=" << point.a() << " - b=" << point.b() << " - INVALID]";
00088 }
00089 stream << string;
00090 return stream;
00091 }
00092
00093 QPointF translate( const TernaryPoint& point )
00094 {
00095 if ( point.isValid() ) {
00096
00097
00098
00099
00100
00101
00102 QPointF bPosition( 1.0 - point.b(), 0.0 );
00103 QPointF aPosition( point.a() * AxisVector_C_A );
00104 QPointF result( bPosition + aPosition );
00105 return result;
00106 } else {
00107 qWarning() << "TernaryPoint::translate(TernaryPoint): cannot translate invalid ternary points:"
00108 << point;
00109 return QPointF();
00110 }
00111 }