Incompatible change: fix method PLQualitativeHue() to have configurable divergence.
authorMartin Lambers <marlam@marlam.de>
Tue, 20 Aug 2019 06:42:02 +0000 (08:42 +0200)
committerMartin Lambers <marlam@marlam.de>
Tue, 20 Aug 2019 06:42:02 +0000 (08:42 +0200)
cmdline.cpp
colormap.cpp
colormap.hpp
colormapwidgets.cpp
colormapwidgets.hpp

index beef679..873e6a0 100644 (file)
@@ -1,5 +1,6 @@
 /*
- * Copyright (C) 2015, 2016 Computer Graphics Group, University of Siegen
+ * Copyright (C) 2015, 2016, 2017, 2018, 2019
+ * Computer Graphics Group, University of Siegen
  * Written by Martin Lambers <martin.lambers@uni-siegen.de>
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -267,6 +268,8 @@ int main(int argc, char* argv[])
             divergence = ColorMap::PLDivergingLightnessDefaultDivergence;
         else if (type == pldiv_saturation)
             divergence = ColorMap::PLDivergingSaturationDefaultDivergence;
+        else if (type == plqual_hue)
+            divergence = ColorMap::PLQualitativeHueDefaultDivergence;
     }
     if (contrast < 0.0f) {
         if (type == brewer_seq)
@@ -394,7 +397,7 @@ int main(int argc, char* argv[])
         clipped = ColorMap::PLDivergingSaturation(n, &(colormap[0]), lightness, saturation, hue, divergence);
         break;
     case plqual_hue:
-        clipped = ColorMap::PLQualitativeHue(n, &(colormap[0]), lightness, saturation, hue);
+        clipped = ColorMap::PLQualitativeHue(n, &(colormap[0]), hue, divergence, lightness, saturation);
         break;
     case cubehelix:
         clipped = ColorMap::CubeHelix(n, &(colormap[0]), hue, rotations, saturation, gamma);
index ce05630..39c5132 100644 (file)
@@ -796,9 +796,9 @@ int PLDivergingSaturation(int n, unsigned char* colormap,
 }
 
 int PLQualitativeHue(int n, unsigned char* colormap,
-        float lightness, float saturation, float hue)
+        float hue, float divergence, float lightness, float saturation)
 {
-    float divergence = twopi * (n - 1.0f) / n;
+    divergence *= (n - 1.0f) / n;
     triplet lch;
     lch.l = std::max(0.01f, lightness * 100.0f);
     lch.c = lch_chroma(lch.l, saturation * 5.0f);
index 7f60da2..e00eb9d 100644 (file)
@@ -1,5 +1,6 @@
 /*
- * Copyright (C) 2015 Computer Graphics Group, University of Siegen
+ * Copyright (C) 2015, 2016, 2017, 2018, 2019
+ * Computer Graphics Group, University of Siegen
  * Written by Martin Lambers <martin.lambers@uni-siegen.de>
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -190,14 +191,16 @@ int PLDivergingSaturation(int n, unsigned char* colormap,
 
 /* Qualitative perceptually linear maps */
 
+const float PLQualitativeHueDefaultHue = 0.0f;
+const float PLQualitativeHueDefaultDivergence = 4.18879020479f; // 2/3 * 2PI
 const float PLQualitativeHueDefaultLightness = 0.55f;
 const float PLQualitativeHueDefaultSaturation = 0.22f;
