@liammartens/svg-path-properties
Version:
Calculate the length for an SVG path, to use it with node or a Canvas element
279 lines (273 loc) • 6.84 kB
text/typescript
import test from "tape";
import SVGPathProperties from "../src/svg-path-properties";
import { inDelta } from "./inDelta";
test("getTangentAtLength testing", function (test) {
const paths = [
{
path: "M0,50L500,50",
xValues: [1, 1, 1, 1, 1, 1, 1],
yValues: [0, 0, 0, 0, 0, 0, 0],
},
{
path: "M0,50L300,300",
xValues: [
0.7682212795973759,
0.7682212795973759,
0.7682212795973759,
0.7682212795973759,
0.7682212795973759,
0.7682212795973759,
0.7682212795973759,
],
yValues: [
0.6401843996644798,
0.6401843996644798,
0.6401843996644798,
0.6401843996644798,
0.6401843996644798,
0.6401843996644798,
0.6401843996644798,
],
},
{
path: "M0,50H300",
xValues: [1, 1, 1, 1, 1, 1, 1],
yValues: [0, 0, 0, 0, 0, 0, 0],
},
{
path: "M50,50h300",
xValues: [1, 1, 1, 1, 1, 1, 1],
yValues: [0, 0, 0, 0, 0, 0, 0],
},
{
path: "M50,0V200",
xValues: [0, 0, 0, 0, 0, 0, 0],
yValues: [1, 1, 1, 1, 1, 1, 1],
},
{
path: "M50,10v200",
xValues: [0, 0, 0, 0, 0, 0, 0],
yValues: [1, 1, 1, 1, 1, 1, 1],
},
{
path: "M50,50H300V200H50Z",
xValues: [1, 1, 0, 0, -1, 0, 0],
yValues: [0, 0, 1, 1, 0, -1, -1],
},
{
path: "M200,300 Q400,50 600,300",
xValues: [
0.6246950475544243,
0.7418002077808687,
0.8984910301093634,
0.9999999999999247,
0.8984912864152661,
0.7418004257503856,
0.6246951852934535,
],
yValues: [
-0.7808688094430304,
-0.6706209448982786,
-0.43899187784401555,
-3.8801383766437346e-7,
0.4389913532586264,
0.6706207037935429,
0.7808686992517869,
],
},
{
path: "M0,100 Q50,-50 100,100 T200,100",
xValues: [
0.3162277660168379,
0.564254701134953,
0.5642557779681502,
0.3162278830087659,
0.5642536243071706,
0.5642568548067621,
0.3162280000014775,
],
yValues: [
-0.9486832980505138,
-0.8256007704981294,
0.8256000345382487,
0.9486832590531965,
0.8256015064522486,
-0.8255992985726069,
-0.948683220055602,
],
},
{
path: "M0,100 q50,-150 100,0 t100,0",
xValues: [
0.3162277660168379,
0.564254701134953,
0.5642557779681502,
0.3162278830087659,
0.5642536243071706,
0.5642568548067621,
0.3162280000014775,
],
yValues: [
-0.9486832980505138,
-0.8256007704981294,
0.8256000345382487,
0.9486832590531965,
0.8256015064522486,
-0.8255992985726069,
-0.948683220055602,
],
},
{
path: "M0,100 T200,100",
xValues: [1, 1, 1, 1, 1, 1, 1],
yValues: [0, 0, 0, 0, 0, 0, 0],
},
{
path: "M0,100 Q50,-50 100,100 T200,100 T300,100",
xValues: [
0.3162277660168379,
0.9999999999982623,
0.3162278434645575,
0.9999999999843601,
0.3162279209126205,
0.999999999956556,
0.31622799836102694,
],
yValues: [
-0.9486832980505138,
-0.000001864275757835856,
0.9486832722346038,
0.000005592827273145598,
-0.9486832464185723,
-0.000009321378787369434,
0.948683220602419,
],
},
{
path: "M200,200 C275,100 575,100 500,200",
xValues: [
0.6,
0.8855412510377398,
0.9662834030858953,
0.9955306269200779,
0.9950635163752912,
0.8102625798004855,
-0.5999966647640088,
],
yValues: [
-0.8,
-0.4645607524431165,
-0.25748084379374897,
-0.09443924430085592,
0.09924010468979105,
0.5860670198663817,
0.8000025014161303,
],
},
{
path: "M100,200 C100,100 250,100 250,200 S400,300 400,200",
xValues: [
0,
0.8804617844502954,
0.8804628147711906,
0.0000014914995832878143,
0.8804607541243551,
0.8804638450870454,
0.0000029830040755489834,
],
yValues: [
-1,
-0.47411712278993,
0.47411520942192104,
0.9999999999988878,
0.47411903615734735,
-0.47411329605331204,
-0.9999999999955509,
],
},
{
path: "M100,200 S400,300 400,200",
xValues: [
0,
0.9647425496827284,
0.9760648482761272,
0.9886843239589528,
0.9995932816004552,
0.953018740113177,
2.2070215559197298e-7,
],
yValues: [
0,
0.26319538907752243,
0.21747968171693818,
0.15001102478760836,
0.028517913304325987,
-0.30291134180332835,
-0.9999999999999756,
],
},
{
path:
"M240,100C290,100,240,225,290,200S290,75,340,50S515,100,390,150S215,200,90,150S90,25,140,50S140,175,190,200S190,100,240,100",
xValues: [
1,
0.0011574896425055297,
-0.3871202612806902,
-0.999999999999897,
-0.3871144077881202,
0.001157352564866387,
1,
],
yValues: [
0,
-0.9999993301086394,
0.9220292312643728,
-4.5391975842908476e-7,
-0.9220316888712953,
0.999999330267296,
-2.2204460492503162e-15,
],
},
{
path:
"m240,100c50,0,0,125,50,100s0,-125,50,-150s175,50,50,100s-175,50,-300,0s0,-125,50,-100s0,125,50,150s0,-100,50,-100",
xValues: [
1,
0.0011574896425055297,
-0.3871202612806902,
-0.999999999999897,
-0.3871144077881202,
0.001157352564866387,
1,
],
yValues: [
0,
-0.9999993301086394,
0.9220292312643728,
-4.5391975842908476e-7,
-0.9220316888712953,
0.999999330267296,
-2.2204460492503162e-15,
],
},
];
for (let i = 0; i < paths.length; i++) {
let properties = new SVGPathProperties(paths[i].path);
for (let j = 0; j < paths[i].xValues.length; j++) {
var tangent = properties.getTangentAtLength(
(j * properties.getTotalLength()) / (paths[i].xValues.length - 1)
);
test.true(inDelta(tangent.x, paths[i].xValues[j], 0.1));
test.true(inDelta(tangent.y, paths[i].yValues[j], 0.1));
}
test.deepEqual(
properties.getTangentAtLength(10000000),
properties.getTangentAtLength(properties.getTotalLength())
);
test.deepEqual(
properties.getTangentAtLength(-1),
properties.getTangentAtLength(0)
);
}
test.end();
});