ArcGIS api for JavaScript 4+版本画箭头

效果图

Paste_Image.png

代码

drawArrow: function (view, points, l) { // 箭头绘制 points为待连线的两个点 l为箭头在屏幕上的像素长度
            var lastPoint = points[points.length - 1];
            var lastSecPoint = points[points.length - 2];
            lastPoint = view.toScreen(new Point({
                x: lastPoint[0],
                y: lastPoint[1],
                "spatialReference": view.spatialReference
            }));
            lastSecPoint = view.toScreen(new Point({
                x: lastSecPoint[0],
                y: lastSecPoint[1],
                "spatialReference": view.spatialReference
            }));
            var x1 = lastPoint.x;
            var y1 = lastPoint.y;
            var x2 = lastSecPoint.x;
            var y2 = lastSecPoint.y;
            var a = (y1 - y2) / (x1 - x2);
            var b = y1 - a * x1;
            var g = Math.pow(a, 2) + 1;
            var h = 2 * x1 + 2 * y1 * a - 2 * a * b;
            var i = Math.pow(x1, 2) + Math.pow(y1, 2) - 2 * y1 * b + Math.pow(b, 2) - Math.pow(l, 2) / 2;
            var m = (h - Math.sqrt(Math.pow(h, 2) - 4 * g * i)) / (2 * g);
            if (m < Math.min(x1, x2) || m > Math.max(x1, x2)) {
                m = (h + Math.sqrt(Math.pow(h, 2) - 4 * g * i)) / (2 * g);
            }
            var n = a * m + b;

            var j = 2 * m - 2 * x1;
            var k = 2 * n - 2 * y1;
            var o = Math.pow(x1, 2) - Math.pow(m, 2) + Math.pow(y1, 2) - Math.pow(n, 2) - Math.pow(l, 2) + Math.pow(l, 2) / 2;
            var p = 1 + Math.pow(j / k, 2);
            var q = -2 * x1 + (2 * j * o) / Math.pow(k, 2) + (2 * y1 * j) / k;
            var r = Math.pow(x1, 2) + Math.pow(o / k, 2) + (2 * y1 * o) / k + Math.pow(y1, 2) - Math.pow(l, 2);
            var x = (-q + Math.sqrt(Math.pow(q, 2) - 4 * p * r)) / (2 * p);
            var y = (-j * x - o) / k;
            var x3 = (-q - Math.sqrt(Math.pow(q, 2) - 4 * p * r)) / (2 * p);
            var y3 = (-j * x3 - o) / k;
            var pp = view.toMap({
                x: x, y: y
            });
            var pp2 = view.toMap({
                x: x2, y: y2
            });
            var pp3 = view.toMap({
                x: x3, y: y3
            });
            var line = new Polyline({
                paths: [[[pp.x, pp.y], [pp2.x, pp2.y], [pp3.x, pp3.y]]],
                "spatialReference": view.spatialReference
            })
            return line;
        }

说明

上面一堆看不懂的算法代码以及 a,b,c等变量,都是在解方程时产生的中间变量,此处没办法写上注释。不过过程就是将地理坐标点先转换成为屏幕坐标点,然后按照45度夹角的方式传入一个屏幕像素长度,求得箭头构成的polyline

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1 前言 一直想沿着图像处理这条线建立一套完整的理论知识体系,同时积累实际应用经验。因此有了从使用AVFounda...
    RichardJieChen阅读 5,845评论 5 12
  • Core Graphics Framework是一套基于C的API框架,使用了Quartz作为绘图引擎。它提供了低...
    ShanJiJi阅读 1,663评论 0 20
  • 《ilua》速成开发手册3.0 官方用户交流:iApp开发交流(1) 239547050iApp开发交流(2) 1...
    叶染柒丶阅读 11,118评论 0 11
  • 《ijs》速成开发手册3.0 官方用户交流:iApp开发交流(1) 239547050iApp开发交流(2) 10...
    叶染柒丶阅读 5,422评论 0 7
  • 已经深夜,老张依然无睡意。看着病床上睡得并不安稳的老母亲,老张满是心疼和无奈,恨不得自己能代替母亲去承受这些病痛的...
    向行阅读 180评论 4 7