2021SC@SDUSC山东大学软件学院软件工程应用与实践--quark renderer代码分析 第八篇 几何系统分析(1):点几何对象类(geopoint)

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类的主要内容和功能了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
"pk-client-error-quark:e:failed to fetch"是一个错误消息,通常出现在使用包管理器(如apt、yum或dnf)时。这个错误消息表明系统无法从软件源中获取所需的软件包或更新。 造成这个错误的原因可能有很多,包括: 1. 无法连接到远程软件源:网络连接可能存在问题,或者软件源服务器可能无法访问。这可能是由于网络问题、服务器故障或软件源配置错误等原因造成的。 2. 软件源配置错误:软件源列表中的某些源的URL可能不正确,或者软件源可能已被删除或更改。 解决这个问题的方法可能因具体情况而异,但以下是一些常见的解决方法: 1. 检查网络连接:确保你的网络连接正常工作,并且可以访问互联网。尝试使用浏览器访问一些常见的网站,以确保网络连接正常。 2. 检查软件源配置:查看软件源列表文件(如/etc/apt/sources.list或/etc/yum.repos.d/)中的URL,确保没有拼写错误或错误的URL。如果需要,可以手动更改软件源配置文件来使用正常可用的软件源。 3. 更换软件源:如果软件源无法访问或出现其他问题,可以尝试切换到其他正常工作的软件源。根据不同的包管理器,可以找到并选择其他可用的软件源,并更新软件包列表。 综上所述,"pk-client-error-quark:e:failed to fetch"错误是由于系统无法从软件源中获取所需的软件包或更新所致,可能由网络连接问题或软件源配置错误引起。通过检查网络连接、修改软件源配置或更换软件源等方法,可以尝试解决这个问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云亦纵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值