Чтобы расширить области триангуляции и суммы треугольников, они работают, если у вас есть выпуклый многоугольник ИЛИ вы случайно выбрали точку, которая не генерирует линии для каждой другой точки, пересекающей многоугольник.
. Для общего непересекающегося многоугольника вам нужно суммировать произведение произведения (опорная точка, точка a) (контрольная точка, точка b), где a и b являются «рядом» друг с другом.
Предполагая, что у вас есть список точек, которые определяют многоугольник в порядке (порядок, когда точки i и i + 1 образуют линию многоугольника):
Сумма (кросс-произведение ((точка 0, точка i), (точка 0, точка i + 1)) для i = 1 до n - 1.
Возьмите величину этого поперечного произведения и у вас есть площадь поверхности.
Это будет обрабатывать вогнутые многоугольники, не беспокоясь о выборе хорошей контрольной точки, любые три точки, которые генерируют треугольник, который не находится внутри многоугольника, будут иметь поперечное произведение, которое указывает в противоположном направлении любого треугольника, который находится внутри многоугольника , поэтому области правильно суммируются.
, если вы хотите игнорировать «первый» элемент только тогда:
//li[position()>1]
or
(//a)[position()>1]
, если вы хотите только последнее (например, ваш пример):
//li[last()]
or
(//a)[last()]
Вы можете использовать position()
, чтобы пропустить «первый», но в зависимости от того, какой элемент вам интересен и каков контекст, вам может потребоваться небольшое изменение в вашем XPATH.
Например, если вы хотите обратиться ко всем элементам li
и получить все, кроме первого, вы можете использовать:
//li[position()>1]
, и он будет работать как ожидалось, возвращая все li
элементы, за исключением первого.
Однако, если вы хотите обратиться ко всем элементам a
, вам нужно немного изменить XPATH. В контексте выражения //a[position()>1]
каждый из элементов a
будет иметь position()
из 1 и last()
будет оценивать значение true. Таким образом, он всегда будет возвращать каждый a
и не будет пропускать первый.
Вам нужно обернуть выражение, которое выбирает a
в скобках, чтобы сгруппировать их в наборе узлов, затем применяйте фильтр предикатов в позиции.
(//a)[position()>1]
В качестве альтернативы вы также можете использовать следующее выражение:
//a[preceding::a]
Это найдет все a
, за исключением первого (поскольку нет a
, предшествующего первому).
a[position()>1]
возвращает всеa
элементы, кроме первого. – Iain Samuel McLean Elder 14 April 2010 в 02:15a
будет равна 1 AND last () и возвращает каждый из элементовa
, а не пропускает первый. – Mads Hansen 14 April 2010 в 02:36position()
, чтобы оценить, как ожидалось, вам нужно обернуть выбор элементов в круглых скобках, чтобы сгруппировать их в наборе узлов, а then i> применить фильтр предикатов в позиции (т.е. (//a)[position()>1]
] и(//a)[last()]
) – Mads Hansen 14 April 2010 в 02:48//a[position()>1]
, а//a[last()]
имеет три совпадения. Вы тестировали свой XPath, прежде чем публиковать его? – Tomalak 14 April 2010 в 10:05