Объединение двух путей 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>
Другие вопросы по тегам