Highcharts-获取交叉序列的交叉点

Highcharts-获取交叉序列的交叉点,highcharts,regression,series,interception,Highcharts,Regression,Series,Interception,我目前正在尝试提取特定系列(x)系列(a、b、c、d)的多个交叉点。我似乎找不到任何能帮助我完成这项任务的函数 我的最佳选择是测量x中每个点与a、b、c、d中每个点之间的距离。。。并假设当距离达到某个阈值以下时,该点必须是交叉点。我认为这种方法计算量太大,似乎“肮脏”。我相信一定有更简单或更好的方法,甚至可能是highcharts自己的API中的函数 我搜索了各种来源和网站,但我真的找不到任何解决方案。一些人使用回归作为他们解决方案的一部分。我对回归不太了解,但也许回归是唯一的方法 同样由于我们

我目前正在尝试提取特定系列(x)系列(a、b、c、d)的多个交叉点。我似乎找不到任何能帮助我完成这项任务的函数

我的最佳选择是测量x中每个点与a、b、c、d中每个点之间的距离。。。并假设当距离达到某个阈值以下时,该点必须是交叉点。我认为这种方法计算量太大,似乎“肮脏”。我相信一定有更简单或更好的方法,甚至可能是highcharts自己的API中的函数

我搜索了各种来源和网站,但我真的找不到任何解决方案。一些人使用回归作为他们解决方案的一部分。我对回归不太了解,但也许回归是唯一的方法

同样由于我们系列的“复杂”性质,我也认为回归是相当难以利用的

这是一个研究得很好的方法。不过,在优化之前,我会尝试“计算量大”的蛮力方法。从中借用,我编写了一个与highcharts(fiddle)的快速集成:

get_line_intersection=函数(p0、p1、p2、p3)
{        
var p0_x=p0.x;
var p0_y=p0.y;
var p1_x=p1.x;
变量p1_y=p1.y;
var p2_x=p2.x;
变量p2_y=p2.y;
变量p3_x=p3.x;
变量p3_y=p3.y;
变量s1_x,s1_y,s2_x,s2_y;
s1_x=p1_x-p0_x;s1_y=p1_y-p0_y;
s2_x=p3_x-p2_x;s2_y=p3_y-p2_y;
var s=(-s1_y*(p0_x-p2_x)+s1_x*(p0_y-p2_y))/(-s2_x*s1_y+s1_x*s2_y);
var t=(s2_x*(p0_y-p2_y)-s2_y*(p0_x-p2_x))/(-s2_x*s1_y+s1_x*s2y);

如果(s>=0&&s=0&&t)要查找线段的交点?例如,在这个简单的示例中,您将返回
(0.5,2)
?是的,正是我在寻找的交叉点。我最终没有自己做实现,而是找了其他人来做。从他的代码看,实际上他似乎使用了这种方法。如果highcharts更支持交叉点,例如鼠标悬停在交叉点上、交互工具提示等,那就太好了。感谢不过我发誓。
get_line_intersection = function(p0,p1,p2,p3)
{        
    var p0_x = p0.x;
    var p0_y = p0.y;
    var p1_x = p1.x;
    var p1_y = p1.y;
    var p2_x = p2.x;
    var p2_y = p2.y;
    var p3_x = p3.x;
    var p3_y = p3.y;  

    var s1_x, s1_y, s2_x, s2_y;
    s1_x = p1_x - p0_x;     s1_y = p1_y - p0_y;
    s2_x = p3_x - p2_x;     s2_y = p3_y - p2_y;

    var s = (-s1_y * (p0_x - p2_x) + s1_x * (p0_y - p2_y)) / (-s2_x * s1_y + s1_x * s2_y);
    var t = ( s2_x * (p0_y - p2_y) - s2_y * (p0_x - p2_x)) / (-s2_x * s1_y + s1_x * s2_y);

    if (s >= 0 && s <= 1 && t >= 0 && t <= 1)
    {
        return [p0_x + (t * s1_x),p0_y + (t * s1_y)];
    }

    return false;
}

$(function () {
    $('#container').highcharts({
        series: [{
            name: 'line1',
            data: $.map(new Array(10), function(){return Math.random() * 10;})
        }, {
            name: 'line2',
            data: $.map(new Array(10), function(){return Math.random() * 10;})
        }, {
            name: 'intersect',
            data: [],
            type: 'scatter'
            }
        ]
    }, function(chart){
        var s0 = chart.series[0].points;
        var s1 = chart.series[1].points;
        var s2 = chart.series[2];
        var n0 = s0.length;
        var n1 = s1.length;
        var i,j,isect;
        for (i = 1; i < n0; i++){
           for (j = 1; j < n1; j++){
               if (isect = get_line_intersection(s0[i-1],s0[i],
                                   s1[j-1],s1[j])){
                   s2.addPoint(isect, false, false);

               }
           } 
        }
        chart.redraw();
    });
});