{"action":"created","comment":{"url":"https://api.github.com/repos/DGtal-team/DGtal/pulls/comments/28366071","id":28366071,"diff_hunk":"@@ -0,0 +1,700 @@\n+/**\n+ *  This program is free software: you can redistribute it and/or modify\n+ *  it under the terms of the GNU Lesser General Public License as\n+ *  published by the Free Software Foundation, either version 3 of the\n+ *  License, or  (at your option) any later version.\n+ *\n+ *  This program is distributed in the hope that it will be useful,\n+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n+ *  GNU General Public License for more details.\n+ *\n+ *  You should have received a copy of the GNU General Public License\n+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n+ *\n+ **/\n+\n+#pragma once\n+\n+/**\n+ * @file AlphaThickSegmentComputer.h\n+ * @author Bertrand Kerautret (\\c kerautre@loria.fr )\n+ * LORIA (CNRS, UMR 7503), University of Nancy, France\n+ * @author Alexandre Faure\n+ * @author Fabien Feschet \n+ * @author Mohammad Said\n+ * @author Jacques-Olivier Lachaud\n+ *\n+ * @date 2015/01/05\n+ *\n+ * Header file for module AlphaThickSegmentComputer.cpp\n+ *\n+ * This file is part of the DGtal library.\n+ */\n+\n+#if defined(AlphaThickSegmentComputer_RECURSES)\n+#error Recursive header files inclusion detected in AlphaThickSegmentComputer.h\n+#else // defined(AlphaThickSegmentComputer_RECURSES)\n+/** Prevents recursive inclusion of headers. */\n+#define AlphaThickSegmentComputer_RECURSES\n+\n+#if !defined AlphaThickSegmentComputer_h\n+/** Prevents repeated inclusion of headers. */\n+#define AlphaThickSegmentComputer_h\n+\n+//////////////////////////////////////////////////////////////////////////////\n+// Inclusions\n+#include <iostream>\n+#include \"DGtal/base/Common.h\"\n+#include \"DGtal/base/ReverseIterator.h\"\n+#include \"DGtal/kernel/SpaceND.h\"\n+#include \"DGtal/geometry/surfaces/ParallelStrip.h\"\n+//////////////////////////////////////////////////////////////////////////////\n+\n+namespace DGtal\n+{\n+\n+/////////////////////////////////////////////////////////////////////////////\n+// class AlphaThickSegmentComputer\n+/**\n+ * Description of class 'AlphaThickSegmentComputer' <p>\n+ *\n+ * \\brief Aim: This class is devoted to the recognition of the alpha\n+ * thick segment as described in \\cite FaureTangential2008 . From a\n+ * maximal diagonal alphaMax thickness, it allows to apply the recognition\n+ * of a thick segment with the ability to take into accounts some\n+ * noise. Moreover the segment can be detected from points not\n+ * necessary connected and/or with floating coordinates.\n+ *\n+ * As other solutions like \\cite DebledRennessonBlurred2005 the\n+ * algorithm given here is based on the height/width computation of\n+ * the convex hull computed from a given set of points. The actual\n+ * implementation exploits the height/width maintenance defined from\n+ * the \\cite FaureTangential2008 (see \\cite FaureTangential2008 page\n+ * 363) which reduces the complexity from \\f$O(n\\ log\\ n) \\f$ into\n+ * \\f$O( log\\ n) \\f$.  Note that the convexhull maintenance in linear\n+ * time (with point substraction) proposed by Buzer \\cite\n+ * lilianComputing2007 is not yet implemented.\n+ *\n+ *\n+ *\n+ * @tparam TInputPoint the type of the input point which have to be of\n+ * dimension 2.\n+ * \n+ * @tparam TConstIterator the type of iterator of candidate points\n+ * (used in the init with iterator) which should be readable and\n+ * forward. By default the iterator is set to the const_iterator of std::vector< TInputPoint > .\n+ *\n+ *\n+ * This class is a model of ForwardContainer and  CForwardSegmentComputer.  \n+ * It is also default constructible, copy  constructible, assignable and equality comparable.\n+ *\n+ *\n+ * A typical application of an alpha thick segment recognition can be\n+ * done as follows:\n+ * - If you consider input point with floating coordinates, you can define this type:\n+ *  @snippet examples/geometry/curves/exampleAlphaThickSegmentNoisy.cpp exampleAlphaThickSegementNoisyTypedef\n+ *\n+ * - Then import eventually a vector containing the input points by using the PointListReader class:\n+ *  @snippet examples/geometry/curves/exampleAlphaThickSegmentNoisy.cpp exampleAlphaThickSegementNoisyReadFile \n+ * \n+ * - Finally apply the segment recognition (here of maximal thickness 15)  by adding the sequence (forward) of contour points: \n+ *  @snippet examples/geometry/curves/exampleAlphaThickSegmentNoisy.cpp exampleAlphaThickSegementNoisInitAndReco \n+ *  @note The maximal thickness given in initialization is the same than\n+ *  the width given by the method width() of the ParallelStrip primitive\n+ *  (not the vertical/horizontal width of the convex hull).\n+ *\n+ *  \n+ * - If you use a Board2D display, you can draw the resulting segment like other 2D objects:\n+ *  @snippet examples/geometry/curves/exampleAlphaThickSegmentNoisy.cpp exampleAlphaThickSegementDisplay \n+ * \n+ * The complete example of segment recognition is given in exampleAlphaThickSegmentNoisy.cpp\n+ *\n+ * @note You can also construct the segment by using an input point iterator in initialisation (see @ref moduleAlphaThickSegmentReco for more details) \n+ *\n+ * The proposed implementation is mainly a backport from\n+ * [ImaGene](https://gforge.liris.cnrs.fr/projects/imagene) with some\n+ * various refactoring.\n+ */\n+\n+\n+template <typename TInputPoint,\n+          typename TConstIterator = typename std::vector< TInputPoint >::const_iterator >\n+\n+class AlphaThickSegmentComputer\n+{\n+\n+  // ----------------------- public types --------------------------------------\n+  BOOST_STATIC_ASSERT(( TInputPoint::dimension == 2 ));\n+  \n+public:\n+  typedef TInputPoint InputPoint;\n+  typedef InputPoint InputVector;\n+  \n+  typedef std::vector< InputPoint > InputPointContainer;\n+  typedef typename InputPointContainer::size_type Size;\n+  typedef typename InputPointContainer::const_iterator ContainerConstIterator;\n+  typedef typename InputPointContainer::iterator Iterator;\n+  typedef TConstIterator ConstIterator;\n+  typedef ParallelStrip< SpaceND< 2,  DGtal::int32_t > ,true,true> Primitive;  \n+  \n+  /**\n+   * Type of embedded points \n+   * @see getBasicBoundingBox, getRealBoudingBox, getBoundingBoxFromExtremPoints\n+   */\n+  typedef DGtal::PointVector<2, double> PointD; \n+\n+  typedef AlphaThickSegmentComputer<InputPoint, ConstIterator> Self; \n+  typedef AlphaThickSegmentComputer<InputPoint, ReverseIterator<ConstIterator> > Reverse; \n+\n+\n+  // ----------------------- internal types --------------------------------------\n+\n+private: \n+  struct State{\n+    std::deque<InputPoint> melkmanQueue; /** Melkman algorithm main dequeu */\n+    InputPoint lastFront; /** the last point added at the front of the alpha thick segment */\n+    InputPoint lastBack; /** the last point added at the back of the alpha thick segment */\n+    InputPoint edgePh; /** one the convexhull edge point of the (edge, vertex) pair used to compute the convexhull height */\n+    InputPoint edgeQh; /** one the convexhull edge point of the (edge, vertex) pair used to compute the convexhull height */\n+    InputPoint vertexSh; /** one the convexhull vertex of the (edge, vertex) pair used to compute the convexhull height */\n+    bool isMelkmanInitialized; /** well initialized when at least 3 points are given.  */ \n+    double convexHullHeight;  /** Used in melkmanMainDiagonal() */\n+    double actualThickness; /*the actual thickness of the current segment*/\n+  };\n+    \n+  \n+  // ----------------------- Standard services ------------------------------\n+public:\n+  \n+\n+  /**\n+   * Constructor.\n+   */\n+  AlphaThickSegmentComputer();\n+\n+\n+  /**\n+   * Destructor.\n+   */\n+  ~AlphaThickSegmentComputer();\n+  \n+\n+  /**\n+   * Copy constructor.\n+   *\n+   * @param[in] other the object to clone.\n+   */\n+  AlphaThickSegmentComputer ( const AlphaThickSegmentComputer & other );\n+  \n+\n+  /**\n+   * Assignment.\n+   *\n+   * @param other the object to copy.\n+   * @return a reference on 'this'.\n+   */\n+  AlphaThickSegmentComputer & operator= ( const AlphaThickSegmentComputer & other );\n+  \n+\n+  /** \n+   * @return a default-constructed instance of Self \n+   */\n+  Self getSelf() const;\n+\n+  \n+  /**\n+   * @return a default-constructed instance of Reverse\n+   */\n+  Reverse getReverse() const;\n+  \n+  /**\n+   * Equality operator.\n+   * @param other the object to compare with.\n+   * @return 'true' if the AlphaThickSegment representations\n+   * and the ranges of the two objects match,\n+   * 'false' otherwise\n+   */\n+  bool operator==( const AlphaThickSegmentComputer & other ) const;\n+  \n+  /**\n+   * Difference operator.\n+   * @param other the object to compare with.\n+   * @return 'false' if equal\n+   * 'true' otherwise\n+   */\n+  bool operator!=( const AlphaThickSegmentComputer & other ) const;\n+\n+  /**\n+   * Initialisation from a maximal thickness. The maximal thickness\n+   * corresponds to the width of the ParallelStrip primitive. \n+   *\n+   * @note By using this initialisation the computer will store the\n+   * internal points (needed for length computation and display). To\n+   * avoid this storage, you can use the initialisation given from the\n+   * an iterator @see init().\n+   *\n+   * @param[in] aThickness the maximal thickness of the alpha thick segment (alpha_max).\n+   *\n+   *\n+   */  \n+  void init(double aThickness);  \n+  \n+  \n+\n+\n+  //-------------------- model of ForwardContainer -----------------------------\n+public:\n+\n+  /**\n+   * @return the number of distinct points stored in the container.\n+   * @note it returns 0 if segment computer is initialized with a curve\n+   * iterator without the option of saving samples).\n+   */\n+  Size size() const;\n+  \n+  \n+  /**\n+   * @return 'true' if and only if the container contains no point. \n+   * @note: returns always 'true' if the segment computer is initialized with a curve\n+   * const iterator without the option of saving samples).\n+   */\n+  bool empty() const;\n+  \n+  \n+  /**\n+   * @return a const iterator pointing on the first point given in the\n+   * container associated to the current alpha thick segment (is empty\n+   * if the saving option is not selected in the init method).\n+   */\n+  ContainerConstIterator containerBegin() const;\n+\n+\n+  /**\n+   * @return a const iterator pointing after the last point given in the\n+   * container associated to the current alpha thick segment (is\n+   * empty if the saving option is not selected in the init method).\n+   */\n+  ContainerConstIterator containerEnd() const;\n+\n+\n+  /**\n+   * @return a const iterator pointing on the first point of the\n+   * current alpha thick segment. Usefull only if the initialisation was\n+   * done with a contour iterator (else, it is empty).\n+   */\n+  ConstIterator begin() const;\n+\n+\n+  /**\n+   * @returns a const iterator pointing after the last point stored in\n+   * the current alpha thick segment container. Usefull only if the\n+   * initialisation was done with a contour iterator (else, it is\n+   * empty).\n+   */\n+  ConstIterator end() const;\n+\n+\n+  /**\n+   * NB: std version.\n+   * @return the maximal allowed number of points in the current alpha thick segment.\n+   * @see maxSize\n+   */\n+  Size max_size() const;\n+\n+  \n+  /**\n+   * same as max_size\n+   * @return the maximal allowed number of points in the current alpha thick segment.\n+   */\n+  Size maxSize() const;  \n+  \n+\n+\n+\n+  //-------------------- model of CForwardSegmentComputer ----------------\n+\n+public:\n+\n+  /**\n+   * Initialisation with an ConstIterator (to conform to\n+   * CForwardSegmentComputer).  The maximal thickness corresponds to\n+   * the width of the ParallelStrip primitive (set to 1 by default).\n+   *\n+   * @param[in] it an iterator on input points.\n+   * @param[in] aThickness the thickness of the alpha thick segment (default 1.0).\n+   */  \n+  void init(const ConstIterator &it, double aThickness=1.0);    \n+  \n+  \n+  /**\n+   * Tries to extend front the current alpha thick segment with the\n+   * next contour point and checks if we have still an alpha thick\n+   * segment of thickness less or equal to the initial value\n+   * alpha_max. If it is the case the new point is added and the\n+   * segment parameters are updated, otherwise the alpha thick segment\n+   * is keep in its original state.\n+   *\n+   * @return 'true' if the segment has been extended and 'false'\n+   * otherwise (the object is then in its original state).\n+   */\n+  bool extendFront();\n+\n+\n+  /**\n+   *  Tests whether the current alpha thick segment can be extended at\n+   *  the front with the next contour point i.e checks if we have\n+   *  still an alpha thick segment of width alpha_max after adding the\n+   *  given point \\aPoint. The segment parameters are keep in its\n+   *  original state.\n+   *  \n+   * @return 'true' if the segment can be extended with the given point, 'false' otherwise.\n+   */\n+  bool isExtendableFront();\n+\n+  \n+  /**\n+   *  Tests whether the current alpha thick segment can be extended, i.e\n+   *  checks if we have still an alpha thick segment of width alpha_max after\n+   *  adding the given point \\aPoint. The segment parameters are keep\n+   *  in its original state.\n+   *  \n+   * @param[in] aPoint the point to be tested for the segment extension.\n+   * @return 'true' if the segment can be extended with the given point, 'false' otherwise.\n+   */\n+  bool isExtendableFront(const InputPoint &aPoint);\n+\n+\n+  /**\n+   * Tries to add the point \\a aPoint at the front of the current alpha thick\n+   * segment and checks if we have still an alpha thick segment of thickness\n+   * less or equal to the initial value alpha_max. If it is the case\n+   * the new point is added and the segment parameters are updated,\n+   * otherwise the alpha thick segment is keep in its original state.\n+   *\n+   * @param[in] aPoint the new point to extend the current segment.\n+   * @return 'true' if the segment has been extended and 'false'\n+   * otherwise (the object is then in its original state).\n+   */\n+  bool extendFront(const InputPoint &aPoint);\n+  \n+ \n+\n+  //-------------------- Primitive services -----------------------------\n+  \n+  \n+  /**\n+     Returns the current primitive recognized by this computer,\n+     which is a ParallelStrip of axis width smaller than the one\n+     specified at instanciation.\n+  */\n+  Primitive primitive() const;\n+  \n+  \n+\n+  \n+    // ----------------------- Interface --------------------------------------\n+public:\n+  \n+  \n+  /**\n+   * Checks the validity/consistency of the object.\n+   * @return 'true' if the object is valid, 'false' otherwise.\n+   */\n+  bool isValid() const;\n+  \n+\n+  /**\n+   * Computes the paralell strip params from the current state of the segment.\n+   * @param[out] mu the minimal value of N.X (with N is the normal vector of the segment).\n+   * @param[out] N the normal of the vector (not normalized).\n+   * @param[out] nu the width of the strip. \n+   *\n+   **/\n+  void computeParalellStripParams(double &mu, PointD &N, double &nu) const;\n+  \n+ \n+   /**\n+   * @return the segment length defined from the basic bouding box (@see getBasicBoundingBox).","path":"src/DGtal/geometry/curves/AlphaThickSegmentComputer.h","position":418,"original_position":418,"commit_id":"304d8924280dcaabe0b7dee2421267dd96ba2e5c","original_commit_id":"304d8924280dcaabe0b7dee2421267dd96ba2e5c","user":{"login":"kerautret","id":772865,"avatar_url":"https://avatars.githubusercontent.com/u/772865?v=3","gravatar_id":"","url":"https://api.github.com/users/kerautret","html_url":"https://github.com/kerautret","followers_url":"https://api.github.com/users/kerautret/followers","following_url":"https://api.github.com/users/kerautret/following{/other_user}","gists_url":"https://api.github.com/users/kerautret/gists{/gist_id}","starred_url":"https://api.github.com/users/kerautret/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kerautret/subscriptions","organizations_url":"https://api.github.com/users/kerautret/orgs","repos_url":"https://api.github.com/users/kerautret/repos","events_url":"https://api.github.com/users/kerautret/events{/privacy}","received_events_url":"https://api.github.com/users/kerautret/received_events","type":"User","site_admin":false},"body":"well, I propose to rename:\r\n-  getBasicBoundingBox -> getBoundingBoxFromExtremPoints (same name as the one with point parameters)\r\n- getRealBoundingBox -> getBoundingBox\r\nIs it ok for you  ?","created_at":"2015-04-14T20:19:00Z","updated_at":"2015-04-14T20:19:00Z","html_url":"https://github.com/DGtal-team/DGtal/pull/963#discussion_r28366071","pull_request_url":"https://api.github.com/repos/DGtal-team/DGtal/pulls/963","_links":{"self":{"href":"https://api.github.com/repos/DGtal-team/DGtal/pulls/comments/28366071"},"html":{"href":"https://github.com/DGtal-team/DGtal/pull/963#discussion_r28366071"},"pull_request":{"href":"https://api.github.com/repos/DGtal-team/DGtal/pulls/963"}}},"pull_request":{"url":"https://api.github.com/repos/DGtal-team/DGtal/pulls/963","id":29885353,"html_url":"https://github.com/DGtal-team/DGtal/pull/963","diff_url":"https://github.com/DGtal-team/DGtal/pull/963.diff","patch_url":"https://github.com/DGtal-team/DGtal/pull/963.patch","issue_url":"https://api.github.com/repos/DGtal-team/DGtal/issues/963","number":963,"state":"open","locked":false,"title":"AlphaThickSegmentComputer","user":{"login":"kerautret","id":772865,"avatar_url":"https://avatars.githubusercontent.com/u/772865?v=3","gravatar_id":"","url":"https://api.github.com/users/kerautret","html_url":"https://github.com/kerautret","followers_url":"https://api.github.com/users/kerautret/followers","following_url":"https://api.github.com/users/kerautret/following{/other_user}","gists_url":"https://api.github.com/users/kerautret/gists{/gist_id}","starred_url":"https://api.github.com/users/kerautret/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kerautret/subscriptions","organizations_url":"https://api.github.com/users/kerautret/orgs","repos_url":"https://api.github.com/users/kerautret/repos","events_url":"https://api.github.com/users/kerautret/events{/privacy}","received_events_url":"https://api.github.com/users/kerautret/received_events","type":"User","site_admin":false},"body":"New primitive to handle noisy digital contours (or polygonal contours)\r\nFor now it is only a model of CForwardSegmentComputer but can be useful to upcoming implementation of GMC or meaningful Thickness.\r\n\r\n(Mainly a back port from Imagene from initial Fabien and Alexandre implementation)","created_at":"2015-02-24T10:23:07Z","updated_at":"2015-04-14T20:19:00Z","closed_at":null,"merged_at":null,"merge_commit_sha":"7e3d6f6955d9c76c85d885ad6c882bf6e0b0d9f4","assignee":null,"milestone":{"url":"https://api.github.com/repos/DGtal-team/DGtal/milestones/9","html_url":"https://github.com/DGtal-team/DGtal/milestones/0.9","labels_url":"https://api.github.com/repos/DGtal-team/DGtal/milestones/9/labels","id":776797,"number":9,"title":"0.9","description":"","creator":{"login":"dcoeurjo","id":700165,"avatar_url":"https://avatars.githubusercontent.com/u/700165?v=3","gravatar_id":"","url":"https://api.github.com/users/dcoeurjo","html_url":"https://github.com/dcoeurjo","followers_url":"https://api.github.com/users/dcoeurjo/followers","following_url":"https://api.github.com/users/dcoeurjo/following{/other_user}","gists_url":"https://api.github.com/users/dcoeurjo/gists{/gist_id}","starred_url":"https://api.github.com/users/dcoeurjo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dcoeurjo/subscriptions","organizations_url":"https://api.github.com/users/dcoeurjo/orgs","repos_url":"https://api.github.com/users/dcoeurjo/repos","events_url":"https://api.github.com/users/dcoeurjo/events{/privacy}","received_events_url":"https://api.github.com/users/dcoeurjo/received_events","type":"User","site_admin":false},"open_issues":15,"closed_issues":12,"state":"open","created_at":"2014-09-03T13:26:56Z","updated_at":"2015-04-07T11:47:33Z","due_on":null,"closed_at":null},"commits_url":"https://api.github.com/repos/DGtal-team/DGtal/pulls/963/commits","review_comments_url":"https://api.github.com/repos/DGtal-team/DGtal/pulls/963/comments","review_comment_url":"https://api.github.com/repos/DGtal-team/DGtal/pulls/comments{/number}","comments_url":"https://api.github.com/repos/DGtal-team/DGtal/issues/963/comments","statuses_url":"https://api.github.com/repos/DGtal-team/DGtal/statuses/304d8924280dcaabe0b7dee2421267dd96ba2e5c","head":{"label":"kerautret:BlurredSegmentsBackPort","ref":"BlurredSegmentsBackPort","sha":"304d8924280dcaabe0b7dee2421267dd96ba2e5c","user":{"login":"kerautret","id":772865,"avatar_url":"https://avatars.githubusercontent.com/u/772865?v=3","gravatar_id":"","url":"https://api.github.com/users/kerautret","html_url":"https://github.com/kerautret","followers_url":"https://api.github.com/users/kerautret/followers","following_url":"https://api.github.com/users/kerautret/following{/other_user}","gists_url":"https://api.github.com/users/kerautret/gists{/gist_id}","starred_url":"https://api.github.com/users/kerautret/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kerautret/subscriptions","organizations_url":"https://api.github.com/users/kerautret/orgs","repos_url":"https://api.github.com/users/kerautret/repos","events_url":"https://api.github.com/users/kerautret/events{/privacy}","received_events_url":"https://api.github.com/users/kerautret/received_events","type":"User","site_admin":false},"repo":{"id":1760445,"name":"DGtal","full_name":"kerautret/DGtal","owner":{"login":"kerautret","id":772865,"avatar_url":"https://avatars.githubusercontent.com/u/772865?v=3","gravatar_id":"","url":"https://api.github.com/users/kerautret","html_url":"https://github.com/kerautret","followers_url":"https://api.github.com/users/kerautret/followers","following_url":"https://api.github.com/users/kerautret/following{/other_user}","gists_url":"https://api.github.com/users/kerautret/gists{/gist_id}","starred_url":"https://api.github.com/users/kerautret/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kerautret/subscriptions","organizations_url":"https://api.github.com/users/kerautret/orgs","repos_url":"https://api.github.com/users/kerautret/repos","events_url":"https://api.github.com/users/kerautret/events{/privacy}","received_events_url":"https://api.github.com/users/kerautret/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/kerautret/DGtal","description":"Digital Geometry Tools and Algorithm Library","fork":true,"url":"https://api.github.com/repos/kerautret/DGtal","forks_url":"https://api.github.com/repos/kerautret/DGtal/forks","keys_url":"https://api.github.com/repos/kerautret/DGtal/keys{/key_id}","collaborators_url":"https://api.github.com/repos/kerautret/DGtal/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/kerautret/DGtal/teams","hooks_url":"https://api.github.com/repos/kerautret/DGtal/hooks","issue_events_url":"https://api.github.com/repos/kerautret/DGtal/issues/events{/number}","events_url":"https://api.github.com/repos/kerautret/DGtal/events","assignees_url":"https://api.github.com/repos/kerautret/DGtal/assignees{/user}","branches_url":"https://api.github.com/repos/kerautret/DGtal/branches{/branch}","tags_url":"https://api.github.com/repos/kerautret/DGtal/tags","blobs_url":"https://api.github.com/repos/kerautret/DGtal/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/kerautret/DGtal/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/kerautret/DGtal/git/refs{/sha}","trees_url":"https://api.github.com/repos/kerautret/DGtal/git/trees{/sha}","statuses_url":"https://api.github.com/repos/kerautret/DGtal/statuses/{sha}","languages_url":"https://api.github.com/repos/kerautret/DGtal/languages","stargazers_url":"https://api.github.com/repos/kerautret/DGtal/stargazers","contributors_url":"https://api.github.com/repos/kerautret/DGtal/contributors","subscribers_url":"https://api.github.com/repos/kerautret/DGtal/subscribers","subscription_url":"https://api.github.com/repos/kerautret/DGtal/subscription","commits_url":"https://api.github.com/repos/kerautret/DGtal/commits{/sha}","git_commits_url":"https://api.github.com/repos/kerautret/DGtal/git/commits{/sha}","comments_url":"https://api.github.com/repos/kerautret/DGtal/comments{/number}","issue_comment_url":"https://api.github.com/repos/kerautret/DGtal/issues/comments{/number}","contents_url":"https://api.github.com/repos/kerautret/DGtal/contents/{+path}","compare_url":"https://api.github.com/repos/kerautret/DGtal/compare/{base}...{head}","merges_url":"https://api.github.com/repos/kerautret/DGtal/merges","archive_url":"https://api.github.com/repos/kerautret/DGtal/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/kerautret/DGtal/downloads","issues_url":"https://api.github.com/repos/kerautret/DGtal/issues{/number}","pulls_url":"https://api.github.com/repos/kerautret/DGtal/pulls{/number}","milestones_url":"https://api.github.com/repos/kerautret/DGtal/milestones{/number}","notifications_url":"https://api.github.com/repos/kerautret/DGtal/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/kerautret/DGtal/labels{/name}","releases_url":"https://api.github.com/repos/kerautret/DGtal/releases{/id}","created_at":"2011-05-17T11:37:44Z","updated_at":"2015-03-30T21:22:32Z","pushed_at":"2015-04-10T13:06:20Z","git_url":"git://github.com/kerautret/DGtal.git","ssh_url":"git@github.com:kerautret/DGtal.git","clone_url":"https://github.com/kerautret/DGtal.git","svn_url":"https://github.com/kerautret/DGtal","homepage":"http://liris.cnrs.fr/dgtal","size":126389,"stargazers_count":1,"watchers_count":1,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":1,"default_branch":"master"}},"base":{"label":"DGtal-team:master","ref":"master","sha":"697ef51457abd05648a80494e2b46cdbc3605b72","user":{"login":"DGtal-team","id":1013900,"avatar_url":"https://avatars.githubusercontent.com/u/1013900?v=3","gravatar_id":"","url":"https://api.github.com/users/DGtal-team","html_url":"https://github.com/DGtal-team","followers_url":"https://api.github.com/users/DGtal-team/followers","following_url":"https://api.github.com/users/DGtal-team/following{/other_user}","gists_url":"https://api.github.com/users/DGtal-team/gists{/gist_id}","starred_url":"https://api.github.com/users/DGtal-team/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/DGtal-team/subscriptions","organizations_url":"https://api.github.com/users/DGtal-team/orgs","repos_url":"https://api.github.com/users/DGtal-team/repos","events_url":"https://api.github.com/users/DGtal-team/events{/privacy}","received_events_url":"https://api.github.com/users/DGtal-team/received_events","type":"Organization","site_admin":false},"repo":{"id":1709095,"name":"DGtal","full_name":"DGtal-team/DGtal","owner":{"login":"DGtal-team","id":1013900,"avatar_url":"https://avatars.githubusercontent.com/u/1013900?v=3","gravatar_id":"","url":"https://api.github.com/users/DGtal-team","html_url":"https://github.com/DGtal-team","followers_url":"https://api.github.com/users/DGtal-team/followers","following_url":"https://api.github.com/users/DGtal-team/following{/other_user}","gists_url":"https://api.github.com/users/DGtal-team/gists{/gist_id}","starred_url":"https://api.github.com/users/DGtal-team/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/DGtal-team/subscriptions","organizations_url":"https://api.github.com/users/DGtal-team/orgs","repos_url":"https://api.github.com/users/DGtal-team/repos","events_url":"https://api.github.com/users/DGtal-team/events{/privacy}","received_events_url":"https://api.github.com/users/DGtal-team/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/DGtal-team/DGtal","description":"Digital Geometry Tools and Algorithm Library","fork":false,"url":"https://api.github.com/repos/DGtal-team/DGtal","forks_url":"https://api.github.com/repos/DGtal-team/DGtal/forks","keys_url":"https://api.github.com/repos/DGtal-team/DGtal/keys{/key_id}","collaborators_url":"https://api.github.com/repos/DGtal-team/DGtal/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/DGtal-team/DGtal/teams","hooks_url":"https://api.github.com/repos/DGtal-team/DGtal/hooks","issue_events_url":"https://api.github.com/repos/DGtal-team/DGtal/issues/events{/number}","events_url":"https://api.github.com/repos/DGtal-team/DGtal/events","assignees_url":"https://api.github.com/repos/DGtal-team/DGtal/assignees{/user}","branches_url":"https://api.github.com/repos/DGtal-team/DGtal/branches{/branch}","tags_url":"https://api.github.com/repos/DGtal-team/DGtal/tags","blobs_url":"https://api.github.com/repos/DGtal-team/DGtal/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/DGtal-team/DGtal/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/DGtal-team/DGtal/git/refs{/sha}","trees_url":"https://api.github.com/repos/DGtal-team/DGtal/git/trees{/sha}","statuses_url":"https://api.github.com/repos/DGtal-team/DGtal/statuses/{sha}","languages_url":"https://api.github.com/repos/DGtal-team/DGtal/languages","stargazers_url":"https://api.github.com/repos/DGtal-team/DGtal/stargazers","contributors_url":"https://api.github.com/repos/DGtal-team/DGtal/contributors","subscribers_url":"https://api.github.com/repos/DGtal-team/DGtal/subscribers","subscription_url":"https://api.github.com/repos/DGtal-team/DGtal/subscription","commits_url":"https://api.github.com/repos/DGtal-team/DGtal/commits{/sha}","git_commits_url":"https://api.github.com/repos/DGtal-team/DGtal/git/commits{/sha}","comments_url":"https://api.github.com/repos/DGtal-team/DGtal/comments{/number}","issue_comment_url":"https://api.github.com/repos/DGtal-team/DGtal/issues/comments{/number}","contents_url":"https://api.github.com/repos/DGtal-team/DGtal/contents/{+path}","compare_url":"https://api.github.com/repos/DGtal-team/DGtal/compare/{base}...{head}","merges_url":"https://api.github.com/repos/DGtal-team/DGtal/merges","archive_url":"https://api.github.com/repos/DGtal-team/DGtal/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/DGtal-team/DGtal/downloads","issues_url":"https://api.github.com/repos/DGtal-team/DGtal/issues{/number}","pulls_url":"https://api.github.com/repos/DGtal-team/DGtal/pulls{/number}","milestones_url":"https://api.github.com/repos/DGtal-team/DGtal/milestones{/number}","notifications_url":"https://api.github.com/repos/DGtal-team/DGtal/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/DGtal-team/DGtal/labels{/name}","releases_url":"https://api.github.com/repos/DGtal-team/DGtal/releases{/id}","created_at":"2011-05-06T00:20:52Z","updated_at":"2015-04-14T08:27:14Z","pushed_at":"2015-04-14T12:43:03Z","git_url":"git://github.com/DGtal-team/DGtal.git","ssh_url":"git@github.com:DGtal-team/DGtal.git","clone_url":"https://github.com/DGtal-team/DGtal.git","svn_url":"https://github.com/DGtal-team/DGtal","homepage":"http://dgtal.org","size":195909,"stargazers_count":30,"watchers_count":30,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":36,"mirror_url":null,"open_issues_count":42,"forks":36,"open_issues":42,"watchers":30,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/DGtal-team/DGtal/pulls/963"},"html":{"href":"https://github.com/DGtal-team/DGtal/pull/963"},"issue":{"href":"https://api.github.com/repos/DGtal-team/DGtal/issues/963"},"comments":{"href":"https://api.github.com/repos/DGtal-team/DGtal/issues/963/comments"},"review_comments":{"href":"https://api.github.com/repos/DGtal-team/DGtal/pulls/963/comments"},"review_comment":{"href":"https://api.github.com/repos/DGtal-team/DGtal/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/DGtal-team/DGtal/pulls/963/commits"},"statuses":{"href":"https://api.github.com/repos/DGtal-team/DGtal/statuses/304d8924280dcaabe0b7dee2421267dd96ba2e5c"}}}}