Как найти расстояние от точки до треугольника

Как найти расстояние между двумя точками?

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

Есть много разных способов найти расстояние между
двумя точками, но самый универсальный, на мой взгляд,
это найти расстояние взяв за основу Теорему Пифагора.
Исходя из этой теоремы, можно сказать, что в нашем
случае расстоянием(прямой), является гипотенуза,
а чем тогда являются точки, сейчас разберемся.

Формулировка великой Теоремы Пифагора звучит так:
в прямоугольном треугольнике квадрат гипотенузы равен
сумме квадратов катетов. Или же кратко, формулой:
( c^2 = a^2 + b^2 ) где c — это гипотенуза, a и b — катеты.

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

Итак, для примера возьмем точки с координатами
первой точки — x1 = 0; y1 = 4, второй точки — x2 =3; y2 = 0.
Как же нам теперь выразить точки через катеты a и b ?
Читайте дальше, все гениальное просто.

На рисунке 1 мы изобразили для наглядности
прямоугольный треугольник, с координатами
которые мы взяли для примера. На рисунке 2
тот же самый прямоугольный треугольник,
только без координат! Эти два прямоугольных
треугольника идентичные, поэтому вернемся
к Теореме Пифагора.

Заменяем длины катетов a и b, из Теоремы Пифагора,
на разность координат точек. ​Взгляните на формулу,
которая получилась:

Подставляем наши координаты:

В итоге получилось, что расстояние в нашем примере
равно 5(корень из 25). Как видите все просто, и вы можете
смело применять эту формулу, решая не только задачи,
но и на практике, находя расстояние зная только две точки.

Все формулы для треугольника

1. Как найти неизвестную сторону треугольника

Вычислить длину стороны треугольника: по стороне и двум углам или по двум сторонам и углу.

a , b , c — стороны произвольного треугольника

α , β , γ — противоположные углы

Формула длины через две стороны и угол (по теореме косинусов), ( a ):

* Внимательно , при подстановке в формулу, для тупого угла ( α >90), cos α принимает отрицательное значение

Формула длины через сторону и два угла (по теореме синусов), ( a):

2. Как узнать сторону прямоугольного треугольника

Есть следующие формулы для определения катета или гипотенузы

a , b — катеты

c — гипотенуза

α , β — острые углы

Формулы для катета, ( a ):

Формулы для катета, ( b ):

Формулы для гипотенузы, ( c ):

Формулы сторон по теореме Пифагора, ( a , b ):

3. Формулы сторон равнобедренного треугольника

Вычислить длину неизвестной стороны через любые стороны и углы

b — сторона (основание)

a — равные стороны

α — углы при основании

β — угол образованный равными сторонами

Формулы длины стороны (основания), (b ):

Формулы длины равных сторон , (a):

4. Найти длину высоты треугольника

Высота— перпендикуляр выходящий из любой вершины треугольника, к противоположной стороне (или ее продолжению, для треугольника с тупым углом).

Высоты треугольника пересекаются в одной точке, которая называется — ортоцентр.

H — высота треугольника

a — сторона, основание

b, c — стороны

β , γ — углы при основании

p — полупериметр, p=(a+b+c)/2

R — радиус описанной окружности

S — площадь треугольника

Формула длины высоты через стороны, ( H ):

Формула длины высоты через сторону и угол, ( H ):

Формула длины высоты через сторону и площадь, ( H ):

Формула длины высоты через стороны и радиус, ( H ):

Расстояние от точки до прямой

Что называется расстоянием от точки до прямой? Как найти расстояние от точки до прямой?

Расстоянием от точки до прямой называется длина перпендикуляра, опущенного из данной точки на прямую.

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

Например, на рисунке 1 расстояние от точки A до прямой a равно длине перпендикуляра AB, опущенного из точки A на прямую a.

Задачи на нахождение расстояния от точки до прямой сводятся к рассмотрению прямоугольного треугольника.

№ 1. Из точки к прямой проведены две наклонные, длины которых относятся как 2:3, а длины их проекций соответственно равны 2 см и 7 см. Найти расстояние от точки до прямой.

