Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.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
Javascript 拉斐尔路径2曲线不尊重原始路径_Javascript_Raphael - Fatal编程技术网

Javascript 拉斐尔路径2曲线不尊重原始路径

Javascript 拉斐尔路径2曲线不尊重原始路径,javascript,raphael,Javascript,Raphael,我有一个问题。该函数修改SVG路径字符串,以便将所有路径命令转换为绝对三次曲线(C)。该函数支持所有路径命令(mlcqahvstMLCQAHVST,请参阅) Raphael.path2curve()在许多情况下都可以很好地处理路径,例如,它甚至可以正确地将圆弧转换为立方体,这不是一个容易的计算。我做了很多测试,发现由命令QT、CS或HT组成的路径转换得很好。以下各项也没有问题:MS、HS、VS、LS、TC、TH、TL、TV、QA、TA 但它不能处理命令QS、TS、AS、TT(按该顺序) 如果我们

我有一个问题。该函数修改SVG路径字符串,以便将所有路径命令转换为绝对三次曲线(C)。该函数支持所有路径命令(
mlcqahvstMLCQAHVST
,请参阅)

Raphael.path2curve()在许多情况下都可以很好地处理路径,例如,它甚至可以正确地将圆弧转换为立方体,这不是一个容易的计算。我做了很多测试,发现由命令
QT
CS
HT
组成的路径转换得很好。以下各项也没有问题:
MS、HS、VS、LS、TC、TH、TL、TV、QA、TA

但它不能处理命令QS、TS、AS、TT(按该顺序)

如果我们有这样的路径,转换失败:

M 0 0  T 205.4 112.9  S 260.8 23.36 82.45 72.86 
但这是正确的:

M 0 0  S 211.9 54.20 52.14 144.4  T 98.85 44.45 
所以,MTS是不好的,但MST是。有问题的是S和T,因为当某些东西失败时,它们总是有问题

我做了(慢,但用于速度),你们可以得到随机路径,并将其转换为 使用Raphael.path2curve()的Cubic命令。在fiddle中,单击SVG或按输入字段上的enter键以获得新的随机路径。重复上述步骤,直到找到不正确的。HTML窗口中有一个参数
var list=“st”可以在其中设置要随机化的路径命令

这是一个示例图像。蓝色为原始路径,红色为转换路径。它们应该是相同的

我应该如何处理Raphael代码以获得正确的转换


(我做了,但现在已经尝试解决问题好几个小时了,但运气不好。

看来我终于把它修好了。请测试!我做了两个jsbin版本:

1) 使用未修改Raphael库的非固定版本:。
2) 修正了修改path2curve()函数的版本:

在这两个版本中,都有黑色(原始)和白色(规范化)路径。如果一切正常,您不应该在黑色路径下看到白色路径。如果您看到白色路径,那么lib代码有一个bug(请参见下面对一些轻微闪烁的解释)

请在输入字段上按住ENTER键一分钟左右。只要按下ENTER键,该代码就会重复生成随机路径。更改属性
var list=“mlcqahvstz”
更改随机化的基本字母

下面是我对lib代码的解释。中有一个函数path2curve(),它具有以下行:

case "S":
    nx = d.x + (d.x - (d.bx || d.x));
    ny = d.y + (d.y - (d.by || d.y));
    path = ["C", nx, ny][concat](path.slice(1));
    break;
case "T":
    d.qx = d.x + (d.x - (d.qx || d.x));
    d.qy = d.y + (d.y - (d.qy || d.y));
    path = ["C"][concat](q2c(d.x, d.y, d.qx, d.qy, path[1], path[2]));
    break;
当我把它们改成:

case "S":
    if (pcom == "C" || pcom == "S") { // In "S" case we have to take into
                                      // account, if the previous command
                                      // is C/S.
        nx = d.x * 2 - d.bx;          // And reflect the previous 
        ny = d.y * 2 - d.by;          // command's control point relative
                                      // to the current point.  
    }
    else {                            // or some else or nothing
        nx = d.x;
        ny = d.y;
    }
    path = ["C", nx, ny][concat](path.slice(1));
    break;
case "T":
    if (pcom == "Q" || pcom == "T") { // In "T" case we have to take
                                      // into account, if the
                                      // previous command is Q/T.
        d.qx = d.x * 2 - d.qx;        // And make a reflection similar 
        d.qy = d.y * 2 - d.qy;        // to case "S".
    }
    else {                            // or something else or nothing
        d.qx = d.x;
        d.qy = d.y;
    }
    path = ["C"][concat](q2c(d.x, d.y, d.qx, d.qy, path[1], path[2]));
    break;
该函数按预期工作(即在每个可能的路径命令组合中尊重原始路径形状)
pcom
变量引用原始路径的前一段,我还必须添加一种方法来获取
pcom
,这相当简单,因为对于a以外的所有其他路径命令,从原始路径段类型到三次曲线(C)的转换只生成一个三次命令。在A的情况下,该函数可能产生多个C命令(短角度产生一个或几个C段,大角度产生更多C段)

唯一较小的不一致性来自Z命令,因为Raphaël将每个Z转换为C。这会影响路径开始(或结束)的视觉外观,但差异并不大。我假设它将Z转换为C,以使路径具有动画效果。如果不需要动画,则可以考虑编辑该函数以使Z:S未转换,在这种情况下转换保真度是优秀的。 我很惊讶所有路径命令都可以如此可靠地表示为三次曲线

我希望这个bug在Raphaël的未来版本中得到修复

编辑:还为路径动画制作了试验台:
1) 非固定:
2) 固定的:


在对非动画路径和动画路径进行彻底测试之后,我可以确认我对path2curve函数的修复是稳定的,并且可以在生产代码中实现。如果您想确定,请使用上面提到的测试床。

只是出于好奇:为什么要这样做?要规范化所有类型的路径,以便它们可以进行类似透视计算的操作:。似乎我终于修复了它。请测试一下。使用未修改Raphael库的非固定版本:。固定版本:。在这两种情况下,都有黑色(原始)和白色(规范化)路径。如果它们不一致,库就有bug。