D3 -当等于无穷大时改变路径值

d3 - change path value when equals infinity

本文关键字:改变 路径 无穷大 D3      更新时间:2023-09-26

我有一个代码,其中用户单击和射线跟随鼠标。路径采用斜率公式计算,有时斜率可以为Infinity-Infinity。当这种情况发生时,我想将y坐标的值更改为视口的最大或最小高度。

我不知道在哪里做。当我做console.log(pathArray[1].y)时,它显示值改变了,但我不确定如何在它实际做某事的地方实现它。这是我最近的一次尝试。(这是我的小提琴)请帮帮我!

svg.on('mousedown', mousedown);
function mousedown() {
    isDown = !isDown;
    m1 = d3.mouse(this);
    pathArray = [ { 'x': m1[0], 'y': m1[1] } ];
    if(firstClick) {        
         line = svg.append('path')
            .attr('d', lineFunction(pathArray))
            .attr({'stroke': 'turquoise', 'stroke-width': 5, 'fill': 'none'});
    }
    firstClick = !firstClick;
}

编辑我改变了这个鼠标移动一点。

svg.on('mousemove', mousemove);
function mousemove() {
    m2 = d3.mouse(this);
    if(m == Number.POSITIVE_INFINITY || m == Number.NEGATIVE_INFINITY) {
        var equalsInfinity = true;
        if(m == Number.POSITIVE_INFINITY) {
            var isPosInf = true;
            var isNegInf = false;
       } else if(m == Number.NEGATIVE_INFINITY) {
            var isNegInf = true;
            var isPosInf = false;
       } 
    } else {
     equalsInfinity = false;
    }
    var toLeft = ['M', m1[0], m1[1], 
                  'L', 0, getY(m1[0], m1[1], m2[0], m2[1], isLeft)].join(' ');        
    var toRight = ['M', m1[0], m1[1], 
                   'L', 850, getY(m1[0], m1[1], m2[0], m2[1], isLeft, isLeft)].join(' ');  
    var pInf = ['M', m1[0], m1[1], 
                'L', m2[0], getY(m1[0], m1[1], m2[0], min)].join(' ');
    var nInf = ['M', m1[0], m1[1], 
                'L', m2[0], getY(m1[0], m1[1], m2[0], max)].join(' ');
    var isInfinity = isPosInf ? pInf : isNegInf ? nInf : 'neither';
    var rightLeft = isLeft ? toLeft : toRight;
    if(isDown){
        if((m2[0] - m1[0]) > 0) {
            isLeft = false;            
        } else {
            isLeft = true;
        }   
        line.attr('d', equalsInfinity ? isInfinity : rightLeft);      
    }    
}

嗯,我得到了一些帮助,结果发现我把它弄得比需要的更复杂。这是他帮我想出的解决方案:

function mousemove() {
    m2 = d3.mouse(this);         
    var equalsZero = false, isPosInf, isNegInf, equalsInfinity;  
    if(isDown){
        if((m2[0] - m1[0]) > 0) {
            isLeft = false;
            pathArray[1] = { x: 500, y: getY(m1[0], m1[1], m2[0], m2[1], isLeft) };
        } else if((m2[0] - m1[0]) < 0) {
            isLeft = true;
            pathArray[1] = { x: 0, y: getY(m1[0], m1[1], m2[0], m2[1], isLeft) };
        } else if((m2[0] - m1[0]) === 0) {
            equalsZero = true; 
        }    
        if(equalsZero) {
            equalsInfinity = true;
            if(m === Number.POSITIVE_INFINITY){
                pathArray[1] = { x: m2[0], y: 500 };
            }
            else if(m === Number.NEGATIVE_INFINITY){
            pathArray[1] = { x: m2[0], y: 0 };
            }
        } else {
            equalsInfinity = false;   
        }
        line.attr('d', lineFunction(pathArray));
    }    
}