Дано: A∉a,

BC и BD — их проекции, BC=2 см, BD=7 см

1) Пусть k — коэффициент пропорциональности. Тогда AC=2k см, AD=3k см.

2) Рассмотрим треугольник ABC — прямоугольный (так как AB — перпендикуляр к прямой a по условию). По теореме Пифагора

3) Аналогично, из треугольника ABD

4) Приравниваем правые части полученных равенств и находим k:

5) Зная k, найдем AB:

№ 2. Из точки к прямой проведены две наклонные, длины которых равны 13 см и 15 см. Найти расстояние от точки до прямой, если разность проекций наклонных равна 4 см.

Дано: A∉a,

AC и AD — наклонные, AC=13 см, AD=15 см,

BC и BD — их проекции, BD-BC=4 см

1) Пусть BC=x см, тогда BD=x+4 см.

2) Рассмотрим треугольник ABC — прямоугольный (так как AB — перпендикуляр к прямой a по условию). По теореме Пифагора

3) Аналогично, из треугольника ABD

4) Приравниваем правые части полученных равенств и находим x:

5) Зная x, найдем AB:

№ 3. Найти расстояние от точки A до прямой a, если известно, что наклонная AF, длина которой равна c, образует с прямой a угол α.

Дано: A∉a,

Треугольник ABF — прямоугольный (так как AB — перпендикуляр к прямой a по условию). AB — катет, противолежащий углу ACB, AF — гипотенуза.

источники:

http://www-formula.ru/2011-10-09-11-08-41

Расстояние от точки до прямой

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
 
int main()
{
double A,B,C,D,x1,x2,x3,y1,y2,y3,z1,z2,z3,nx,ny,nz;
double dist;
printf("Enter x1,y1,z1 :");
scanf("%lf,%lf,%lf",&x1,&y1,&z1);
printf("Enter x2,y2,z2 :");
scanf("%lf,%lf,%lf",&x2,&y2,&z2);
printf("Enter x3,y3,z3 :");
scanf("%lf,%lf,%lf",&x3,&y3,&z3);
printf("Enter nx,ny,nz :");
scanf("%lf,%lf,%lf",&nx,&ny,&nz);
 
A=y1*(z2-z3)+y2*(z3-z1)+y3*(z1-z2);
B=x1*(z3-z2)+x2*(z1-z3)+x3*(z2-z1);
C=x1*(y2-y3)+x2*(y3-y1)+x3*(y1-y2);
D=-x1*A-y1*B-z1*C;
 
if(A==0&&B==0&&C==0)
{
    printf("error");
    return 0;
}
 
printf("A=%.3lf,B=%.3lf,C=%.3lf,D=%.3lfn",A,B,C,D);
dist=fabs(A*nx+B*ny+C*nz+D)/sqrt(A*A+B*B+C*C);
 
printf("Distance=%.3lfn",dist);
 
return 0;
}

I’ll lead with my test case results.

enter image description here

The test case code and implementation is in C#

    public void ClosestPointToShouldWork()
    {
        var r = new Random(0);
        double next() => r.NextDouble() * 5 - 1;
        var t = new Triangle(new Vector3(0,0,0), new Vector3(3.5,2,0), new Vector3(3,0.0,0));

        DrawTriangle(t);

        var hash = new Vector3( 0, 0, 0 );
        for (int i = 0; i < 800; i++)
        {
            var pt = new Vector3( next(), next(), 0 );
            var pc = t.ClosestPointTo( pt );
            hash += pc;

            DrawLine(pc,pt);
        }

        // Test the hash
        // If it doesn't match then eyeball the visualization
        // and see what has gone wrong

        hash.ShouldBeApproximately( new Vector3(1496.28118561104,618.196568578824,0),1e-5  );

    }

The implementation code is fiddly as I have a number of framework classes. Hopefully you can treat this as pseudo code and pull out the algorithm. The raw vector types are from https://www.nuget.org/packages/System.DoubleNumerics/.

Note that some of the properties of Triangle could be cached to improve performance.

