美文网首页Web前端之路让前端飞程序员
svg给出两点坐标连一条曲线

svg给出两点坐标连一条曲线

作者: 我不叫奇奇 | 来源:发表于2017-05-11 17:44 被阅读994次

svg中给出两点的坐标得到连接两点的曲线路径.
中心思想:求出两点连线的中垂线公式,给定AB某一点的X或Y坐标,求出中垂线上的另一个坐标

在svg中,我们画曲线的时候需要知道曲线的生成公式-----贝塞尔曲线.

线性贝塞尔曲线演示动画,t在[0,1]区间 二次贝塞尔曲线演示动画,t在[0,1]区间 三次贝塞尔曲线演示动画,t在[0,1]区间 四次贝塞尔曲线演示动画,t在[0,1]区间 五次贝塞尔曲线演示动画,t在[0,1]区间

根据图像,我们可以轻易的知道贝塞尔曲线的原理,他是由 起点-控制点-控制点-...-终点 之间的连线,从之中再取相领两根线的某一个点连线,取其中点绘制出来的曲线.

当然我们现在只是想随意的画出一条看的过去的曲线,所以我们的目标是得到一个控制点

连线

从上图我们可以看出来控制点2(绿色)画出来的线是比较好看的.而这种线不偏向某一边的线的控制点都是在这两个点连线的中垂线上的

中垂线

所以我们的重心落到了求出两点的中垂线上.

下面的问题就比较简单了

中垂线公式
function svgPathCurv(a,b,curv) {
    /*
     * 弯曲函数.
     * a:a点的坐标{x:10,y:10}
     * b:b点的坐标{x:10,y:20}
     * curv:弯曲程度 取值 -5 到 5 
     */
    curv = curv ? curv : 0;
    var x1, x2, y1, y2, s, k2, controX, controY, q, l, path = '';
    var s = 'M' + a.x + ',' + a.y + ' ';

    /*
     * 控制点必须在line的中垂线上
     * **求出k2的中垂线(中垂线公式)**
     */
    k2 = -(x2 - x1) / (y2 - y1);
    /*
     * 弯曲程度是根据中垂线斜率决定固定控制点的X坐标或者Y坐标,通过中垂线公式求出另一个坐标
     * 默认A/B中点的坐标+curv*30,可以通过改基数30改变传入的参数范围
     */
    if(k2 < 2 && k2 > -2) {
        controX = (x2 + x1) / 2 + curv * 30;
        controX = controX < 0 ? -controX : controX;
        controY = k2 * (controX - (x1 + x2) / 2) + (y1 + y2) / 2;
        controY = controY < 0 ? -controY : controY;
    } else {
        controY = (y2 + y1) / 2 + curv * 30;
        controY = controY < 0 ? -controY : controY;
        controX = (controY - (y1 + y2) / 2) / k2 + (x1 + x2) / 2;
        controX = controX < 0 ? -controX : controX;
    }
    //定义控制点的位置

    q = 'Q' + controX + ',' + controY + ' ';
    //l=lineto
    l = x2 + ',' + y2 + ' ';
    //结果例: M10,10Q35,15,10,20 
    path = s + q + l;
    return path;
}

相关文章

  • svg给出两点坐标连一条曲线

    svg中给出两点的坐标得到连接两点的曲线路径.中心思想:求出两点连线的中垂线公式,给定AB某一点的X或Y坐标,求出...

  • 核心动画-绘制贝塞尔曲线

    一、贝塞尔曲线作用: *贝塞尔曲线就是这样的一条曲线,它是依据四个位置任意的点坐标绘制出的一条光滑曲线。在历史上,...

  • 关于svg的旋转平移缩放

    x,y为svg对象点的坐标,offset_x,offset_y为偏移坐标,scale为缩放倍数。 保证svg对象绕...

  • 基础部分

    坐标系 D3通过SVG画图,SVG的坐标系同HTML中的坐标系类似,都是以左上角作为坐标原点,向下向右为正延伸。 ...

  • Canvas中的svg数据是如何绘制图形的

    练一练曲线https://www.w3.org/TR/SVG/images/paths/cubic02.svg 贝...

  • 椭圆曲线算法原理

    椭圆曲线的公式 Y^2 = x^3 + a x + b 椭圆曲线的运算规则 1.加法:过曲线上的两点A、B画一条直...

  • SVG-曲线

    曲线就是 Web 画图中常见的 Bezier Curves(贝塞尔),Arcs,several Bezier cu...

  • OC之贝塞尔曲线上的点移动

    贝塞尔曲线就是依据四个任意位置的点坐标绘制出的一条光滑曲线。在历史上,研究贝塞尔曲线的人最初是按照已知曲线参数方程...

  • Proe/Creo建模实例教程——关系式和扫描的应用

    一、使用方程来创建曲线 1、依次点击:基准>曲线>来自方程的曲线。 2、使用笛卡尔坐标系,参考坐标系选默认坐标系。...

  • 01图表的主要组成

    图表主要组成 包含成分 Title,标题 Axis,坐标 Series,数据列,比如一条曲线 Tooltip,数据...

网友评论

    本文标题:svg给出两点坐标连一条曲线

    本文链接:https://www.haomeiwen.com/subject/snnotxtx.html