Область Calculating включается произвольным полигоном на поверхности Земли

Там различие, но тонкий. Посмотрите на него этот путь: struct Foo представляет новый тип. Второй создает псевдоним по имени Foo (и не новый тип) для без имени struct тип.

7.1.3 спецификатор определения типа

1 [...]

имя А, объявленное со спецификатором определения типа, становится именем определения типа. В рамках его объявления имя определения типа синтаксически эквивалентно ключевому слову и называет тип связанным с идентификатором в пути описанный в Пункте 8. Имя определения типа является таким образом синонимом для другого типа. Имя определения типа не представляет новый тип путем, объявление класса (9.1) или перечислимое объявление делают.

8, Если объявление определения типа определяет класс без имени (или перечисление), первое имя определения типа, которое, как объявляет объявление, было, что тип класса (или перечислимый тип) используется для обозначения типа класса (или перечислимый тип) в целях связи только (3,5). [Пример:

typedef struct { } *ps, S; // S is the class name for linkage purposes

Так, определение типа всегда используется в качестве заполнителя/синонима для другого типа.

22
задан Paul A. Hoadley 27 August 2009 в 10:46
поделиться

3 ответа

Есть несколько способов сделать это.

1) Интегрировать вклады от широтных полос. Здесь площадь каждой полосы будет (Rcos (A) (B1-B0)) (RdA), где A - широта, B1 и B0 - начальная и конечная долготы, а все углы указаны в радианах.

2 ) Разбейте поверхность на сферических треугольников и вычислите площадь, используя теорему Жирара , и сложите их.

3) Как предлагает здесь Джеймс Шек, в работе ГИС они используют область, сохраняющую проекцию на плоское пространство, и вычислите площадь там.

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

Изменить - сравнение этих двух методов:

При первой проверке, Может показаться, что подход сферического треугольника является самым простым, но в целом это не так. Проблема в том, что нужно не только разбить область на треугольники, но и на сферические треугольники , то есть треугольники, стороны которых являются дугами большого круга. Например, широтные границы не подходят для , поэтому эти границы необходимо разбить на ребра, которые лучше аппроксимируют дуги большого круга. И это становится все труднее сделать для произвольных краев, где большие круги требуют определенных комбинаций сферических углов. Рассмотрим, например, как можно разбить среднюю полосу вокруг сферы, скажем, всю область между 0 и 45 градусами на сферические треугольники.

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

11
ответ дан 29 November 2019 в 05:13
поделиться

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

Если вы хотите сделать это с более «ГИС-ароматом», затем вам нужно выбрать единицу измерения для вашего района и найти подходящую проекцию, сохраняющую площадь (не все так). Поскольку вы говорите о вычислении произвольного многоугольника, я бы использовал что-то вроде проекции Ламберта Азимутальной равноплощади . Установите исходную точку / центр проекции как центр вашего многоугольника, спроецируйте многоугольник в новую систему координат, затем вычислите площадь, используя стандартные плоские методы.

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

Я не уверен, имеет ли это какое-либо отношение к тому, как работает функция areaint в Matlab.

Поскольку вы говорите о вычислении произвольного многоугольника, я бы использовал что-то вроде проекции Ламберта, равной азимутальной площади . Установите исходную точку / центр проекции в центр вашего многоугольника, спроецируйте многоугольник в новую систему координат, затем вычислите площадь, используя стандартные плоские методы.

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

Я не уверен, имеет ли это какое-либо отношение к тому, как работает функция areaint в Matlab.

Поскольку вы говорите о вычислении произвольного многоугольника, я бы использовал что-то вроде проекции Ламберта, равной азимутальной площади . Установите исходную точку / центр проекции в центр вашего многоугольника, спроецируйте многоугольник в новую систему координат, затем вычислите площадь, используя стандартные плоские методы.

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

Я не уверен, имеет ли это какое-либо отношение к тому, как работает функция areaint в Matlab.

Установите исходную точку / центр проекции как центр вашего многоугольника, спроецируйте многоугольник в новую систему координат, затем вычислите площадь, используя стандартные плоские методы.

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

Я не уверен, имеет ли это какое-либо отношение к тому, как работает функция areaint в Matlab.

Установите исходную точку / центр проекции в центр вашего многоугольника, спроецируйте многоугольник в новую систему координат, затем вычислите площадь, используя стандартные плоские методы.

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

Я не уверен, имеет ли это какое-либо отношение к тому, как работает функция areaint в Matlab.

8
ответ дан 29 November 2019 в 05:13
поделиться

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

R^2 * ( A + B + C - \pi)

, где R - радиус сферы, а A , B и C - внутренние углы треугольника (в радианах). Величина в скобках известна как «сферический избыток».

Ваш n -сторонний многоугольник будет разбит на n-2 треугольников. Суммируя все треугольники, выделяя общий множитель R ^ 2 и объединяя все \ pi вместе, площадь вашего многоугольника равна

R^2 * ( S - (n-2)\pi )

, где S - сумма углов вашего многоугольника.

[править] Это верно вне зависимости от того, является ли многоугольник выпуклым. Важно только то, что его можно разрезать на треугольники.

Вы можете определить углы с помощью векторной математики. Предположим, у вас есть три вершины A , B , C и вас интересует угол в B . Следовательно, мы должны найти два касательных вектора (их значения не имеют значения) к сфере из точки B вдоль сегментов большого круга (ребер многоугольника). Разберемся для BA . Большой круг лежит в плоскости, определяемой OA и OB , где O - центр сферы, поэтому он должен быть перпендикулярен вектору нормали OA x OB . Он также должен быть перпендикулярен OB , так как там он касается. Таким образом, такой вектор задается формулой OB x (OA x OB) . Вы можете использовать правило правой руки, чтобы убедиться, что это в правильном направлении. Также обратите внимание, что это упрощается до OA * (OB.OB) - OB * (OB.OA) = OA * | OB | - OB * (OB.OA) .

Затем вы можете использовать старый добрый скалярный продукт, чтобы найти угол между сторонами: BA'.BC '= | BA' | * | BC '| * cos (B) , где BA ' и BC' - касательные векторы от B вдоль сторон к A и C .

Вы можете использовать правило правой руки, чтобы убедиться, что это в правильном направлении. Также обратите внимание, что это упрощается до OA * (OB.OB) - OB * (OB.OA) = OA * | OB | - OB * (OB.OA) .

Затем вы можете использовать старый добрый скалярный продукт, чтобы найти угол между сторонами: BA'.BC '= | BA' | * | BC '| * cos (B) , где BA ' и BC' - касательные векторы от B вдоль сторон к A и C .

Вы можете использовать правило правой руки, чтобы убедиться, что это в правильном направлении. Также обратите внимание, что это упрощается до OA * (OB.OB) - OB * (OB.OA) = OA * | OB | - OB * (OB.OA) .

Затем вы можете использовать старый добрый скалярный продукт, чтобы найти угол между сторонами: BA'.BC '= | BA' | * | BC '| * cos (B) , где BA ' и BC' - касательные векторы от B вдоль сторон к A и C .

[отредактировано, чтобы было ясно, что это касательные векторы, а не буквальные между точками]

5
ответ дан 29 November 2019 в 05:13
поделиться
Другие вопросы по тегам:

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