Note that to return the closest point does not require any square roots and does not require transforming the problem to 2D.

The algorithm first quickly tests if the test point is closest to an end point region. If that is inconclusive it then tests the edge external regions one by one. If those tests fail then the point is inside the triangle. Note that for randomly selected points far from the triangle it is most likely that the closest point will be a corner point of the triangle.

public class Triangle
{
    public Vector3 A => EdgeAb.A;
    public Vector3 B => EdgeBc.A;
    public Vector3 C => EdgeCa.A;

    public readonly Edge3 EdgeAb;
    public readonly Edge3 EdgeBc;
    public readonly Edge3 EdgeCa;

    public Triangle(Vector3 a, Vector3 b, Vector3 c)
    {
        EdgeAb = new Edge3( a, b );
        EdgeBc = new Edge3( b, c );
        EdgeCa = new Edge3( c, a );
        TriNorm = Vector3.Cross(a - b, a - c);
    }

    public Vector3[] Verticies => new[] {A, B, C};

    public readonly Vector3 TriNorm;

    private static readonly RangeDouble ZeroToOne = new RangeDouble(0,1);

    public Plane TriPlane => new Plane(A, TriNorm);

    // The below three could be pre-calculated to
    // trade off space vs time

    public Plane PlaneAb => new Plane(EdgeAb.A, Vector3.Cross(TriNorm, EdgeAb.Delta  ));
    public Plane PlaneBc => new Plane(EdgeBc.A, Vector3.Cross(TriNorm, EdgeBc.Delta  ));
    public Plane PlaneCa => new Plane(EdgeCa.A, Vector3.Cross(TriNorm, EdgeCa.Delta  ));

    public static readonly  RangeDouble Zero1 = new RangeDouble(0,1);

    public Vector3 ClosestPointTo(Vector3 p)
    {
        // Find the projection of the point onto the edge

        var uab = EdgeAb.Project( p );
        var uca = EdgeCa.Project( p );

        if (uca > 1 && uab < 0)
            return A;

        var ubc = EdgeBc.Project( p );

        if (uab > 1 && ubc < 0)
            return B;

        if (ubc > 1 && uca < 0)
            return C;

        if (ZeroToOne.Contains( uab ) && !PlaneAb.IsAbove( p ))
            return EdgeAb.PointAt( uab );

        if (ZeroToOne.Contains( ubc ) && !PlaneBc.IsAbove( p ))
            return EdgeBc.PointAt( ubc );

        if (ZeroToOne.Contains( uca ) && !PlaneCa.IsAbove( p ))
            return EdgeCa.PointAt( uca );

        // The closest point is in the triangle so 
        // project to the plane to find it
        return TriPlane.Project( p );

    }
}

And the edge structure

public struct Edge3
{

    public readonly Vector3 A;
    public readonly Vector3 B;
    public readonly Vector3 Delta;

    public Edge3(Vector3 a, Vector3 b)
    {
        A = a;
        B = b;
        Delta = b -a;
    }

    public Vector3 PointAt(double t) => A + t * Delta;
    public double LengthSquared => Delta.LengthSquared();

    public double Project(Vector3 p) => (p - A).Dot( Delta ) / LengthSquared;

}

And the plane structure

public struct Plane
{
    public Vector3 Point;
    public Vector3 Direction;

    public Plane(Vector3 point, Vector3 direction )
    {
            Point = point;
            Direction = direction;
    }

    public bool IsAbove(Vector3 q) => Direction.Dot(q - Point) > 0;

}

Наверх

расстояния от точки до плоскости

Расстояния от точки до плоскости треугольника более наглядно представлено в видео ниже.

Для этого необходимо первоначальные данные (задание) в виде координат точек:

Точки     X         Y         Z
A              30       0         0
B              60       10       90
C              130     90       70
D              40      90       90

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

Вы можете другие примеры выполнения заданий посмотреть здесь.

Еще один пример определения расстояния от точки до плоскости.

Просмотрели 290



РЕШЕНИЕ: Расстояние от точки до плоскости определяется длиной отрезка перпендикуляра, проведенного из заданной точки к заданной плоскости.

