2009-12-20 17 views
7

Tengo un método que dibuja una línea entre dos puntos. Esto funciona bastante bien, pero ahora quiero hacer esta línea en un rectángulo.convertir una línea en un rectángulo

¿Cómo puedo obtener los puntos a la izquierda ya la derecha de cada uno de los puntos de la línea que lo hacen en un rectángulo que puedo dibujar?

Es casi como si Necesito imaginar alguna manera cómo llegar líneas perpendiculares Programatically ....

+1

mirar hacia fuera, que IBM ha patentado! http://www.forbes.com/asap/2002/0624/044.html –

+3

que es una locura ... líneas de grasa deben ser libres para todos – Mel

+0

I pueden tener mal estado explicando esto aquí. La línea está en el medio del rectángulo. Imagine un rectángulo con una línea que lo corte por la mitad longitudinalmente, no diagonal – Mel

Respuesta

13

supongo que básicamente desea que las líneas de grasa? Asumamos la línea se especifica por dos puntos (x0, y0) y (x1, y1) entonces tenemos:

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(); 

Puesto que usted está usando OpenGL ES supongo que tendrá que convertir la prestación inmediata de modo (glBegin, glEnd, etc) a glDrawElements. También tendrás que convertir el quad en dos triángulos.

Una última cosa, estoy un poco cansado e inseguro si el cuadrante resultante es en sentido antihorario o en el sentido de las agujas del reloj, así que voltea la ocultación de la cara posterior cuando pruebas esto (glDisable(GL_CULL)).

+3

Andreas, tengo que reemplazar (-dy) por (dy). Creo que es porque tienes, por ejemplo, 'y0 + py' no 'y0 - py'. – ChrisJJ

+0

PS Aquí está una versión que tiene tapas de los extremos cuadrados: http://pastebin.com/KQMc6jp5 – ChrisJJ

+2

@ChrisJJ está bien, lo intentaron arreglar la respuesta, pero la edición fue rechazado. Cambie los signos de los parámetros 'x' de los métodos 'glVertex2f' para que coincidan con los signos de los parámetros 'y'. 'glVertex2f (x0 + px, y0 + py); glVertex2f (x1 + px, y1 + py); glVertex2f (x1 - px, y1 - py); glVertex2f (x0 - px, y0 - PY); ' –

-2

drawRect (x, y, w, h)

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

-1

Puesto que usted ha hecho esta pregunta con OpenGL mica asumiré que desea una solución cercana a OpenGL.

Como usted sabe que tiene dos puntos que forman una línea. Vamos a llamarlos x1, y1 y x2, y2

Supongamos también que x1, y1 es el punto superior izquierdo y x2, y2 es la parte inferior derecha.

Sus 4 puntos a parcela serán [que necesitan perserve fin de hacer un rectángulo con GL_LINES)

Height:y1-y1 
Width: x2-x1 

(x1, y1) 
(x1+width, y1) 
(x2, y2) 
(x2-width, y2) 
Cuestiones relacionadas