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

Я решал вышеизложенный вопрос, но слишком смутился с математическими уравнениями и переменными. Я начал с того, что пытался найти координаты двух других точек, но уравнения не могли быть решены мной, там было много переменных, и я запутался. Если бы это было завершено, я бы попытался проверить положение точки относительно сторон, но это также включало бы множество переменных и путаницу. Хороший алгоритм может быть полезен. Спасибо!

Вы можете найти две оставшиеся точки квадрата:

x1 = ? ; y1 = ? ; // First diagonal point x2 = ? ; y2 = ? ; // Second diagonal point xc = (x1 + x2)/2 ; yc = (y1 + y2)/2 ; // Center point xd = (x1 - x2)/2 ; yd = (y1 - y2)/2 ; // Half-diagonal x3 = xc - yd ; y3 = yc + xd; // Third corner x4 = xc + yd ; y4 = yc - xd; // Fourth corner 

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

Прочитайте больше:

https://math.stackexchange.com/questions/506785/given-two-diagonally-opposite-points-on-a-square-how-to-calculate-the-other-two

https://martin-thoma.com/how-to-check-if-a-point-is-inside-a-rectangle/

Вершины верны A и B, а точка P (случайно обозначенная C на рисунке). Найти векторы AB, AP, BP

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

 AB.X = BX - AX AB.Y = BY - AY and so on 

P лежит внутри квадрата, если точечные произведения неотрицательны

 cA = AP x AB //(AP.X * AB.Y - AP.Y * AB.X) dA = AP dot AB //(AP.X * AB.X + AP.Y * AB.Y) cB = -(AB x BP) dB = -(AB dot BP) 

и абсолютная величина кросс-продуктов меньше точечных продуктов

 dA >= Abs(cA) dB >= Abs(cB) 

(это эквивалентно проверке того, лежат ли углы в диапазоне -Pi/4..Pi/4 )

Предположим, что ваша проблема – 2D (как в 3D, так и в ND вам потребуется дополнительная информация). Я бы решил это так:

  1. найти 2 недостающих вершины

    Итак, мы знаем A,B и хотим C,D :

    диагональ

     M = (A+B)/2 v1 = BM 

    для получения v2 мы можем использовать тот факт, что в 2D векторах (x,y) и (y,-x) перпендикулярны и имеют одинаковый размер, поэтому:

     v2 = (v1y,-v2x) 

    Остальное легко:

     C = M - v2 D = M + v2 
  2. вычислить 2 краевых вектора

    базисные векторы

     U = CA V = DA 
  3. использовать точечный продукт для проверки внутри диапазона

    точка

     dot(I,J) = (IJ) = (Ix*Jx) + (Iy*Jy) 

    Дает вам перпендикулярную проекцию I в J (если оба вектора являются единичными) или наоборот, поэтому мы можем использовать его для определения того, находится ли точка P внутри квадрата:

     W = PA tu = (UW) / (|U|*|W|) tv = (VW) / (|V|*|W|) if ((tu>=0.0)&&(tu<=1.0)&&(tv>=0.0)&&(tv<=1.0)) return inside; else return outside; 

Просто чтобы быть полным значением абс вектора, вычисляется следующим образом:

  abs(I) = |I| = sqrt ( Ix*Ix + Iy*Iy )