Далее приводится поэтапное графическое решение варианта №17 из данного списка вариантов.


Задачу решаем в следующей последовательности:

Рис.1

Строим плоскость треугольника АВС и точку D по заданным координатам варианта №17 (см. рис.1):


A (70, 45, 60),
B (40, 55, 0),
C (0, 10, 45),
D (65, 0, 15).


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

Рис.2

Затем строим в плоскости треугольника АВС фронталь и горизонталь (см. рис.2).

Фронталь это линия, которая параллельна оси ОХ на горизонтальной плоскости проекции (нижняя часть).

А горизонталь — линия, которая параллельна оси ОХ на фронтальной плоскости проекции (верхняя часть).

Данные линии проводятся через вершины треугольника (через точки А, B, C).
В нашем случае через вершину А мы проводим фронталь AF,
а через вершину С проводим горизонталь CH.

Рис.3

После того как мы построили фронталь и горизонталь, необходимо из точки D провести перпендикуляр к треугольнику АВС(см. рис.3).

При этом горизонтальная проекция перпендикуляра (от точки D1) должна быть перпендикулярна к горизонтальной проекции
горизонтали C1H1.

А фронтальная проекция (от точки D2) перпендикулярна к фронтальной проекции фронтали A2F2;

Рис.4

Теперь необходимо определить точку пересечения перпендикуляра с данной плоскостью,
заключив перпендикуляр во вспомогательную плоскость частного положения (см. рис.4).

Перпендикуляр через точку D1 заключаем во вспомогательную плоскость частного положения 1


Примечание: необязательно это делать через точку D1,
результат через точку D2 будет идентичным.



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


После того как мы провели вспомогательную плоскость 1
находим точки пересечения данной плоскости (M1P1) с треугольником АВС.
Проецируем их на фронтальную плоскость проекции и получаем точки M2P2.

Потом находим точку пересечения линии M2P2 вспомогательной плоскости
с перпендикуляром от точки D2 и отмечаем точку К2.
Проецируем точку К2 на горизонтальной плоскости проекции и получаем точку К1.

Рис.5

После того как мы провели перпендикуляр DK, осталось определить его действительную величину 
способом прямоугольного треугольника (см. рис.5).

Определяем расстояние по вертикали от точки D до точки K на какой-либо плоскости проекций.
Например на горизонтальной (нижней) плоскости проекции.


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


Откладываем это расстояние перпендикулярно отрезку DK
на противоположной плоскости проекции (в нашем случа на фронтальной) от любой из вершин (например от точки D)
и получили нулевую точку D0.

Расстояние от точки D0 до точки K2
и является искомым расстоянием от точки D до плоскости треугольника АВС.

Рис.6

Найдя расстояние от точки до плоскости треугольника АВС,
можно начать строить точку симметричную точке D относительно данного треугольника (см. рис.6).

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

Рассмотрим полученный нами отрезок D0K2.
В противоположную сторону от точки K2 откладываем отрезок равный D0K2.
Ставим точку Е0.

Рис.7

Затем проводим перпендикуляр к линии пенпендикуляра от точки D на рассматриваемой плоскости проекции (см. рис.7).

В нашем случае на фронтальной плоскости проекции к удлиненной линии D2K2.
На пересечении ставим точку Е2.

Линии D2K2 и К2Е2 так же равны между собой.

Рис.8

Строим проекцию полученной точки на противоположную плоскость проекции так же на линию перепендикуляра (см. рис.8).

В нашем случае проецируем полученную точку Е2 на горизонтальную плоскость проекции
на линию перепендикуляра (удлинненную линию D1K1).
Получаем точку Е1.
Линии D1K1 и К1Е1 так же равны между собой.

Понравилась статья? Поделить с друзьями:
  • Как найти стороны равнобедренного треугольника если известно
  • Как найти площадь трехмерного прямоугольника
  • Как найти сумму всех столбцов в экселе
  • Как найти силу тяги в двигателе машины
  • Как найти площидь фигуры