2012-04-02 6 views
6

Если кто-то может помочь при вычислении области пути SVG, я был бы очень благодарен.Как рассчитать площадь пути SVG C#

У меня есть функция, чтобы получить общую длину, которая работает очень хорошо.

Я видел яваскрипт метода, который преобразует путь в к полигону:

http://phrogz.net/SVG/convert_path_to_polygon.xhtml

Преобразования это C# будет хороший маршрутом, как у меня есть функция, которая получает площадь многоугольника с достаточной точностью.

С уважением

Если есть какие-либо сомнения относительно того, что спрашивают здесь ......

Если вы знаете что-нибудь о формате SVG файла, вы будете знать, что формы Путь SVG определяются куча координат, как это:

d="M195.303,64.357 c6.57-6.684,11.9-15.514,10.057-25.154 c-3.689-19.298-27.854-13.204-27.309-0.549 c-0.545-12.655-23.619-18.749-27.309,0.549    c-1.844,9.651,3.502,18.401,10.082,25.087 c1.697-4.813,5.713-8.03,11.482-9.451 c-2.797,1.531-3.809,4.396-3.809,7.812 c0,4.983,4.58,8.4,9.553,8.4s9.553-3.417,9.553-8.4c0-3.416-1.012-6.28-3.807-7.812C189.584,56.263,193.613,59.52,195.303,64.357 z" 

с и C определяют кривые Безье

(бы выложили изображение)

То, что я прошу, - это вычислить площадь для такой формы, используя точки координат/кривой.

Решение с использованием функции IronPython и Inkscape работает очень хорошо.

+0

Если у вас уже есть подпрограмма многоугольника, то, вероятно, вам нужно всего лишь XML-ридер, чтобы захватить данные точки, а затем передать точки в вашу функцию. Вы начали с такой рутины? – halfer

+0

Я могу читать все точки без проблем, точки для путей на самом деле не переводятся непосредственно в тот же формат, что и полигоны, пути могут иметь различные типы кривых и т. Д. – user1296173

+0

Ах, простите, я просто увидел «полигоны »и пропустил бит« пути »! Правильно, поскольку вы были ':)' – halfer

ответ

0

Я не мог сам разработать математику, поэтому в конце я использовал IronPython для выполнения модуля python из Inkscape, который измеряет любой путь, достаточно точно для того, для чего я его использую.

Я отправлю детали Если кто-то ищет то же самое, но это действительно довольно просто и не требует большого редактирования файлов Python. Вам нужно использовать .net framework v4.0.

+2

Мне бы хотелось посмотреть, как это делается. – user568458

+0

, когда у меня есть время, я добавлю его. – user1296173

+2

Все еще ожидая подробностей, было бы замечательно использовать тот же метод, что и вы. :) –

7

позволяет рассматривать называть точку замкнутого полигональных (x0, y0) ... (хп, уп), можно вычислить площадь по простым зацикливание через точку с этой формулой

area += yi+y(i+1) * (x(i+1)-xi)/2 

Просто к уточнить с помощью x (i + 1) и y (i + 1) Я имею в виду следующую точку . Цикл должен начинаться с 0 и останавливаться в вершине n-1 (так что следующая точка всегда действительна), и когда последняя точка достигнута, рассмотрите ptn-pt0 область должна быть взята как abs, иначе вы можете использовать знак, чтобы проверить, многоугольник по часовой стрелке или против часовой стрелки. Я просто добавлю рисунок, чтобы объяснить, как он работает, поэтому вы можете расширять его для обработки различных типов кривых. Давайте рассмотрим этот рисунок: enter image description here

Идея заключается в том, чтобы вычислить площадь зеленого многоугольника алгебраической суммы площадь каждой трапеции обособленный от полигона края и оси х, в этом случае трапеции:

x0,y0 x1,y1 x1,0 x0,0 
x1,y1 x2,y2 x2,0 x1,0 
(-)x2,y2 x3,y3 x3,0 x2,0 
(-)x3,y3 x4,y4 x4,0 x3,0 
(-)x4,y4 x0,y0 x0,0 x4,0 

первые два положительные, последние три отрицательные, и, как вы видите, разница в зеленой части, то есть в необходимой области. Я не так хорош в рисовании, но попытаюсь понять, что результат получается из-за перекрывающейся трапеции, которая работает аддитивным и субтрактивным способом. Даже если на чертеже изображен выпуклый многоугольник, он работает для вогнутых многоугольников , а также. В случае, когда ребро не является сегментом, первое, что вам нужно сделать, это преобразовать его в список сегментов, используя параметрическое уравнение на кривой и отбирать его, вы получите приличное приближение. Лучшее решение состоит в том, чтобы рассмотреть параметрическую функцию не линейного сегмента и интегрировать ее по оси X (вычислить площадь между кривой и осью X) и суммировать ее, когда я суммирую площадь линейных сегментов , Это связано с некоторой математикой, но вы можете найти help you need here. Вам просто нужно использовать правильное уравнение сегмента.

+0

Привет, Феличе, у меня есть метод очень подобно тому, что я получил с этого сайта, я думаю ..) fopr область полигона, это - Пути, которые я действительно интересуюсь. Если я смогу преобразовать путь в многоугольник, я надеюсь, что смогу использовать тот же метод. – user1296173

+0

@ user1296173 Путь - это просто набор точек, точно как многоугольник. В чем проблема с использованием этих точек в функции? – Slugart

+0

@ user1296173 вы можете использовать коллекцию очков, как сказал Слюгарт. Если какая-то часть пути - это дуги ... вы можете приблизиться к ним с несколькими сегментами, но есть лучший способ, который я должен запомнить :) –

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