Veinar, я думаю, что существуют две точки, принадлежащие заданной прямой и находящиеся на заданном расстоянии от заданной плоскости. Не вдаваясь в подробности вычислений, могу предложить два способа решения задачи.
Первый способ заключается в том, что нужно найти плоскости, параллельные заданной и расположенные на заданном расстоянии от неё. Затем нужно найти точки пересечения заданной прямой с найденными плоскостями.
Второй способ заключается в том, что находится точка пересечения заданных прямой и плоскости. Затем находятся расстояния от точки [math](1,~0,~-1)[/math] до заданной плоскости и до найденной выше точки. Затем рассматриваются подобные треугольники, расположенные в плоскости, перпендикулярной заданной плоскости, и проходящей через заданную прямую.
Вроде бы так…
У меня есть отрезок с известными координатами концов. На этом отрезке есть точка. Я знаю расстояние от начала отрезка до этой точки. Мне надо найти координаты этой точки. Как найти эти координаты?
Пример: Есть 2 точки А(3,3) и В(6,4). Длина отрезка примерно 3,16. И есть точка С(?,?) на отрезке. Как найти координаты, если от А до С =1,8 ???
Dmytro
6,7011 золотой знак20 серебряных знаков55 бронзовых знаков
задан 3 мар 2016 в 20:40
4
Имеется отрезок AB
с координатами A(Xa, Ya)
и B(Xb, Yb)
.
Требуется найти координаты точки C(Xc, Yc)
, лежащей на отрезке AB
на расстоянии Rac
от точки A
.
Rab = sqrt((Xb - Xa) ^ 2 + (Yb - Ya) ^ 2)
k = Rac / Rab
Xc = Xa + (Xb - Xa) * k
Yc = Ya + (Yb - Ya) * k
Обозначения:
f ^ n
– возведение f
в степень n
, в нашем случае (первом) f
будет Xb - Xa
и n
будет 2
.
sqrt(f)
– квадратный корень из f
, в нашем случае f
будет (Xb - Xa) ^ 2 + (Yb - Ya) ^ 2
.
f / n
– деление f
на n
, в нашем случае f
будет Rac
и n
будет Rab
.
f * n
– умножение f
на n
, в нашем случае (первом) f
будет Xb - Xa
и n
будет k
.
ответ дан 4 мар 2016 в 6:54
Konstantin LesKonstantin Les
1,5388 серебряных знаков12 бронзовых знаков
2
Алгоритм без кода (довольно элементарный):
Имеем:
Две точки A
, B
; len
– расстояние от точки А
до требуемой точки C
full_len = |B - A| // длина вектора, соединяющего две точки == длина отрезка
C = A + (B - A) * (len / full_len)
Сложение векторов и умножение на число – очевидные операции.
ответ дан 3 мар 2016 в 20:56
int3int3
2,4579 серебряных знаков19 бронзовых знаков
8
nodet – точка конец вектора, в твоем случае точка b
nodef – точка начало вектора, в твоем случае точка a
dx = nodet.x - nodef.x
dy = nodet.y - nodef.y
dz = nodet.z - nodef.z
r = math.sqrt(dx ** 2 + dy ** 2 + dz ** 2)
xx = dx * (step/r)
yy = dy * (step /r)
zz = dz * (step /r)
newnode = node(nodef.x + xx,nodef.y + yy,nodef.z + zz)
newnode – новая точка на заданом расстоянии
ответ дан 12 ноя 2019 в 16:31
qvuer7qvuer7
113 бронзовых знака
Для упрощения вычислений преобразуем координаты при помощи параллельного переноса с поворотом. Перенесем начало координат в точку В и повернем оси на 180°(рисунок для наглядности получим вращением исходной прямой вокруг тоски С на 180° и с началом координат в точке В в нормальном виде).
Старые координаты преобразуются в новой системе следующим образом: Ах = -х1 + х2 и Ay = -y1 + у2; Bx = -x2 + x2 = 0 и By = -y2 + y2 = 0; Cx = -x + x2 и Cy = -y + y2.
Переход от новых координат к старым осуществляется по формулам:
Хстар = – Хнов + Х2
Yстар = – Yнов + Y2
Найдем Сх и Cy в новой системе координат.
Из рисунка следуют две очевидные формулы:
1) Cx/Cy = Ax/Ay и
2) Cx² + Cy² = R²
из формулы 1) для С выражаем одну координату через другую: Cy = (Ay/Ax)·Cx = t·Cx, где t =(Ay/Ax)
Подставляя это в формулу 2) получим: Cx² + ( t·Cx)² = R² откуда выводим: Cx = R/√(1+t²) = R·Ax/√(Ax² + Ay²), и Cy = R·Ay/√(Ax² + Ay²)
Это координаты точки С в новой системе. В начальной системе эти координаты найдем по приведенным выше формулам:
X = – Cx + X2 = X2 – R·Ax/√(Ax² + Ay²), где Ах = -х1 + х2 и Ay = -y1 + у2 (подставляйте сами) и
Y = – Cy + X2 = X2 – R·Ay/√(Ax² + Ay²), где Ах = -х1 + х2 и Ay = -y1 + у2 (подставляйте сами).
Когда мы строим ломаную или кривую, иногда необходимо вместо привычных декартовых X,Y-координат задавать точку кривой через угол и расстояние. Ни в GDI, ни в GDI+, нет инструментов, чтобы задать координаты точки по углу от произвольной прямой и расстоянию.
Зато координаты можно очень легко посчитать. Вот этим сейчас и займемся. А потом найдем угол между двумя прямыми.
Найти координаты по углу и расстоянию
Если прямая, от которой необходимо отложить угол, параллельна оси X, формулы для нахождения координат достаточно очевидны.
Рис1. Прямая отстоит на угол от оси X
Где:
L — расстояние, или длина прямой (P1, P2)
А — угол, на который отстоит прямая (P1, P2) от прямой (P0, P1). Отрицательное значение угла означает — против часовой стрелки.
Теперь придадим прямой (P0, P1) наклон.
A (синий) — это угол, на который отстоит (P1, P2) от прямой (P0, P1);
В (красный) — угол на между прямой (P0, P1) и осью X;
C (оранжевый) — угол на между прямой (P1, P2) и осью X.
Задача сводится к нахождению угла C. Как нетрудно убедится по рисунку:
Угол А нам известен. Угол B найдем через arctan2. Функция arctan2 есть во множестве языков. Возможно, будет называться atan2.
Таким образом, функция для нахождения координат точки выглядит так:
// Посчитать координаты по углу и расстоянию // P0,P1 – прямая, точка считается от P1 // A – угол отклонения от (P0,P1), градусы // L – расстояние до точки function CalcPolarCoord(const P0, P1: TPointF; A, L: Single): TPointF; var B, C: Single; begin B := arctan2(p0.Y–p1.Y, p0.X–p1.x); C := A * PI/180 + B; Result.X := p1.X + cos(C) * L; Result.Y := p1.Y + sin(C) * L; end; |
И что, всегда работает? Всегда.
Найти угол по трем координатам
Рассмотрим процесс, обратный нахождению координаты по углу. Теперь будем находить угол между отрезками ломаной. Мы в плоскости работаем в декартовых координатах. Меняем мышкой координаты X, Y. А ситуация может возникнуть такая, что для предметной области важно хранить данные в полярных координатах.
Функция такая:
// Нахождение угла между тремя точками в градусах // Точки заданы массивом из трех элементов function CalcPolarAngle(const pnt: Array of TPointF): Single; var a1, a2: Single; begin if Length(pnt)<3 then Exit; a1 := ArcTan2(pnt[0].y–pnt[1].y, pnt[0].x–pnt[1].x) * 180/PI; a2 := ArcTan2(pnt[2].y–pnt[1].y, pnt[2].x–pnt[1].x) * 180/PI; Result := (a2 – a1); end; |
Более продвинутую функцию можно найти в статье Пересечение прямых, угол и координаты пересечения.
Друзья, спасибо за внимание!
Оставляйте комментарии. Подписывайтесь на телегу.
В группе комментариев уже потихоньку становится интересно )))
If I can move one unit along a line I can move any distance along that line. We’ll calculate how much we would have to add to each of $x_1$ and $y_1$ to move one unit along the line and then we’ll multiply that by $d$ to get the answer.
Let $d^{prime}$ be the distance between $(x_1,y_1)$ and $(x_2,y_2)$. It’s value is $$d^{prime}=sqrt{(x_2-x_1)^2+(y_2-y_1)^2}$$
If we move from $(x_1,y_1)$ to $(x_2,y_2)$ along the line connecting them we move $d^{prime}$ units. We can represent this by the function
$$(x_1,y_1)mapsto (x_1+(x_2-x_1),y_1+(y_2-y_1))$$
To move one unit along the same line, we divide the amount of the change by $d^{prime}$ to get
$$(x_1,y_1)mapsto (x_1+frac{1}{d^{prime}}(x_2-x_1),y_1+frac{1}{d^{prime}}(y_2-y_1))$$
Finally, to move a distance $d$ along the line we multiply the change by $d$ to get
$$(x_1,y_1)mapsto (x_1+frac{d}{d^{prime}}(x_2-x_1),y_1+frac{d}{d^{prime}}(y_2-y_1))$$