Html 在SVG或Raphael.js中的路径或多边形中写入文本
我使用Raphael.js在图像上创建多边形(或实际闭合路径)。我想把文字放在多边形里面。有没有办法创建一个文本元素,然后调整它的大小和位置,使整个东西都在多边形的边界内Html 在SVG或Raphael.js中的路径或多边形中写入文本,html,svg,geometry,raphael,Html,Svg,Geometry,Raphael,我使用Raphael.js在图像上创建多边形(或实际闭合路径)。我想把文字放在多边形里面。有没有办法创建一个文本元素,然后调整它的大小和位置,使整个东西都在多边形的边界内 至少有什么算法可以让我猜得很好,我可以手动调整吗?好的,我在一天的过程中对此进行了一些思考,最后有机会编写了一些演示代码。它在许多方面都有明显的缺陷,但可能是一个很好的起点,并且似乎可以很好地处理我随机生成的大多数多边形 第1部分:将文本居中放置在多边形上。使用边界框被证明是非常不令人满意的,因此我设计了一种技术来平均给定路径
至少有什么算法可以让我猜得很好,我可以手动调整吗?好的,我在一天的过程中对此进行了一些思考,最后有机会编写了一些演示代码。它在许多方面都有明显的缺陷,但可能是一个很好的起点,并且似乎可以很好地处理我随机生成的大多数多边形 第1部分:将文本居中放置在多边形上。使用边界框被证明是非常不令人满意的,因此我设计了一种技术来平均给定路径
容器中的所有点:
// Determine the *weighted* center of this figure
var segments = Raphael.parsePathString( container.attr( 'path' ) );
var count = 0, sum_x = 0, sum_y = 0;
for ( var i = 0; i < segments.length; i++ )
{
if ( segments[i][0] == 'L' || segments[i][0] == 'M' )
{
count++;
sum_x += segments[i][1];
sum_y += segments[i][2];
}
}
var cx = sum_x / count, cy = sum_y / count;
第3部分:反复调整大小。基本上,我们使用上面生成的坐标并将其应用于生成的标签文本。每次迭代我们都会缩小规模一次,直到低于某个阈值,此时我的代码就会放弃(您的代码可能不应该):
结果对于我扔给它的大多数纯随机多边形来说都很好。我敢肯定,它的计算强度远远超过它需要的。我的代码已经准备就绪--只需单击多边形即可生成一个新的多边形
愉快的编码。这些多边形有多复杂?你能提供一两个最极端的例子吗?它们可以是任意复杂的。它们都应该是闭合多边形。它们通常有四条或更多的边。它们可能是凸多边形,但一个至少适用于凹多边形的算法会很有用。这看起来是一个很好的起点(如果不是一个精确的拟合),我想对拉斐尔做些什么。不幸的是,你的代码链接被破坏了(该网站为该页面抛出了404)。你有没有可能对你的代码进行修改?
Raphael.el.isObjectInside = function( obj )
{
var box = obj.getBBox();
return this.isPointInside( box.x, box.y )
&&
this.isPointInside( box.x2, box.y )
&&
this.isPointInside( box.x, box.y2 )
&&
this.isPointInside( box.x2, box.y2 );
}
var s = 1.0;
if ( ibox.width >= cbox.width * 0.7 )
{
s = ( cbox.width * 0.7 ) / ibox.width;
}
while ( s > 0.1 )
{
insert.attr( { transform: [ "S", s, s, ibox.x + ibox.width / 2, ibox.y + ibox.height / 2, "T",
if ( container.isObjectInside( insert ) )
return;
s *= 0.65;
}
console.log("Warning: NOT a clean fit" );