Создайте ограничивающий прямоугольник из двух точек с настраиваемой шириной - PullRequest
0 голосов
/ 28 августа 2018

У меня есть две точки, составляющие линию, я хочу посмотреть, является ли точка на линии неровной. Для этого мне нужно создать ограничивающий прямоугольник / прямоугольник шириной D наружу / перпендикулярно линии. Я следил за этим сайтом для руководства , но, похоже, неправильно его реализовал. Любая помощь будет оценена.

  private static bool IsInside(GPS Point1, GPS Point2)
        {
            GPS VectorV = new GPS()
            {
                Longitude = Point1.Longitude - Point2.Longitude,
                Latitude = Point1.Latitude - Point2.Latitude
            };

            GPS VectorW = new GPS()
            {
                Longitude = -1 / VectorV.Longitude,
                Latitude = -1 / VectorV.Latitude
            };

            double W = Math.Sqrt(Convert.ToDouble(VectorW.Latitude * VectorW.Latitude) + Convert.ToDouble(VectorW.Longitude * VectorW.Longitude));

            GPS NewVector = new GPS()
            {
                Longitude = Convert.ToDecimal(Convert.ToDouble(VectorW.Longitude) / W),
                Latitude = Convert.ToDecimal(Convert.ToDouble(VectorW.Latitude) / W),
            };

            decimal D = 5;

            GPS DisplacmentVector = new GPS()
            {
                Longitude = (D / 2) * NewVector.Longitude,
                Latitude = (D / 2) * NewVector.Latitude
            };

            GPS BPoint1 = new GPS() { Longitude = Point1.Longitude + DisplacmentVector.Longitude, Latitude = Point1.Latitude + DisplacmentVector.Latitude };
            GPS BPoint2 = new GPS() { Longitude = Point1.Longitude - DisplacmentVector.Longitude, Latitude = Point1.Latitude - DisplacmentVector.Latitude };
            GPS BPoint3 = new GPS() { Longitude = Point2.Longitude + DisplacmentVector.Longitude, Latitude = Point2.Latitude + DisplacmentVector.Latitude };
            GPS BPoint4 = new GPS() { Longitude = Point2.Longitude - DisplacmentVector.Longitude, Latitude = Point2.Latitude - DisplacmentVector.Latitude };
}

 public partial class GPS
    {
        public decimal Longitude { get; set; }
        public decimal Latitude { get; set; }

        public GPS() { }

        public GPS(decimal longitude, decimal latitude) {
            Longitude = longitude;
            Latitude = latitude;
        }
    }

Ответы [ 3 ]

0 голосов

Вы слишком усложняете вещи. Есть 3 случая для линии:

  1. Линия, параллельная оси x (координаты y обеих точек равны), легко вычисляется
  2. Линия, параллельная оси y (координаты x обеих точек равны), легко вычисляется

для отдыха вам нужны dx и dy:

cos(θ) = dx / (D / 2) => dx = cos(θ) * (D / 2)
sin(θ) = dy / (D / 2) => dy = sin(θ) * (D / 2)

θ = 90 - φ
tan(φ) = a / b => φ = atan(a / b)

enter image description here

Вот так.

0 голосов
/ 29 августа 2018

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

Для руководства я следовал / использовал этот код.

0 голосов
/ 28 августа 2018

Если у вас есть вектор v= A to B = {xb-xa, yb-ya} = {vx, vy}, для его перпендикуляра есть два направления: одно направление справа от A-> B, другое направление слева от A-> B.

Один перпендикулярный вектор w1= {-vy, vx} (влево), другой w2= {vy, -vx} (вправо). Примечание, чем w1 = -w2.

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

Давайте использовать w1. Ваше определение неверно. Используйте это вместо:

GPS VectorW = new GPS()
{
    Longitude = - VectorV.Latitude,
    Latitude =  VectorV.Longitude
};
...