Получить очки х расстояние внутри многоугольника - PullRequest
0 голосов
/ 05 марта 2020

Я не могу найти способ сделать это. У меня есть список точек vector2, и мне нужны все точки, которые находятся внутри этого многоугольника с расстоянием x.

Итак, у меня есть List из Green точек и я ищу List из красных точек, которые находятся на расстоянии x от соответствующих зеленых точек.

enter image description here

Я думаю о том, чтобы получить 2 воображаемых очка, 1 единицу по отношению к предыдущей и следующей точке. Затем двигайтесь к центру этих 2 точек на расстояние x. Но тогда, если межстрочный угол не равен 90, он выйдет за пределы многоугольника.

Vector2 me = point; // point
Vector2 next = n_point; // on left
Vector2 previous = p_point; // on right
//Debug.DrawLine(me, (me - next), Color.green);
// 2 points ep1 & ep2 
Vector2 center = Vector2.Lerp(ep1,ep2, 0.5f); 
Vector2 finalpoint = Vector2.Lerp(me,center,0.1f); //move towards center

enter image description here

Я думаю, что я обдумываю это. Есть ли супер-простой способ сделать это?

Ответы [ 2 ]

1 голос
/ 05 марта 2020

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

Получите векторы направления.

Vector2 from = me - previous;
Vector2 to = next - me;

Я также предполагаю, что всегда есть очередь. То есть, если from горизонтально, то to вертикально и наоборот. Либо x, либо y равно 0.0f, а другая координата не равна нулю. Я также предполагаю, что ось X указывает вправо, а ось Y - вверх. Предполагая, что точки перечислены по часовой стрелке.

float x, y;
if (from.x > 0.0f) { // from points to the right
    y = me.y - distance;
    if (to.y > 0.0f) x = me.x + distance else x = me.x - distance;
} else if (from.x < 0.0f) { // from points to the left
    y = me.y + distance;
    if (to.y > 0.0f) x = me.x + distance else x = me.x - distance;
} else if (from.y > 0.0f) { // from points upwards
    x = me.x + distance;
    if (to.x > 0.0f) y = me.y - distance else y = me.y + distance;
} else { // from.y < 0.0f, points downwards
    x = me.x - distance;
    if (to.x > 0.0f) y = me.y - distance else y = me.y + distance;
}
Vector2 me_inner = new Vector2(x, y);

Я надеюсь, что все знаки были правильными.

0 голосов
/ 05 марта 2020

На ум приходят два метода

Option1:

  1. Для каждой линии задайте нормаль, то есть перпендикулярную линию, направленную наружу
  2. Определите нормаль для каждой вершины в качестве среднего значения нормалей линий вершина является частью.
  3. Перемещение единиц вершины X вдоль нормали.

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

Option2:

  1. Для каждой линии задайте нормаль, то есть перпендикулярную линию, направленную наружу
  2. Move каждый отрезок линии X Единицы по нормали.
  3. для каждой последовательной пары отрезков линии определяют, пересекаются ли:
  4. два отрезка, если это так, используйте точку пересечения в качестве вершины. т.е. добавьте точку пересечения в ваш список точек.
  5. Если они не пересекаются, вставьте новый отрезок линии между начальной и конечной точкой линий. т.е. вставьте начальную и конечную вершины в ваш список точек.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...