Blame view

node_modules/zrender/lib/core/OrientedBoundingRect.js 4.12 KB
bd028579   易尊强   2/28
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
  import Point from './Point.js';
  var extent = [0, 0];
  var extent2 = [0, 0];
  var minTv = new Point();
  var maxTv = new Point();
  var OrientedBoundingRect = (function () {
      function OrientedBoundingRect(rect, transform) {
          this._corners = [];
          this._axes = [];
          this._origin = [0, 0];
          for (var i = 0; i < 4; i++) {
              this._corners[i] = new Point();
          }
          for (var i = 0; i < 2; i++) {
              this._axes[i] = new Point();
          }
          if (rect) {
              this.fromBoundingRect(rect, transform);
          }
      }
      OrientedBoundingRect.prototype.fromBoundingRect = function (rect, transform) {
          var corners = this._corners;
          var axes = this._axes;
          var x = rect.x;
          var y = rect.y;
          var x2 = x + rect.width;
          var y2 = y + rect.height;
          corners[0].set(x, y);
          corners[1].set(x2, y);
          corners[2].set(x2, y2);
          corners[3].set(x, y2);
          if (transform) {
              for (var i = 0; i < 4; i++) {
                  corners[i].transform(transform);
              }
          }
          Point.sub(axes[0], corners[1], corners[0]);
          Point.sub(axes[1], corners[3], corners[0]);
          axes[0].normalize();
          axes[1].normalize();
          for (var i = 0; i < 2; i++) {
              this._origin[i] = axes[i].dot(corners[0]);
          }
      };
      OrientedBoundingRect.prototype.intersect = function (other, mtv) {
          var overlapped = true;
          var noMtv = !mtv;
          minTv.set(Infinity, Infinity);
          maxTv.set(0, 0);
          if (!this._intersectCheckOneSide(this, other, minTv, maxTv, noMtv, 1)) {
              overlapped = false;
              if (noMtv) {
                  return overlapped;
              }
          }
          if (!this._intersectCheckOneSide(other, this, minTv, maxTv, noMtv, -1)) {
              overlapped = false;
              if (noMtv) {
                  return overlapped;
              }
          }
          if (!noMtv) {
              Point.copy(mtv, overlapped ? minTv : maxTv);
          }
          return overlapped;
      };
      OrientedBoundingRect.prototype._intersectCheckOneSide = function (self, other, minTv, maxTv, noMtv, inverse) {
          var overlapped = true;
          for (var i = 0; i < 2; i++) {
              var axis = this._axes[i];
              this._getProjMinMaxOnAxis(i, self._corners, extent);
              this._getProjMinMaxOnAxis(i, other._corners, extent2);
              if (extent[1] < extent2[0] || extent[0] > extent2[1]) {
                  overlapped = false;
                  if (noMtv) {
                      return overlapped;
                  }
                  var dist0 = Math.abs(extent2[0] - extent[1]);
                  var dist1 = Math.abs(extent[0] - extent2[1]);
                  if (Math.min(dist0, dist1) > maxTv.len()) {
                      if (dist0 < dist1) {
                          Point.scale(maxTv, axis, -dist0 * inverse);
                      }
                      else {
                          Point.scale(maxTv, axis, dist1 * inverse);
                      }
                  }
              }
              else if (minTv) {
                  var dist0 = Math.abs(extent2[0] - extent[1]);
                  var dist1 = Math.abs(extent[0] - extent2[1]);
                  if (Math.min(dist0, dist1) < minTv.len()) {
                      if (dist0 < dist1) {
                          Point.scale(minTv, axis, dist0 * inverse);
                      }
                      else {
                          Point.scale(minTv, axis, -dist1 * inverse);
                      }
                  }
              }
          }
          return overlapped;
      };
      OrientedBoundingRect.prototype._getProjMinMaxOnAxis = function (dim, corners, out) {
          var axis = this._axes[dim];
          var origin = this._origin;
          var proj = corners[0].dot(axis) + origin[dim];
          var min = proj;
          var max = proj;
          for (var i = 1; i < corners.length; i++) {
              var proj_1 = corners[i].dot(axis) + origin[dim];
              min = Math.min(proj_1, min);
              max = Math.max(proj_1, max);
          }
          out[0] = min;
          out[1] = max;
      };
      return OrientedBoundingRect;
  }());
  export default OrientedBoundingRect;