-const float PLQualitativeHueDefaultHue = 0.0f;
 
 int PLQualitativeHue(int n, unsigned char* colormap,
+        float hue = PLQualitativeHueDefaultHue,
+        float divergence = PLQualitativeHueDefaultDivergence,
         float lightness = PLQualitativeHueDefaultLightness,
-        float saturation = PLQualitativeHueDefaultSaturation,
-        float hue = PLQualitativeHueDefaultHue);
+        float saturation = PLQualitativeHueDefaultSaturation);
 
 /*
  * CubeHelix color maps, as described in
index 5c73ff9..121fb30 100644 (file)
@@ -1,5 +1,6 @@
 /*
- * Copyright (C) 2015, 2016 Computer Graphics Group, University of Siegen
+ * Copyright (C) 2015, 2016, 2017, 2018, 2019
+ * Computer Graphics Group, University of Siegen
  * Written by Martin Lambers <martin.lambers@uni-siegen.de>
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -1119,33 +1120,40 @@ ColorMapPLQualitativeHueWidget::ColorMapPLQualitativeHueWidget() :
     _n_spinbox->setSingleStep(1);
     layout->addWidget(_n_spinbox, 1, 1, 1, 3);
 
+    QLabel* hue_label = new QLabel("Hue:");
+    layout->addWidget(hue_label, 2, 0);
+    _hue_changer = new ColorMapCombinedSliderSpinBox(0, 360, 1);
+    layout->addWidget(_hue_changer->slider, 2, 1, 1, 2);
+    layout->addWidget(_hue_changer->spinbox, 2, 3);
+
+    QLabel* divergence_label = new QLabel("Divergence:");
+    layout->addWidget(divergence_label, 3, 0);
+    _divergence_changer = new ColorMapCombinedSliderSpinBox(0, 360, 1);
+    layout->addWidget(_divergence_changer->slider, 3, 1, 1, 2);
+    layout->addWidget(_divergence_changer->spinbox, 3, 3);
+
     QLabel* lightness_label = new QLabel("Lightness:");
-    layout->addWidget(lightness_label, 2, 0);
+    layout->addWidget(lightness_label, 4, 0);
     _lightness_changer = new ColorMapCombinedSliderSpinBox(0, 1, 0.01f);
-    layout->addWidget(_lightness_changer->slider, 2, 1, 1, 2);
-    layout->addWidget(_lightness_changer->spinbox, 2, 3);
+    layout->addWidget(_lightness_changer->slider, 4, 1, 1, 2);
+    layout->addWidget(_lightness_changer->spinbox, 4, 3);
 
     QLabel* saturation_label = new QLabel("Saturation:");
-    layout->addWidget(saturation_label, 3, 0);
+    layout->addWidget(saturation_label, 5, 0);
     _saturation_changer = new ColorMapCombinedSliderSpinBox(0, 1, 0.01f);
-    layout->addWidget(_saturation_changer->slider, 3, 1, 1, 2);
-    layout->addWidget(_saturation_changer->spinbox, 3, 3);
-
-    QLabel* hue_label = new QLabel("Hue:");
-    layout->addWidget(hue_label, 4, 0);
-    _hue_changer = new ColorMapCombinedSliderSpinBox(0, 360, 1);
-    layout->addWidget(_hue_changer->slider, 4, 1, 1, 2);
-    layout->addWidget(_hue_changer->spinbox, 4, 3);
+    layout->addWidget(_saturation_changer->slider, 5, 1, 1, 2);
+    layout->addWidget(_saturation_changer->spinbox, 5, 3);
 
     layout->setColumnStretch(1, 1);
-    layout->addItem(new QSpacerItem(0, 0), 5, 0, 1, 4);
-    layout->setRowStretch(5, 1);
+    layout->addItem(new QSpacerItem(0, 0), 6, 0, 1, 4);
+    layout->setRowStretch(6, 1);
     setLayout(layout);
 
     connect(_n_spinbox, SIGNAL(valueChanged(int)), this, SLOT(update()));
     connect(_lightness_changer, SIGNAL(valueChanged(float)), this, SLOT(update()));
     connect(_saturation_changer, SIGNAL(valueChanged(float)), this, SLOT(update()));
     connect(_hue_changer, SIGNAL(valueChanged(float)), this, SLOT(update()));
+    connect(_divergence_changer, SIGNAL(valueChanged(float)), this, SLOT(update()));
     reset();
 }
 
@@ -1157,9 +1165,10 @@ void ColorMapPLQualitativeHueWidget::reset()
 {
     _update_lock = true;
     _n_spinbox->setValue(9);
+    _hue_changer->setValue(qRadiansToDegrees(ColorMap::PLQualitativeHueDefaultHue));
+    _divergence_changer->setValue(qRadiansToDegrees(ColorMap::PLQualitativeHueDefaultDivergence));
     _lightness_changer->setValue(ColorMap::PLQualitativeHueDefaultLightness);
     _saturation_changer->setValue(ColorMap::PLQualitativeHueDefaultSaturation);
-    _hue_changer->setValue(qRadiansToDegrees(ColorMap::PLQualitativeHueDefaultHue));
     _update_lock = false;
     update();
 }
@@ -1167,10 +1176,10 @@ void ColorMapPLQualitativeHueWidget::reset()
 QVector<QColor> ColorMapPLQualitativeHueWidget::colorMap(int* clipped) const
 {
     int n;
-    float l, s, h;
-    parameters(n, l, s, h);
+    float h, d, l, s;
+    parameters(n, h, d, l, s);
     QVector<unsigned char> colormap(3 * n);
-    int cl = ColorMap::PLQualitativeHue(n, colormap.data(), l, s, h);
+    int cl = ColorMap::PLQualitativeHue(n, colormap.data(), h, d, l, s);
     if (clipped)
         *clipped = cl;
     return toQColor(colormap);
@@ -1181,12 +1190,13 @@ QString ColorMapPLQualitativeHueWidget::reference() const
     return plqual_hue_reference;
 }
 
-void ColorMapPLQualitativeHueWidget::parameters(int& n, float& lightness, float& saturation, float& hue) const
+void ColorMapPLQualitativeHueWidget::parameters(int& n, float& hue, float& divergence, float& lightness, float& saturation) const
 {
     n = _n_spinbox->value();
+    hue = qDegreesToRadians(_hue_changer->value());
+    divergence = qDegreesToRadians(_divergence_changer->value());
     lightness = _lightness_changer->value();
     saturation = _saturation_changer->value();
-    hue = qDegreesToRadians(_hue_changer->value());
 }
 
 void ColorMapPLQualitativeHueWidget::update()
index 28068b6..a8ff2da 100644 (file)
@@ -1,5 +1,6 @@
 /*
- * Copyright (C) 2015, 2016 Computer Graphics Group, University of Siegen
+ * Copyright (C) 2015, 2016, 2017, 2018, 2019
+ * Computer Graphics Group, University of Siegen
  * Written by Martin Lambers <martin.lambers@uni-siegen.de>
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -301,9 +302,10 @@ Q_OBJECT
 private:
     bool _update_lock;
     QSpinBox* _n_spinbox;
+    ColorMapCombinedSliderSpinBox* _hue_changer;
+    ColorMapCombinedSliderSpinBox* _divergence_changer;
     ColorMapCombinedSliderSpinBox* _lightness_changer;
     ColorMapCombinedSliderSpinBox* _saturation_changer;
-    ColorMapCombinedSliderSpinBox* _hue_changer;
 private slots:
     void update();
 
@@ -314,7 +316,7 @@ public:
     void reset() override;
     QVector<QColor> colorMap(int* clipped = NULL) const override;
     QString reference() const override;
-    void parameters(int& n, float& lightness, float& saturation, float& hue) const;
+    void parameters(int& n, float& hue, float& divergence, float& lightness, float& saturation) const;
 };
 
 class ColorMapCubeHelixWidget : public ColorMapWidget