2009-06-24 5 views
7

Моя задача - разработать алгоритм, который подходит для разных видов кривых на заданную точечную последовательность в 2-мерном пространстве.2D-рендеринг и масштабирование с помощью SVG

Чтобы проверить свой алгоритм, я выбрал SVG для отображения результата. У меня есть несколько проблем с этим.

Поскольку могут быть очень разные входы и выходы моего алгоритма, очень важно, чтобы я мог просматривать сгенерированные файлы SVG с возможностью увеличения!

Но путь в SVG может отображаться только с определенной шириной. Если я увеличиваю масштаб, ширина дорожки становится шире. Я хотел бы, чтобы ширина была, например, 1 пиксель на всех уровнях масштабирования. Есть ли решение для этого?

Также: могут отображаться точки SVG? Да, простые, сырые точки.? Я обнаружил, что это невозможно.

Спасибо

ответ

8

Многих других векторных форматов (например, PostScript и PDF) позволит использовать штрих-ширину 0 для «роста волос» инсульта. Не так с SVG. Тем не менее, я думаю, что вы можете достичь того, чего хотите, если используете процентную ширину штриха. См the w3c SVG specifications for details, но, в принципе, вы должны быть в состоянии сделать что-то вроде этого:

stroke-width:"1%" 

Это должно ход вашей кривой с шириной линии, которая является постоянным 1% от ограничивающего прямоугольника, независимо от уровня масштабирования.

Что касается точек, SVG их не поддерживает. Когда я делал это в прошлом (используя PostScript), я всегда использовал arc with a small redius, чтобы нарисовать небольшой круг (который вы можете заполнить, чтобы сделать точку, если хотите).


@Zoli: После того, как Ваш комментарий, я собирался предложить вам посмотреть в PostScript, чтобы вы могли использовать волосяную линию обводку ширину, когда я наткнулся на non-scaling-stroke vector-effect in the SVG specification:

vector-effect="non-scaling-stroke" 

Просто добавьте в ваша кривая, и она должна быть инвариантной к масштабированию, согласно спецификации. В их примере используется line, но он также должен работать на ваших кривых.

+0

Использование%: масштабирование также расширяет линию. – libeako

+0

Благодарим вас за свойство векторного эффекта, но оно не работает, как я хочу. Он не защищает от масштабирования, только против преобразования в самом документе SVG. Но даже это не работает, я думаю, потому что это может быть слишком новая функция SVG - Mozilla Firefox, возможно, не поддерживает ее. – libeako

+0

Я считаю, что это функция SVG 1.2, но она даже поддерживается в мобильных и крошечных профилях, поэтому любая реализация SVG 1.2 должна ее поддерживать. Описание из спецификации SVG показало, что оно должно работать и для масштабирования, поскольку оно просто должно отображаться в контексте устройства (например, в пространстве экрана). Вы пробовали других зрителей SVG, чтобы посмотреть, как там работает? – Naaff

0

Спасибо, Наафф, помощь. Я думаю, что останусь с firefox, и я буду указывать для каждого алгоритма выполнение строчной ширины в сгенерированном файле svg. Это будет адекватно для меня.

1

В настоящее время нет ни одного элемента < > или что-то подобное в SVG, но добавление, которое обсуждалось в WGG SVG, поэтому оно может быть включено в будущем. Не стесняйтесь озвучивать свои потребности и требования для < пункт > элемент в список рассылки svg: [email protected]

Обходным путем является использование, например, < элементов >, и пусть они имеют нулевую длину, если вы хотите, чтобы у вас были круглые линии, чтобы они отображали точку. Все зависит от того, для чего вам это нужно. Круг с r = 0 может быть лучше подходит.

Свойство «вектор-эффект» со значением «non-scaling-stroke» - это то, что вы должны использовать, чтобы сказать, что удар не должен масштабироваться. Это не так сложно реализовать решение javascript, которое обеспечивает правильное масштабирование штрихов, если «векторный эффект» не поддерживается изначально.Opera 9.5+ поддерживает его изначально.

Смежные вопросы