Как представить полигон с дырой (дырами)?

Здесь есть несколько хороших ответов, но я хотел бы отметить пару других вещей. Параметры функций - это место, где светит PowerShell. Например, вы можете иметь именованные или позиционные параметры в расширенных функциях, например, так:

function Get-Something
{
    Param
    (
         [Parameter(Mandatory=$true, Position=0)]
         [string] $Name,
         [Parameter(Mandatory=$true, Position=1)]
         [int] $Id
    )
}

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

Get-Something -Id 34 -Name "Blah" 
Get-Something "Blah" 34

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

PowerShell также имеет возможность определять наборы параметров. Он использует это вместо перегрузки метода и опять-таки весьма полезен:

function Get-Something
{
    [CmdletBinding(DefaultParameterSetName='Name')]
    Param
    (
         [Parameter(Mandatory=$true, Position=0, ParameterSetName='Name')]
         [string] $Name,
         [Parameter(Mandatory=$true, Position=0, ParameterSetName='Id')]
         [int] $Id
    )
}

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

Get-Something "some name"
Get-Something 23
Get-Something -Name "some name"
Get-Something -Id 23

Вы также можете назначить дополнительные параметры для различных наборов параметров. (Это был довольно простой пример, очевидно). Внутри функции вы можете определить, какой набор параметров использовался с помощью свойства $ PsCmdlet.ParameterSetName. Например:

if($PsCmdlet.ParameterSetName -eq "Name")
{
    Write-Host "Doing something with name here"
}

Затем, в примечании к соответствующей стороне, также есть проверка параметров в PowerShell. Это одна из моих любимых функций PowerShell, и она делает код внутри ваших функций очень чистым. Есть множество проверок, которые вы можете использовать. Вот пара примеров:

function Get-Something
{
    Param
    (
         [Parameter(Mandatory=$true, Position=0)]
         [ValidatePattern('^Some.*')]
         [string] $Name,
         [Parameter(Mandatory=$true, Position=1)]
         [ValidateRange(10,100)]
         [int] $Id
    )
}

В первом примере ValidatePattern принимает регулярное выражение, которое гарантирует, что предоставленный параметр соответствует ожидаемому. Если это не так, выдается интуитивно понятное исключение, которое говорит вам, что именно не так. Таким образом, в этом примере «Something» будет работать нормально, но «Summer» не пройдет проверку.

ValidateRange гарантирует, что значение параметра находится в диапазоне, который вы ожидаете для целого числа. Таким образом, 10 или 99 сработают, но 101 сгенерирует исключение.

Другим полезным является ValidateSet, который позволяет явно определять массив допустимых значений. Если будет введено что-то еще, будет сгенерировано исключение. Есть и другие, но, вероятно, наиболее полезным является ValidateScript. Это берет блок скрипта, который должен иметь значение $ true, поэтому пределом является небо. Например:

