Реализация собственного алгоритма в графических фреймах - PullRequest
0 голосов
/ 17 февраля 2019

Я хочу запустить алгоритм двусвязного графа на графике, используя GraphFrames, работающий с pyspark 2.3.

Я понял, что все встроенные алгоритмы работают под капотом с GraphX ​​в Scala.

Есть ли способ, которым я могу реализовать двунаправленный алгоритм в Scala - GraphX ​​и затем вызвать его для объекта GraphFrames?

Кто-нибудь знаком с таким решением?

1 Ответ

0 голосов
/ 07 марта 2019

Нет, я не знаком с каким-либо решением;Я полагаю, что это невозможно сделать с этими программами. Лучше всего сделать свою собственную программу на JavaScript (желательно), проверить файл three.js, если вы хотите простой трехмерной графики, если нет, просто используйте SVG для построения графиков различных фигур или даже чистоCSS, вот некоторый код JavaScript для создания линии из двух точек, просто используйте ее с массивом точек для рисования графика (здесь есть две функции / классы, одна из которых является вспомогательной функцией для создания узлов DOM в целом):

var Grapher = new (function() {
    this.el = function(opts) {
        if(!svgList.split(" ").find(x => x == opts.tag)) {
            this.node = document.createElement(opts.tag || "div");
        } else {
            this.node = document.createElementNS('http://www.w3.org/2000/svg', opts.tag);
        } 

        for(var k in opts) {
            if(k == "style") {
                for(var s in opts[k]) {
                    this.node.style[s] = opts[k][s];
                }
            } else if(k != "parent"){
                this.node[k] = opts[k];
            }
        }



        this.setAttrs = (attrs) => {
            for(var k in attrs) {
                this.node.setAttribute(k, attrs[k]);
            }
        };
        this.getAttr = (at) => {
            return this.node.getAttribute(at);
        };

        this.setStyle = (stl) => {
            for(var k in stl) {
                this.node.style[k] = stl[k];
            }
        }

        var attr = opts.attr || {};
        this.setAttrs(attr);
        var optsPar = opts.parent;
        var par = null;
        if(optsPar) {
            if(optsPar.constructor == String) {
                par = f("#" + optsPar);
            } else if(optsPar instanceof Element) {
                par = optsPar;
            }
        }

        this.parent = par || document.body || {appendChild: (d) => {}};
        this.parent.appendChild(this.node);
     };
    this.line = (opts) => {
        var start = opts.start || {x:0,y:0},
            end = opts.end || {x:0,y:0},
            rise = end.y - start.y,
            run = end.x - start.x,
            slope = rise / run,
            boxWidth = Math.sqrt((rise * rise) + (run * run)),
            degAngle = Math.atan(slope) * 180 / Math.PI,
            thickness = opts.thickness || "2",
            holder = new this.el({
                attr: {
                    class:"lineBox"
                },
                style: {
                    position:"absolute",
                    left:start.x,
                    top:start.y,
                    width:`${boxWidth}px`,
                    height:`${thickness}px`,
                    transform:`rotate(${degAngle}deg)`,
                    transformOrigin:"0 0",
                    background:opts.texture || "black"
                },
                 parent:opts.parent

            });
    }
})();

затем использовать функцию линии для построения графиков различных линий (от точки к точке):

Grapher.line({
    start: {
        x:2,
        y:200
    }
    end: {
        x:10,
        y:500
    }
});
...