Как рассчитать точку, горизонтально проецируемую на наклонную линию - PullRequest
0 голосов
/ 27 октября 2018

enter image description here

Мы используем Unity C #.Это изображение представляет собой упрощенную 2D-ситуацию, в которой мы знаем координаты (x, y) точек p1 и p2 .

Мы знаем угол тета, используяэта красота

static float CalculateAngle(Vector3 p1, Vector3 p2)
{ return Quaternion.FromToRotation(Vector3.right, p1 - p2).eulerAngles.z; }

// The use of Vector3.right make zero degrees start at 3h00
// The values of z are irrelevant in this post, always zeroed.

Теперь появляется новая точка p3 , представьте прикосновение к экрану, чтобы мы знали, что это координаты (x, y).По сути, все синий на изображении, мы знаем, что это значения.

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

  • мы знаем p3 (x, y) координаты
  • мы не знаем p4 (x, y), за исключением того, что:

  • p4.y должно быть равно p3.y

  • p4 в соответствии сp1 и p2

Как рассчитать неизвестный p4.x, чтобы получить полные координаты p4 (x, y), используя Unity C #?

Ответы [ 3 ]

0 голосов
/ 27 октября 2018

Линейные функции имеют вид y = mx + b, где m - наклон, а b - вертикальный сдвиг. Если P3 является точкой со значениями xy, то вы можете взять наклон, смещение и y и решить для x:

(y - b) / m = x 

Это скорее вопрос общей математики, чем вопрос, связанный с единством; в будущем я бы посоветовал попробовать математический сайт обмена стека.

0 голосов
/ 30 октября 2018

Это решит вашу проблему, и это также работает для p1, p2 и / или p3 с различной глубиной:

Создайте плоскость, где Y=p3.y, а затем выполните лучевую трансляцию изp1-> p2, чтобы найти, где он пересекается.

Plane plane = new Plane(Vector3.up, p3);
float enter;
Ray ray = new Ray(p1, p2-p1);

bool doesIntersect = plane.Raycast(ray, out enter);
if (doesIntersect) {
    Vector3 p4 = ray.GetPoint(enter); 
    DoStuff(p4.x); 
}

Если вам нужно проецировать не в горизонтальном направлении, вам нужно использовать нормаль, отличную от Vector3.up.

0 голосов
/ 27 октября 2018

Там могут быть более простые решения. Основное математическое решение выглядит следующим образом:

  1. Рассчитать линейную функцию p1 и p2, как указано здесь . Уравнение в форме пересечения наклона записывается как

y = mx + b

где m - наклон линии, а b - точка пересечения y.

  1. Вставьте букву P3 в форму.
  2. Решить х.

Пример на C # для Unity:

Vector3 p1 = new Vector3(1f, 2f);
Vector3 p2 = new Vector3(2f, 3f);
Vector3 p3 = new Vector3(1000f, 5f);
Vector3 p4 = Vector3.zero;

float m = ((p2.y - p1.y) / (p2.x - p1.x));
float b = p1.y - (m * p1.x);

// x = ( y - b ) / m
p4.x = (p3.y - b) / m;
p4.y = p3.y;

print(p4); // (4.0, 5.0, 0.0) as expected
...