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

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

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

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

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, etc) к glDrawElements. Вам также придется преобразовать квадроцикл в два треугольника.

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


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

drawRect (x,y,w,h)

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