Объединение двух путей SVG: Open Bezier и Line
На часть слияния моего вопроса здесь был дан хороший ответ: /questions/25224611/obedinenie-svg-linii-i-puti-v-odin-element-puti/25224619#25224619 который разрешил два LineGradients с одним линейным узлом, а другой - с узлом пути.
В моей ситуации у меня есть путь Open Bezier и путь Line, и я не уверен, что этот ответ для LineGradient по-прежнему применяется
<g class="com.sun.star.drawing.OpenBezierShape">
<g id="id5">
<rect class="BoundingBox" stroke="none" fill="none" x="7699" y="4699" width="303" height="203"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 7700,4900 C 7816,4847 7964,4842 8000,4700"/>
</g>
</g>
<g class="com.sun.star.drawing.LineShape">
<g id="id6">
<rect class="BoundingBox" stroke="none" fill="none" x="8799" y="6099" width="30" height="3"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 8800,6100 L 8827,6100"/>
</g>
</g>
Использование процедуры преобразования окна просмотра, предложенной в предыдущем ответе ( https://svgwg.org/svg2-draft/coords.html#ComputingAViewportsTransform), повлечет ли слияние расширение ограничивающей рамки с последующим использованием источника из id5 и последующим преобразованием координат id6 в относительные значения внутри расширенного поля, которое я называю "объединенным"?: Мое арифметическое выражение - это псевдокод, указывающий мою формулу преобразования)
<g id="merged">
<rect class="BoundingBox" stroke="none" fill="none" x="8799" y="6099" width="300+(8799-7699)+30" height="203+(6100-4699)+3"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 7700,4900 C 7816,4847 7964,4842 8000,4700 m [(8799-7699) + (8800-8799), (6099-4699) + (6100-6099)] l (8827-8799),(6100-6099)"/>
</g>
Причина: фрагменты были нарисованы с помощью LibreOffice draw, а пути были соединены с помощью Inkscape, но я не смог сделать это полностью, поэтому мне пришлось вручную закрыть пути в окончательном результате Inkscape.
1 ответ
Пути могут иметь несколько подпутей. Поэтому в большинстве случаев вы можете просто складывать их вместе, например:
d="M 7700,4900 C 7816,4847 7964,4842 8000,4700 M 8800,6100 L 8827,6100"/>
Единственное, на что вам нужно обратить внимание, это то, если команда перемещения во втором пути является строчной. В одиночном пути начало с (относительного перемещения) является ошибкой и интерпретируется как (абсолютное перемещение). Но если вы добавите его к другому пути, строчные буквы будут действительными. Поэтому вам нужно будет изменить
m
чтобы
M
при добавлении.
Что касается ограничивающей рамки, вам просто нужно выполнить операцию «объединения». Другими словами, поиск минимальных и максимальных координат X и Y двух прямоугольников.
Box 1: minX="7699" minY="4699" maxX="7699 + 303 = 8002" maxY="4699 + 203 = 4902"
Box 2: minX="8799" minY="6099" maxX="8799 + 30 = 8829" maxY="6099 + 3 = 6102"
Union: minX="7699" minY="4699" maxX="8829" maxY="6102"
Box: x="7699" y="4699" width="1130" height="1403"
Итак, объединенные пути должны быть:
<g id="merged">
<rect class="BoundingBox" stroke="none" fill="none" x="7699" y="4699" width="1130" height="1403"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 7700,4900 C 7816,4847 7964,4842 8000,4700 M 8800,6100 L 8827,6100"/>
</g>