function Get-Something
{
    Param
    (
         [Parameter(Mandatory=$true, Position=0)]
         [ValidateScript({ Test-Path 

Здесь есть несколько хороших ответов, но я хотел бы отметить пару других вещей. Параметры функций - это место, где светит PowerShell. Например, вы можете иметь именованные или позиционные параметры в расширенных функциях, например, так:

[110]

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

[111]

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

PowerShell также имеет возможность определять наборы параметров. Он использует это вместо перегрузки метода и опять-таки весьма полезен:

[112]

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

[113]

Вы также можете назначить дополнительные параметры для различных наборов параметров. (Это был довольно простой пример, очевидно). Внутри функции вы можете определить, какой набор параметров использовался с помощью свойства $ PsCmdlet.ParameterSetName. Например:

[114]

Затем, в примечании к соответствующей стороне, также есть проверка параметров в PowerShell. Это одна из моих любимых функций PowerShell, и она делает код внутри ваших функций очень чистым. Есть множество проверок, которые вы можете использовать. Вот пара примеров:

[115]

В первом примере ValidatePattern принимает регулярное выражение, которое гарантирует, что предоставленный параметр соответствует ожидаемому. Если это не так, выдается интуитивно понятное исключение, которое говорит вам, что именно не так. Таким образом, в этом примере «Something» будет работать нормально, но «Summer» не пройдет проверку.

ValidateRange гарантирует, что значение параметра находится в диапазоне, который вы ожидаете для целого числа. Таким образом, 10 или 99 сработают, но 101 сгенерирует исключение.

Другим полезным является ValidateSet, который позволяет явно определять массив допустимых значений. Если будет введено что-то еще, будет сгенерировано исключение. Есть и другие, но, вероятно, наиболее полезным является ValidateScript. Это берет блок скрипта, который должен иметь значение $ true, поэтому пределом является небо. Например:

[116]

В этом примере мы не только уверены, что $ Path существует, но и является файлом (в отличие от каталога) и имеет расширение .csv. ($ _ относится к параметру, находящемуся внутри вашего скриптового блока.) Вы также можете передать гораздо большие многострочные скриптовые блоки, если требуется этот уровень, или использовать несколько скриптовых блоков, как я сделал здесь. Это чрезвычайно полезно, и делает для хороших чистых функций и интуитивных исключений.

-PathType 'Leaf' })] [ValidateScript({ (Get-Item

Здесь есть несколько хороших ответов, но я хотел бы отметить пару других вещей. Параметры функций - это место, где светит PowerShell. Например, вы можете иметь именованные или позиционные параметры в расширенных функциях, например, так:

[110]

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

[111]

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

PowerShell также имеет возможность определять наборы параметров. Он использует это вместо перегрузки метода и опять-таки весьма полезен:

[112]

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

[113]

Вы также можете назначить дополнительные параметры для различных наборов параметров. (Это был довольно простой пример, очевидно). Внутри функции вы можете определить, какой набор параметров использовался с помощью свойства $ PsCmdlet.ParameterSetName. Например:

[114]

Затем, в примечании к соответствующей стороне, также есть проверка параметров в PowerShell. Это одна из моих любимых функций PowerShell, и она делает код внутри ваших функций очень чистым. Есть множество проверок, которые вы можете использовать. Вот пара примеров:

[115]

В первом примере ValidatePattern принимает регулярное выражение, которое гарантирует, что предоставленный параметр соответствует ожидаемому. Если это не так, выдается интуитивно понятное исключение, которое говорит вам, что именно не так. Таким образом, в этом примере «Something» будет работать нормально, но «Summer» не пройдет проверку.

ValidateRange гарантирует, что значение параметра находится в диапазоне, который вы ожидаете для целого числа. Таким образом, 10 или 99 сработают, но 101 сгенерирует исключение.

Другим полезным является ValidateSet, который позволяет явно определять массив допустимых значений. Если будет введено что-то еще, будет сгенерировано исключение. Есть и другие, но, вероятно, наиболее полезным является ValidateScript. Это берет блок скрипта, который должен иметь значение $ true, поэтому пределом является небо. Например:

[116]

В этом примере мы не только уверены, что $ Path существует, но и является файлом (в отличие от каталога) и имеет расширение .csv. ($ _ относится к параметру, находящемуся внутри вашего скриптового блока.) Вы также можете передать гораздо большие многострочные скриптовые блоки, если требуется этот уровень, или использовать несколько скриптовых блоков, как я сделал здесь. Это чрезвычайно полезно, и делает для хороших чистых функций и интуитивных исключений.

| select -Expand Extension) -eq ".csv" })] [string] $Path ) }

В этом примере мы не только уверены, что $ Path существует, но и является файлом (в отличие от каталога) и имеет расширение .csv. ($ _ относится к параметру, находящемуся внутри вашего скриптового блока.) Вы также можете передать гораздо большие многострочные скриптовые блоки, если требуется этот уровень, или использовать несколько скриптовых блоков, как я сделал здесь. Это чрезвычайно полезно, и делает для хороших чистых функций и интуитивных исключений.

7
задан 3 revs 26 June 2009 в 06:48
поделиться

6 ответов

Как сказал Кендалл, включая ключ на устройстве в основном просит взломать. Однако есть люди, у которых есть причины скрывать данные с помощью ключа на устройстве. Если вы полны решимости это сделать, вы можете рассмотреть возможность использования SQLCipher для своей реализации. Это сборка SQLite, которая обеспечивает прозрачное шифрование всей БД на уровне страниц. На Mobile Orchard есть руководство по использованию в приложениях для iPhone.

