2021SC@SDUSC
前面分析的的一直是动画系统,也就是动画播放的支持组件,今天我们转过来看一下几何也就是图形系统。
首先就是geopoint类,geopoint是几何学意义上的点,它不可见,没有大小,用于进行数学运算。此实现从 diagramo 中的同类改进而来,详情可参考:http://diagramo.com/。
geopoint一般派生于 Geometry 类。该类一般用于描述点状地理实体。point2d 和GeoPoint都可用来表示二维点,所不同的是GeoPoint描述的是地物实体,而point2d描述的是一个位置点;当赋予GeoPoint不同的几何风格,即可用于表示不同的地物实体,而point2d则是广泛用于定位的坐标点。这里用的就是GeoPoint类。
function GeoPoint() {
var x = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
_classCallCheck(this, GeoPoint);
this.x = x;
this.y = y;
}
首先是对GeoPoint的定义,也就是点的标准情况,在二维的坐标平面内由两个坐标(x,y)组成一个坐标组来定义,保存方式为数组,其中x是数组的0号也就是第一个元素,y是1号也就是第二个元素,且x,y的值不能为空,
_createClass(GeoPoint, [{
key: "toArray",
value:
function toArray() {
return [this.x, this.y];
}
然后紧接着就是toarry,作用是从 JSON 对象创建 {GeoPoint} 实例,返回值就是获得的x,
y坐标。
key: "transform",
value: function transform(matrix) {
var oldX = this.x;
var oldY = this.y;
this.x = matrix[0][0] * oldX + matrix[0][1] * oldY + matrix[0][2];
this.y = matrix[1][0] * oldX + matrix[1][1] * oldY + matrix[1][2];
在接下来就是Geopoint坐标的变换,当坐标是四参数坐标时,利用最小二乘法公式
这里用的是
key: "equals",
value: function equals(anotherPoint) {
return this.x == anotherPoint.x && this.y == anotherPoint.y;
}
测试当前点是否与另一个点相等,就是很简单的x和y两个值的比较
key: "clone",
value: function clone() {
var newPoint = new GeoPoint(this.x, this.y);
return newPoint;
}
克隆当前点,方便在其他类中调用的时候,使用复制后的点位,不改变原有点位的坐标。
key: "near",
value: function near(x, y, radius) {
var distance = Math.sqrt(Math.pow(this.x - x, 2) + Math.pow(this.y - y, 2));
return distance <= radius;
}
临近运算,测试某个点 (x,y) 是否处于当前 GeoPoint 的某个范围内。其中,x、y值是新的点的坐标,radius是范围半径(点的概念下,通常说范围是指一个以该点为圆心的圆),利用math中的平方方法等计算出distance(两点间的距离),与半径比较得出返回值。
key: "toString",
value: function toString() {
return '[' + this.x + ',' + this.y + ']';
}
tostring方法,将点转化为“x,y”的字符串类型,其中x,y是点的坐标。
key: "loadArray",
value: function loadArray(v) {
var newPoints = [];
for (var i = 0; i < v.length; i++) {
newPoints.push(GeoPoint.load(v[i]));
}
return newPoints;
}
从 {JSONObject} 数组创建实例,创建的实例类型自然也是一个数组。也就是刚刚的那种经过定义的点,所组成的数组。
key: "cloneArray",
value: function cloneArray(v) {
var newPoints = [];
for (var i = 0; i < v.length; i++) {
newPoints.push(v[i].clone());
}
return newPoints;
}
这里是克隆一组点,是对数组中的点进行遍历并克隆,和前面克隆的作用类似。
key: "pointsToArray",
value: function pointsToArray(points) {
var result = [];
for (var i = 0; i < points.length; i++) {
result.push([points[i].x, points[i].y]);
}
return result;
}
这里是添加一个点进入数组,数组扩大,其下标顺序加一即可。
这就是GeoPoint类的主要内容和功能了。