Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Html 在SVG或Raphael.js中的路径或多边形中写入文本_Html_Svg_Geometry_Raphael - Fatal编程技术网

Html 在SVG或Raphael.js中的路径或多边形中写入文本

Html 在SVG或Raphael.js中的路径或多边形中写入文本,html,svg,geometry,raphael,Html,Svg,Geometry,Raphael,我使用Raphael.js在图像上创建多边形(或实际闭合路径)。我想把文字放在多边形里面。有没有办法创建一个文本元素,然后调整它的大小和位置,使整个东西都在多边形的边界内 至少有什么算法可以让我猜得很好,我可以手动调整吗?好的,我在一天的过程中对此进行了一些思考,最后有机会编写了一些演示代码。它在许多方面都有明显的缺陷,但可能是一个很好的起点,并且似乎可以很好地处理我随机生成的大多数多边形 第1部分:将文本居中放置在多边形上。使用边界框被证明是非常不令人满意的,因此我设计了一种技术来平均给定路径

我使用Raphael.js在图像上创建多边形(或实际闭合路径)。我想把文字放在多边形里面。有没有办法创建一个文本元素,然后调整它的大小和位置,使整个东西都在多边形的边界内


至少有什么算法可以让我猜得很好,我可以手动调整吗?

好的,我在一天的过程中对此进行了一些思考,最后有机会编写了一些演示代码。它在许多方面都有明显的缺陷,但可能是一个很好的起点,并且似乎可以很好地处理我随机生成的大多数多边形

第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" );