Вычислить, пересекает ли ортогональная сквозная точка P отрезок линии, определенный его конечными точками

#dart #geometry

#dart #геометрия

Вопрос:

Предположим, что линия определена через ее конечные begin точки и end . Предположим, что P — это другая точка

введите описание изображения здесь

Я ищу метод, который возвращает true iff. ортогональная линия (A, B) через цель разрезает линию (A, B) между A и B.

Этот метод вычисляет длину линии:

   static double lengthOfLine(Offset a, Offset b ) {
    double length = math.sqrt( ( b.dx - a.dx )*( b.dx - a.dx )   ( b.dy - a.dy ) * ( b.dy - a.dy ) );
    return length;
  }
 

И эта функция определяет расстояние между target и неопределенной длинной линией, определяемой begin и end :

   static double shortestDistance(Offset begin, Offset end, Offset target) {

    double legnthOfLine = lengthOfLine( begin, end );

    double a = end.dy - begin.dy;
    double b = begin.dx - end.dx;
    double c = end.dx * begin.dy - begin.dx * end.dy;

    double q = a * target.dx   b * target.dy   c;
    if ( 0.0 > q ) {
      q = -1.0 * q;
    }

    return q / legnthOfLine;

  }
 

Я просто хочу знать, разрезается ли отогональная относительно Line(begin, end) сквозной target Line(begin, end) точки внутри begin и end .

Комментарии:

1. Вы можете вычислить пересечение между двумя линиями, а затем проверить, находится ли координата x пересечения между координатами x begin и end . (Или координаты y; это не имеет значения.) (И помните, что ортогональные линии имеют наклоны, которые являются отрицательными обратными друг другу.)

2. @jamesdlin Хорошая среда разработки. К сожалению, сегодня для меня немного поздно. Возьму мою старую книгу по математике. Концептуально можно было бы так: изобразить круг вокруг конца, который проходит мимо цели, и круг вокруг конца, который проходит мимо цели. Используя диаметры обеих окружностей, вы можете построить тень цели на другой стороне линии (начало, конец). Затем вычислите точку пересечения линии (начало, конец) и линии (цель, тень цели).

Ответ №1:

Работает ли это?

 static bool perp_intersects_segment(Offset start, Offset end,  Offset target ) {

    double start_end_x = end.dx - start.dx;
    double start_end_y = end.dy - start.dy;
    double dot_product = start_end_x * (target.dx - end.dx) 
                         start_end_y * (target.dy - end.dy);

    dot_product = ( start_end_x * (target.dx - start.dx) 
                    start_end_y * (target.dy - start.dy)
                  ) * dot_product;

    return ( dot_product <= 0.0 );

}
 

Комментарии:

1. Идеально! Спасибо, футуролог!

2. Вопрос от не носителя языка: зачем называть его perp?

3. @SteAp перпендикуляр пересекает отрезок… Я просто написал все, что пришло мне в голову… о, да… bool 🙂 … спасибо за исправление