превратить линию в прямоугольник

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

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

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


person Mel    schedule 20.12.2009    source источник
comment
берегитесь, IBM запатентовала это! forbes.com/asap/2002/0624/044.html   -  person just somebody    schedule 20.12.2009
comment
это безумие... жирные линии должны быть бесплатными для всех   -  person Mel    schedule 21.12.2009
comment
Я, возможно, запутался, объясняя это здесь. Линия находится в середине прямоугольника. Итак, представьте себе прямоугольник с линией, разрезающей его пополам вдоль, а не по диагонали.   -  person Mel    schedule 21.12.2009


Ответы (3)


Я предполагаю, что вы в основном хотите жирные линии? Предположим, что линия задана двумя точками (x0, y0) и (x1, y1), тогда мы имеем:

float dx = x1 - x0; //delta x
float dy = y1 - y0; //delta y
float linelength = sqrtf(dx * dx + dy * dy);
dx /= linelength;
dy /= linelength;
//Ok, (dx, dy) is now a unit vector pointing in the direction of the line
//A perpendicular vector is given by (-dy, dx)
const float thickness = 5.0f; //Some number
const float px = 0.5f * thickness * (-dy); //perpendicular vector with lenght thickness * 0.5
const float py = 0.5f * thickness * dx;
glBegin(GL_QUADS);
glVertex2f(x0 + px, y0 + py);
glVertex2f(x1 + px, y1 + py);
glVertex2f(x1 - px, y1 - py);
glVertex2f(x0 - px, y0 - py);
glEnd();

Поскольку вы используете OpenGL ES, я думаю, вам придется преобразовать рендеринг в немедленном режиме (glBegin, glEnd и т. д.) в glDrawElements. Вам также придется преобразовать четырехугольник в два треугольника.

И последнее, я немного устал и не уверен, будет ли получившийся четырехугольник против часовой стрелки или по часовой стрелке, поэтому включите отсечение задней поверхности, когда вы попробуете это (glDisable(GL_CULL)).

person Andreas Brinck    schedule 20.12.2009
comment
Андреас, я должен заменить (-dy) на (dy). Я думаю, это потому, что у вас есть, например. «у0 + ру», а не «у0 - ру». - person ChrisJJ; 06.03.2013
comment
@ChrisJJ прав, я пытался исправить ответ, но редактирование было отклонено. Измените знаки параметров «x» методов glVertex2f, чтобы они соответствовали знакам параметров «y». glVertex2f(x0 + px, y0 + py); glVertex2f(x1 + px, y1 + py); glVertex2f(x1 - px, y1 - py); glVertex2f(x0 - px, y0 - py); - person Ryan Clarke; 12.02.2017
comment
@Ryan Какая причина была указана для отказа? - person ChrisJJ; 12.02.2017
comment
@ChrisJJ Это редактирование предназначалось для автора сообщения и не имеет смысла как редактирование. Это должно было быть написано как комментарий или ответ. За него проголосовали против 3 против 2. Я не знаю, почему исправление сломанного кода «не имеет смысла». Я только что попытался отредактировать его снова. - person Ryan Clarke; 16.02.2017

Поскольку вы задали этот вопрос с пометкой OpenGL, я предполагаю, что вы хотите получить решение, близкое к OpenGL.

Как вы знаете, у вас есть две точки, которые составляют линию. Назовем их x1,y1 и x2,y2

Предположим также, что x1, y1 — верхняя левая точка, а x2, y2 — нижняя правая.

Ваши 4 точки для построения будут [вам нужно сохранить порядок, чтобы сделать прямоугольник с GL_LINES)

Height:y1-y1   
Width: x2-x1 

(x1, y1)
(x1+width, y1)
(x2, y2)
(x2-width, y2)
person monksy    schedule 20.12.2009

рисоватьRect(x,y,w,h)

tl = (x,y) tr = (x+w, y) br = (x+w, y+h) bl = (x, y+h)

person jspcal    schedule 20.12.2009