#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 🙂 … спасибо за исправление