如何使用javascript和画布2D上下文注释一行?

如何使用javascript和画布2D上下文注释一行?,javascript,canvas,Javascript,Canvas,我需要通过在开始和结束处放置文本来注释一行。我还需要插入文本,而不让文本所在的行可见 有人能告诉我如何为2D画布上下文的线条添加文本。用setTransform注释线条 最好使用注释线,以便将世界空间(文本)与屏幕空间(绘制线的位置)对齐。一旦你有了这些,那么所有的图形坐标都会像线条沿着画布的顶部一样 直线的起点位于(0,0),终点位于等于直线长度的x坐标处。可以在特性线的上方、上方和下方绘制。可以绘制文本,使其与属性的端点和中心对齐 若要在线条中留有间隙,请使用函数获取文本宽度并在文本周围绘制

我需要通过在开始和结束处放置文本来注释一行。我还需要插入文本,而不让文本所在的行可见


有人能告诉我如何为2D画布上下文的线条添加文本。

用setTransform注释线条

最好使用注释线,以便将世界空间(文本)与屏幕空间(绘制线的位置)对齐。一旦你有了这些,那么所有的图形坐标都会像线条沿着画布的顶部一样

直线的起点位于(0,0),终点位于等于直线长度的x坐标处。可以在特性线的上方、上方和下方绘制。可以绘制文本,使其与属性的端点和中心对齐

若要在线条中留有间隙,请使用函数获取文本宽度并在文本周围绘制线段

代码示例具有函数
transformToLine(ctx,x1,y1,x2,y2)
,该函数将当前画布转换设置为与行对齐,然后返回行的长度,以便用于添加文本

我还提供了一些代码,展示了如何在行上、行内、行前、行后、行上和行下进行渲染。还有三个实用函数可以帮助在线条中绘制文本

transformToLine(ctx,x1,y1,x2,y2)
是一个非常方便的函数,它有许多用途,不仅仅用于沿直线绘制文本。我个人觉得它非常有用,我将它添加到画布上下文中,而不是作为一个全局函数

var canvas=document.getElementById(“canV”);
var ctx=canvas.getContext(“2d”);
//ES6新的数学函数
//简单的polyfill用于IE对其他
var-hypot;
if(typeof Math.hypot==‘function’){
海波=数学海波;
}否则{
hypot=函数(x,y){//未测试
返回Math.sqrt(Math.pow(x,2)+Math.pow(y,2));
};
}
//将二维上下文转换设置为线段x1、y1到x2、y2和
//返回行的长度
函数转换线(ctx,x1,y1,x2,y2){
var ang,xd,yd;
var ang=Math.atan2(y2-y1,x2-x1);//获取行方向
var xd=Math.cos(ang);//获取x轴的向量
var yd=数学sin(ang);
setTransform(xd,yd,-yd,xd,x1,y1);//创建trnasform
返回hypot(x1-x2,y1-y2);//返回行长度
}    
//将2Dcontext转换恢复为默认值
//如果只需要转换,请使用,而不是保存和还原
//保存和恢复。快多了。
函数转换默认值(ctx){
setTransform(1,0,0,1,0,0);
}    
//在直线中绘制文本,如果有空格,则在文本的任一侧绘制直线。
//ctx是要绘制的上下文。
//文本就是文本
//inset是从开始到结束的像素数
//x1,y1和x2,y2是直线
功能文本开始(ctx,文本,插图,x1,y1,x2,y2){
变量len、textW、lw;
len=transformToLine(ctx,x1,y1,x2,y2);//设置转换并获取行长度
ctx.textb基线=“middle”;//设置行上的文本
ctx.textAlign=“left”//左对齐
textW=ctx.measureText(text).width;//获取文本大小
fillText(text,inset,0);//绘制文本
ctx.beginPath();//如果有空格,在文本周围画出部分线条
lw=Number(ctx.lineWidth)*2;//留一个间隙,使行不接触文本
如果(inset-lw>0){//检查文本前的空格
ctx.moveTo(0,0);
ctx.lineTo(插图-lw,0);
如果(inset+textW+lw0){//检查文本前的空格
ctx.moveTo(0,0);
ctx.lineTo(len-inset-textW-lw,0);
如果(len-inset+lw