From 3912ba19fec977fc80ff0519f5f4477d70d4ebcc Mon Sep 17 00:00:00 2001
From: Yuriy Maksymets <iurii.maksymets@gmail.com>
Date: Thu, 14 Nov 2019 19:35:55 +0000
Subject: [PATCH] Length based matrix weights

---
 src/shapes.js | 49 ++++++++++++++++++++++++-------------------------
 1 file changed, 24 insertions(+), 25 deletions(-)

diff --git a/src/shapes.js b/src/shapes.js
index fb4105a..51e0aae 100644
--- a/src/shapes.js
+++ b/src/shapes.js
@@ -13,7 +13,7 @@ const numAngleCells = 180 / angleStep
 const rhoMax = 1000
 
 const getDistance = (a, b) => {
-  if (!(a & b)) return 0
+  if (!(a && b)) return 0
   return Math.sqrt(
     (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]),
   )
@@ -73,6 +73,14 @@ function boundingCoords(points) {
   }
 }
 
+const LINE_Q = 10
+
+function couldBeLine(points) {
+  const { maxX, minX, maxY, minY } = boundingCoords(points)
+  const [dx, dy] = [maxX - minX, maxY - minY].map((x) => x + 0.00001)
+  return dy / dx > LINE_Q || dx / dy > LINE_Q
+}
+
 const MATRIX_SIZE = 3
 const MATRIX_CENTER_RATIO = 0.65
 
@@ -97,24 +105,27 @@ function computeClusters(points, xBounds, yBounds) {
     .map(() =>
       Array(MATRIX_SIZE)
         .fill()
-        .map(() => []),
+        .map(() => ({ arr: [], sum: 0 })),
     )
   const intervals = points.map((point, i) => ({
     point,
     dist: getDistance(point, points[i + 1]),
   }))
 
+  let totalSum = 0
   intervals.forEach((interval) => {
     const { x, y } = getCluster(interval.point, xBounds, yBounds)
-    clusters[x][y].push(interval)
+    clusters[x][y].arr.push(interval)
+    clusters[x][y].sum += interval.dist
+    totalSum += interval.dist
   })
 
-  return clusters
+  return { arr: clusters, totalSum }
 }
 
-function clusterCoefficients(clusters, points) {
-  return clusters.map((rowCluster) =>
-    rowCluster.map((cluster) => cluster.length / points.length),
+function clusterCoefficients(clusters) {
+  return clusters.arr.map((rowCluster) =>
+    rowCluster.map((cluster) => cluster.sum / clusters.totalSum),
   )
 }
 
@@ -127,16 +138,8 @@ export function computeMatrixCoefficients(points, boundingRect) {
   return coefficients
 }
 
-const LINE_Q = 10
-
-function couldBeLine(points) {
-  const { maxX, minX, maxY, minY } = boundingCoords(points)
-  const [dx, dy] = [maxX - minX, maxY - minY].map((x) => x + 0.00001)
-  return dy / dx > LINE_Q || dx / dy > LINE_Q
-}
-
-const RECT_THRESHOLD_CENTER = 0.05
-const RECT_THRESHOLD_SIDE_VARIANCE = 0.12
+const RECT_THRESHOLD_CENTER = 0
+const RECT_THRESHOLD_SIDE_VARIANCE = 0.25
 
 function couldBeRect(points) {
   if (points.length < 4) return false
@@ -145,8 +148,8 @@ function couldBeRect(points) {
   const matrixCoefficients = computeMatrixCoefficients(points, boundingRect)
 
   let [maxC, minC] = [0, 1]
-  for (let i = 0; i < 3; i++) {
-    for (let j = 0; j < 3; j++) {
+  for (let i = 0; i < MATRIX_SIZE; i++) {
+    for (let j = 0; j < MATRIX_SIZE; j++) {
       if (!(i === j && j === 1)) {
         maxC = Math.max(maxC, matrixCoefficients[i][j])
         minC = Math.min(minC, matrixCoefficients[i][j])
@@ -154,13 +157,9 @@ function couldBeRect(points) {
     }
   }
 
-  console.log(matrixCoefficients)
-
   if (
-    (matrixCoefficients[1][1] < RECT_THRESHOLD_CENTER &&
-      maxC - minC < RECT_THRESHOLD_SIDE_VARIANCE) ||
-    (maxC - minC < RECT_THRESHOLD_SIDE_VARIANCE * 2 &&
-      matrixCoefficients[1][1] === 0)
+    matrixCoefficients[1][1] <= RECT_THRESHOLD_CENTER &&
+    maxC - minC < RECT_THRESHOLD_SIDE_VARIANCE
   ) {
     return { coefficients: matrixCoefficients, boundingRect }
   }
-- 
GitLab