Рисование прямоугольника между двумя точками с произвольной шириной

Я пытаюсь провести линию между двумя (2D) точками, когда пользователь проводит пальцем по сенсорному экрану. Для этого я планирую рисовать прямоугольник при каждом обновлении касания между X и Y предыдущего обновления касания и X и Y последнего обновления касания. Это должно создать сплошную и сплошную линию, когда пользователь проведет пальцем по экрану. Тем не менее, мне также хотелось бы, чтобы эта строка имела произвольную ширину. Мой вопрос в том, как мне приступить к вычислению координат, которые мне нужны для каждого прямоугольника (x1, y1, x2, y2)?

-

Также: если у кого-то есть информация о том, как я мог бы тогда применить сглаживание к этой строке, это было бы огромной помощью.

Ответ 1

Вычислить вектор между начальной и конечной точками

V.X := Point2.X - Point1.X;
V.Y := Point2.Y - Point1.Y;

Затем вычислите перпендикуляр к нему (просто поменяйте координаты X и Y)

P.X := V.Y; //Use separate variable otherwise you overwrite X coordinate here
P.Y := -V.X; //Flip the sign of either the X or Y (edit by adam.wulf)

Нормализовать, что перпендикулярно

Length = sqrt(P.X * P.X + P.Y * P.Y); //Thats length of perpendicular
N.X = P.X / Length;
N.Y = P.Y / Length; //Now N is normalized perpendicular

Вычислите 4 точки, которые образуют прямоугольник, добавив нормализованный перпендикуляр и умножив его на половину желаемой ширины

R1.X := Point1.X + N.X * Width / 2;
R1.Y := Point1.Y + N.Y * Width / 2;
R2.X := Point1.X - N.X * Width / 2;
R2.Y := Point1.Y - N.Y * Width / 2;
R3.X := Point2.X + N.X * Width / 2;
R3.Y := Point2.Y + N.Y * Width / 2;
R4.X := Point2.X - N.X * Width / 2;
R4.Y := Point2.Y - N.Y * Width / 2;

Нарисуйте прямоугольник, используя эти 4 точки.

Здесь изображение:

Drawing rectangle between two points

РЕДАКТИРОВАТЬ:. Чтобы ответить на комментарии: Если X и Y совпадают, то линия будет точно диагональной и перпендикулярна диагонали, является диагональю. Нормализация - это способ сделать длину равной 1, так что ширина вашей строки в этом примере не будет зависеть от длины перпендикуляров (которая здесь равна длине строк).

Ответ 2

Простой способ (я назову "ширину" толщины линии):

Нам нужно рассчитать 2 значения, сдвиг по оси x и сдвиг на оси y для каждого из четырех углов. Это достаточно просто.

Размеры линии:

width = x2 - x1

height = y2 - y1

Теперь сдвиг x (назовем его xS):

xS = (thickness * height / length of line) / 2

yS = (thickness * width / length of line) / 2

Чтобы найти длину строки, используйте теорему Пифагора:

length = square_root(width * width + height * height)

Теперь у вас есть сдвиг x и y shift.

First coordinate is: (x1 - xS, y1 + yS)

Second: (x1 + xS, y1 - yS)

Third: (x2 + xS, y2 - yS)

Fourth: (x2 - xS, y2 + yS)

И вот ты! (Эти координаты рисуются против часовой стрелки, по умолчанию для OpenGL)

Ответ 3

Если я правильно вас понимаю, у вас есть две конечные точки: A (x1, y1) и B (x2, y2) и произвольная ширина для прямоугольника w. Я предполагаю, что конечные точки будут находиться только в середине прямоугольника с более короткими сторонами, что означает, что расстояние от окончательных угловых координат прямоугольников будет w/2 до A и B.

Вы можете вычислить наклон линии на:

s1 = (y2 - y1)/(x2 - x1)//предполагая x1!= x2

Наклон более коротких сторон - это не что иное, как s2 = -1/s1.

У нас есть наклон, у нас есть расстояние, и у нас есть контрольные точки.

Мы можем получить два уравнения для каждой угловой точки:

Для одного угла ближе к A

C (x3, y3):

(y3 - y1)/(x3 - x1) = s2//наклон

(y3 - y1) ^ 2 + (x3 - x1) ^ 2 = (w/2) ^ 2//на расстоянии

заменяя (y3 - y1) на a и (x3 - x1) на b, дает

a = b * s2//уравнение наклона

//заменим a на b * s2

b ^ 2 * s2 ^ 2 + b ^ 2 = (w/2) ^ 2//расстояние equaiton

b ^ 2 = (w/2) ^ 2/(s2 ^ 2 + 1)

b = sqrt ((w/2) ^ 2/(s2 ^ 2 + 1))

знаем w и s2 и, следовательно, вычислим b

Если b известно, мы можем вывести x3

x3 = b + x1

и a, а также

a = b * s2

и поэтому y3

y3 = b * s2 + y1

имеем одну угловую точку C (x3, y3).

Чтобы вычислить другую угловую точку ближе к A, скажем D (x4, y4), уравнение наклона можно построить как

(y1 - y4)/(x1 - x4) = s2 и следует использовать приведенные выше вычисления.

Другие два угла можно рассчитать с помощью перечисленных здесь шагов, заменив A (x1, y1) на B (x2, y2).