Рисование прямоугольника между двумя точками произвольной ширины - PullRequest
11 голосов
/ 21 октября 2011

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

-

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

Ответы [ 3 ]

18 голосов
/ 21 октября 2011

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

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, так что ширина вашей линии в этом примере не будет зависеть от длины перпендикуляра (которая здесь равна длине линии).

5 голосов
/ 21 октября 2011

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

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

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

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)

Теперь у вас есть сдвиг х и у сдвиг.

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

Second: (x1 + xS, y1 - yS)

Third: (x2 + xS, y2 - yS)

Fourth: (x2 - xS, y2 + yS)

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

0 голосов
/ 21 октября 2011

Если я вас правильно понимаю, у вас есть две конечные точки, скажем, 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 // уравнение расстояния

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 = b * s2

и т. Д. 3

y3 = b * s2 + y1

у нас есть одна угловая точка C (x3, y3).

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

(y1 - y4) / (x1 - x4) = s2 и вычисления, перечисленные выше, должны быть применены.

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

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