Найдите количество внутренних углов полигона, больше, чем 180º

Я думаю, ты должен быть в состоянии сделать это очень хорошо.

docker-compose:

version: '3'
services:
    my-shared-build:
        image: my-shared-build:latest
        build: my-shared-build

    my-process-one:
        image: my-process-one:latest
        build: my-process-one
        depends_on:
            - my-shared-build

    my-process-two:
        image: my-process-two:latest
        build: my-process-two
        depends_on:
            - my-shared-build
            - my-process-one

Предполагая, что ваши файлы Docker находятся в подкаталогах my-shared-build, my-process-one, my-process-two, это должно собрать все 3 образа заказ)

5
задан Svante 3 February 2009 в 17:30
поделиться

5 ответов

Можно определить угол двух векторов просто путем взятия скалярного произведения (скалярное произведение). Полезное свойство - то, что, если векторы являются ортогональными, их скалярное произведение является нулем; если их угол является тупым, продукт отрицателен, в других отношениях положителен. Так, шаги для взятия:

  • найдите первый край от V0 до V1 (как вектор, Вы добираетесь, это путем вычитания координат), затем поверните его на 90 градусов налево (это просто преобразовывает (x y) кому: (-y x))
  • найдите второй край от V1 до V2 (не повернутым)
  • возьмите скалярное произведение (это справедливо (x1 * x2) + (y1 * y2))
  • если скалярное произведение отрицательно, это - правый поворот, иначе левый поворот
  • следующий край...
  • если Вы проходите вершины против часовой стрелки, считаете количество правых поворотов, иначе количество левых поворотов
  • для последней вершины необходимо возвратиться к первому (т.е. использовать края Vn для V0 и V0 к V1),

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

     1  n-1
A = --- SUM( x(i)*y(i+1) - x(i+1)*y(i) )
     2  i=0

где n количество вершин. x(n) и y(n) совпадают с x(0) и y(0) (для закрытия полигона).

Если это положительно, то вершины заказаны против часовой стрелки иначе по часовой стрелке.

править: При упрощении шагов вращения и скалярного произведения Вы прибываете в формулу для двумерного векторного произведения, x1*y2 - x2*y1. Это упрощает первые шаги выше:

  • найдите первый край от V0 до V1 (как вектор путем вычитания координат)
  • так же для второго края от V1 до V2
  • возьмите векторное произведение ((x1 * y2) - (x2 * y1))
  • если векторное произведение положительно, это - левый поворот

Извините за замысловатый первый подход.

4
ответ дан 14 December 2019 в 19:28
поделиться
  1. Найдите выпуклую оболочку вершин.
  2. Определите вершины, которые не лежат на выпуклой оболочке. Это Ваши вершины кандидата с> 180 внешних углов.
  3. Поскольку каждая такая вершина занимается расследованиями далее об угле (Не может думать ни о каком пути прямо сейчас, но можно расширить это).
2
ответ дан 14 December 2019 в 19:28
поделиться

Это - вопрос, связанный с геометрией, не точно progamming связанный.

Если у Вас есть вершины, можно просто найти внутренние углы тригонометрией, подобной тому, как Вы находите углы треугольника.

Используя три смежных вершины, предположите, что треугольник и они находят внутренние углы.

Например, посмотрите на полигон:

Polygon

Мы можем создать треугольник как:

Construct internal triangle

-1
ответ дан 14 December 2019 в 19:28
поделиться

Я предполагаю, что это - неправильный полигон, так как для правильного многоугольника было бы действительно трудно иметь внутренний угол, больше, чем 180 градусов.

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

Например,

tan(angle_to_left) = (v.y-left.x)/(v.y-left.y)
tan(angle_to_right) = (v.y-right.x)/(v.y-right.y)

Затем добавьте углы вместе.

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

0
ответ дан 14 December 2019 в 19:28
поделиться

Проблема с касательной состоит в том когда x == 0. Если Вы только знаете вершины полигона, Вы не знаете достаточно, если это не треугольник, так как у них мог быть любой вид возможности соединения.

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

0
ответ дан 14 December 2019 в 19:28
поделиться
Другие вопросы по тегам:

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