2009-12-20 18 views
7

Ho un metodo che disegna una linea tra due punti. Funziona piuttosto bene, ma ora voglio trasformare questa linea in un rettangolo.trasforma una linea in un rettangolo

Come posso ottenere i punti sul lato sinistro e destro di ciascun punto della linea per trasformarlo in un rettangolo che posso disegnare?

E 'quasi come se ho bisogno di capire in qualche modo come ottenere linee perpendicolari Programatically ....

+1

attenzione, IBM ha brevettato questo! http://www.forbes.com/asap/2002/0624/044.html –

+3

che è folle ... le linee di grasso dovrebbero essere gratuite per tutti – Mel

+0

Potrei aver incasinato le spiegazioni qui. La linea è nel mezzo del rettangolo. Quindi immagina un rettangolo con una linea che lo taglia a metà nel senso della lunghezza, non in diagonale. – Mel

risposta

13

Sto indovinando si vuole in sostanza le linee di grasso? Assumiamo la linea è specificato da due punti (x0, y0) e (x1, y1) abbiamo poi:

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

Dal momento che si sta utilizzando OpenGL ES Credo che si dovrà convertire il rendering immediato modalità (glBegin, glEnd, ecc) per glDrawElements. Dovrai anche convertire il quad in due triangoli.

Un'ultima cosa, sono un po 'stanco e incerto se il quadrante risultante è in senso antiorario o in senso orario, quindi girare il backface culling quando lo provi (glDisable(GL_CULL)).

+3

Andreas, devo sostituire (-dy) di (dy). Penso che sia perché hai per es. 'y0 + py' non 'y0 - py'. – ChrisJJ

+0

PS Ecco una versione con i cappucci quadrati: http://pastebin.com/KQMc6jp5 – ChrisJJ

+2

@ChrisJJ ha ragione, ho provato a correggere la risposta ma la modifica è stata rifiutata. Cambia i segni dei parametri 'x' dei metodi 'glVertex2f' per far combaciare i segni dei parametri '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

Dal momento che hai fatto questa domanda con OpenGL Taged darò per scontato che desideri una soluzione vicina a OpenGL.

Come sapete, avete due punti che formano una linea. Li chiamo x1, y1 e x2, y2

Supponiamo anche che x1, y1 sia il punto in alto a sinistra e x2, y2 in basso a destra.

I suoi 4 punti a trama sarà [è necessario perserve per fare un rettangolo con GL_LINES)

Height:y1-y1 
Width: x2-x1 

(x1, y1) 
(x1+width, y1) 
(x2, y2) 
(x2-width, y2) 
Problemi correlati