Динамически найти путь SVG - PullRequest
2 голосов
/ 03 июня 2019

У меня есть этот SVG-файл

enter image description here

Я хочу знать уравнение линии. Является ли это возможным? Мне нужно уравнение для динамического добавления некоторых точек SVG на этой линии в разных позициях. Итак, в этом случае я знаю значение x, но мне нужно вычислить значение y.

Вот источник файла SVG:

<?xml version="1.0" encoding="UTF-8"?>
<svg width="1366px" height="332px" viewBox="0 0 1366 332" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <!-- Generator: Sketch 55.1 (78136) - https://sketchapp.com -->
    <title>@0.5xTimeline - Deactivated</title>
    <desc>Created with Sketch.</desc>
    <g id="?-Design---Desktop" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="02-About-Us" transform="translate(0.000000, -989.000000)" fill-rule="nonzero" stroke="#EFEFEF" stroke-width="11">
            <g id="HISTORY" transform="translate(-28.000000, 813.000000)">
                <g id="Graphic---Timeline" transform="translate(0.000000, 182.000000)">
                    <path d="M0,38.8855723 C99.4313478,-10.5096141 202.976477,-12.845873 310.635387,31.8767959 C472.123752,98.9607991 512.237609,231.556286 773.130376,301.214063 C1034.02314,370.871839 1355.95795,229.12379 1417,164.042295" id="Timeline---Deactivated"></path>
                </g>
            </g>
        </g>
    </g>
</svg>

1 Ответ

2 голосов
/ 03 июня 2019

Если вы знаете, что у вас есть функция , то есть путь, который идет только слева направо и никогда не удваивается назад, тогда вы можете сканировать по его длине, пока не найдете x -значение, которое вы хотите.

const x = 100; // known x-value
const path = document.getElementById('Timeline---Deactivated');
const pathLength = path.getTotalLength();
const range = [0, pathLength];
let guess, result;
for( let iterations = 0; iterations < 11; iterations++) {
    guess = (range[0]+range[1])/2;
    result = path.getPointAtLength(guess);
    if( result.x < x) {
        // target is to the right
        range[0] = guess;
    }
    else range[1] = guess;
}
return result; // SVGPoint with result.x and result.y

Идеальное количество итераций основано на возможном диапазоне значений X. В вашем случае путь заканчивается в (1417,164), поэтому итерации должны идти в ceil (log_2 (1417)), который равен 11. Если у вас есть большие графики, вам может потребоваться сделать его 12, или вы можете просто установить его в 20 или что-то. Это не значит, что для достижения высокой точности требуется еще много шагов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...