2009-12-20 7 views
7

J'ai une méthode qui dessine une ligne entre deux points. Cela fonctionne plutôt bien, mais maintenant je veux faire de cette ligne un rectangle. Comment puis-je obtenir les points sur les côtés gauche et droit de chacun des points de ligne pour en faire un rectangle que je peux dessiner?transformer une ligne en un rectangle

Il est presque comme si je dois comprendre en quelque sorte comment obtenir des lignes perpendiculaires Programatically ....

+1

attention, IBM a breveté! http://www.forbes.com/asap/2002/0624/044.html –

+3

qui est fou ... les lignes de graisse devraient être libres pour tout le monde – Mel

+0

Je peux avoir foiré expliquant ceci ici. La ligne est au milieu du rectangle. Donc, imaginez un rectangle avec une ligne de coupe dans la moitié de la longueur, pas en diagonale – Mel

Répondre

13

Je devine que vous voulez essentiellement des lignes de graisse? Permet de supposer que la ligne est spécifiée par deux points (x0, y0) et (x1, y1) nous avons alors:

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

Puisque vous utilisez OpenGL ES Je suppose que vous devrez convertir le rendu en mode immédiat (glBegin, glEnd, etc.) à glDrawElements. Vous devrez également convertir le quad en deux triangles. Une dernière chose, je suis un peu fatigué et incertain si le quad résultant est dans le sens antihoraire ou dans le sens des aiguilles d'une montre, donc tour de l'arrachement de la face arrière lorsque vous essayez cela (glDisable(GL_CULL)).

+3

Andreas, je dois remplacer (-dy) par (dy). Je pense que c'est parce que vous avez par exemple 'y0 + py' pas 'y0 - py'. – ChrisJJ

+0

PS Voici une version qui a des bouchons carrés: http://pastebin.com/KQMc6jp5 – ChrisJJ

+2

@ChrisJJ a raison, j'ai essayé de corriger la réponse, mais la modification a été rejetée. Modifiez les signes des paramètres 'x' des méthodes 'glVertex2f' pour qu'ils correspondent aux signes des paramètres '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

Puisque vous avez posé cette question avec OpenGL TAged je suppose que vous souhaitez une solution proche d'OpenGL.

Comme vous le savez, vous avez deux points qui composent une ligne. Appelons-les x1, y1 et x2, y2

Supposons également que x1, y1 est le point en haut à gauche et x2, y2 est le bas à droite.

Vos 4 points à tracé sera [vous devez perserve afin de faire un rectangle avec GL_LINES)

Height:y1-y1 
Width: x2-x1 

(x1, y1) 
(x1+width, y1) 
(x2, y2) 
(x2-width, y2) 
Questions connexes