Parcourir la source

Fin du développement de la distance entre deux ensembles de lignes de force. Test à faire

Rémi Synave il y a 8 mois
Parent
commit
c3c6984df7
5 fichiers modifiés avec 44 ajouts et 7 suppressions
  1. 2 2
      SLList/Main.cpp
  2. 25 3
      SLList/SLList.cpp
  3. 4 2
      SLList/SLList.hpp
  4. 9 0
      StrengthLine/StrengthLine.cpp
  5. 4 0
      StrengthLine/StrengthLine.hpp

+ 2 - 2
SLList/Main.cpp

@@ -21,6 +21,6 @@ int main(int argc, char** argv)
   SLList sll1(fichier1);
   SLList sll2(fichier2);
   QImage img(argv[3]);
-  std::pair<double, int> resultat = sll1.distance(&sll2, &img);
-  std::cout << resultat.first << " , " << resultat.second << std::endl;
+  std::pair<double, int> resultat = sll1.distance_avg(&sll2, &img);
+  std::cout << "( " << resultat.first << " , " << resultat.second << " )" << std::endl;
 }

+ 25 - 3
SLList/SLList.cpp

@@ -43,11 +43,33 @@ SLList::SLList (const char* file)
     QJsonArray line = lines[i].toArray();
     QJsonArray point1 = line[0].toArray();
     QJsonArray point2 = line[1].toArray();
-    list << StrengthLine(point1[0].toDouble(), point1[1].toDouble(), point2[0].toDouble(), point2[1].toDouble());
+    list << new StrengthLine(point1[0].toDouble(), point1[1].toDouble(), point2[0].toDouble(), point2[1].toDouble());
   }
 }
 
-std::pair<double, int> SLList::distance(SLList*, QImage*) const
+std::pair<double, int> SLList::distance_avg(SLList* sllist, QImage* img) const
 {
-  return std::make_pair(1, -1);
+  const SLList *list1 = this, *list2 = sllist;
+  if(size() > sllist->size())
+    {
+      list1 = sllist;
+      list2 = this;
+    }
+
+  double sum = 0;
+  double min;
+
+  for(unsigned int i = 0 ; i < list1->size(); i++)
+    {
+      min = list1->get(i)->distance(list2->get(0), img->width(), img->height());
+      
+      for(unsigned int j = 1 ; j < list2->size(); j++)
+	{
+	  double temp = list1->get(i)->distance(list2->get(j), img->width(), img->height());
+	  if(temp < min)
+	    min = temp;
+	}
+      sum += min;
+    }
+  return std::make_pair(sum/list1->size(), size()-sllist->size());
 }

+ 4 - 2
SLList/SLList.hpp

@@ -34,14 +34,16 @@
 class SLList
 {
 private:
-  QList < StrengthLine > list;
+  QList < StrengthLine* > list;
 
 public:
   SLList (const char* file);
   SLList (std::string file) : SLList(file.c_str()){}
   SLList (QString file) : SLList(file.toStdString()){}
 
-  std::pair<double, int> distance(SLList*, QImage*) const;
+  inline unsigned int size() const{return list.size();}
+  inline StrengthLine* get(unsigned int i) const{return list.at(i);}
+  std::pair<double, int> distance_avg(SLList*, QImage*) const;
 };
 
 #endif

+ 9 - 0
StrengthLine/StrengthLine.cpp

@@ -213,6 +213,11 @@ float StrengthLine::ea_score(const StrengthLine *sl, double imgWidth, double img
   return ((sT*sd)*(sT*sd));
 }
 
+float StrengthLine::distance(const StrengthLine *sl, double imgWidth, double imgHeight) const
+{
+  return (1 - ea_score(sl, imgWidth, imgHeight));
+}
+  
 StrengthLine* StrengthLine::getRandomLine (QImage * img)
 {
   std::srand(static_cast<unsigned int>(std::time(nullptr)+std::rand())); 
@@ -244,3 +249,7 @@ StrengthLine* StrengthLine::getRandomLine (int width, int height)
     }
   return new StrengthLine( new QPoint(x1rand, y1rand), new QPoint(x2rand, y2rand) );
 }
+
+std::ostream& operator<<(std::ostream &o, const StrengthLine sl) {
+  return o << "(" << sl.p1->x() << " , " << sl.p1->y() << ") - (" << sl.p2->x() << " , " << sl.p2->y() << ")";
+}

+ 4 - 0
StrengthLine/StrengthLine.hpp

@@ -24,6 +24,7 @@
 #ifndef STRENGTHLINE_HPP
 #define STRENGTHLINE_HPP
 
+#include <iostream>
 #include <cmath>
 
 #include <QPoint>
@@ -48,9 +49,12 @@ public:
   std::pair < QPoint *, QPoint * > interpolateToEdge (QImage * img) const;
   std::pair < QPoint *, QPoint * > interpolateToEdge (int imgWidth, int imgHeight) const;
   float ea_score(const StrengthLine *sl, double imgWidth, double imgHeight) const;
+  float distance(const StrengthLine *sl, double imgWidth, double imgHeight) const;
 
   static StrengthLine* getRandomLine (QImage * img);
   static StrengthLine* getRandomLine (int width, int height);
+
+  friend std::ostream& operator<<(std::ostream&, const StrengthLine);
 };
 
 #endif