Есть люди, у которых есть свои причины скрывать данные с помощью ключа на устройстве. Если вы полны решимости это сделать, вы можете рассмотреть возможность использования SQLCipher для своей реализации. Это сборка SQLite, которая обеспечивает прозрачное шифрование всей БД на уровне страниц. На Mobile Orchard есть руководство по использованию в приложениях для iPhone.

Есть люди, у которых есть свои причины скрывать данные с помощью ключа на устройстве. Если вы полны решимости это сделать, вы можете рассмотреть возможность использования
SQLCipher для своей реализации. Это сборка SQLite, которая обеспечивает прозрачное шифрование всей БД на уровне страниц. На Mobile Orchard есть руководство по использованию в приложениях для iPhone.

плюс ноль или более внутренних границ, все из которых не пересекаются *. Если вы используете ненулевое число витков
для определения внутренних / внешних границ, не забудьте указать внутренние границы в направлении, противоположном внешним границам (против часовой стрелки для внешних и по часовой стрелке для внутренних или наоборот), чтобы контурные интегралы внутри отверстий равны нулю.

FYI, это вид определения / представления был формализован в спецификации OpenGIS Simple Features Specification ( PDF ).

Что касается представления:

I Вероятно, у нас есть массив ячеек из K Nx2 матриц, где первый элемент в массиве ячеек является внешней границей, а остальные элементы (если есть) в массиве ячеек являются внутренними границами. Я бы использовал массив ячеек, потому что на каждой границе может быть не одинаковое количество точек.

* nonoverlapping = кроме отдельных точек, например ромба внутри квадрата:

alt text alt text

6
ответ дан 6 December 2019 в 21:18
поделиться

Вы можете разбить многоугольник с отверстием на две формы без отверстия. Когда вы выполняете интеграцию контура в сложной плоскости, вы можете создать «вырез» от одного края многоугольника, который приведет вас к краю отверстия; объединить вокруг одной стороны отверстия и обратно; затем обойдите другую сторону для второго многоугольника. В результате вы получаете два интеграла по траектории вдоль каждого разреза, которые компенсируют друг друга.

«График видимости» - это для расчета коэффициента обзора излучения с затенением? Или графический алгоритм трассировки лучей?

3
ответ дан 6 December 2019 в 21:18
поделиться

A polygon, plus a list of polygonal holes. Just be sure the various polygons don't intersect.

What do you plan to do with this thing?

1
ответ дан 6 December 2019 в 21:18
поделиться

По-видимому, вам понадобится древовидная структура, если вы хотите, чтобы она была как можно более общей (т. е. многоугольники с многоугольными отверстиями, внутри которых есть многоугольники с отверстиями внутри, ...). Matlab не очень хорош для эффективного представления древовидных структур, но вот одна идея ...

Имейте структуру-массив многоугольников.

Каждый многоугольник представляет собой структуру с двумя полями, «углами» и «дочерними элементами». .

Поле 'corners' содержит матрицу (x, y) координат углов, доступ к которой осуществляется как «data {polyIdx} .corners (:, cornerIdx)».

Поле 'children' является структурным массивом многоугольников.

Вот пример кода для создания треугольника с поддельными дочерними элементами, которые являются дырами (они не являются '

1
ответ дан 6 December 2019 в 21:18
поделиться

What exactly do you mean under "a visibility graph" ?

Two "full" poligons, two states possible, either +1 or -1.

If you're representing a hole, you've got one with state +1 and one with state -1, which represents a hole, resulting in state 0.
If you've got overlapping polygons, you'll end up with resultant state >1. Then you can calculate the borders of a new polygon.
If you've got two polygons with holes that intersect, then first calculate the state of a new polygon which consists of outer borders of the two old ones, then deal with holes.

Anyways, ... I think you get the general principle.

Have no idea how to do it in matlab, I used it only marginally so far, and even that for very simple things.

0
ответ дан 6 December 2019 в 21:18
поделиться

It sounds like each hole is just a polygon inside the polygon itself. Perhaps you could store a vector like you describe for the outer polygon, then a vector of more polygon vectors for the holes.

1
ответ дан 6 December 2019 в 21:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: