2009-12-20 39 views
7

Tôi có một phương pháp vẽ một đường thẳng giữa hai điểm. Điều này hoạt động khá tốt, nhưng bây giờ tôi muốn làm cho dòng này thành một hình chữ nhật.chuyển một đường thẳng thành hình chữ nhật

Làm cách nào tôi có thể lấy các điểm ở bên trái và bên phải của mỗi điểm dòng để biến nó thành hình chữ nhật mà tôi có thể vẽ?

Nó gần như là tôi cần phải bằng cách nào đó tìm ra cách để có được đường vuông góc programatically ....

+1

coi chừng, IBM đã cấp bằng sáng chế đó! http://www.forbes.com/asap/2002/0624/044.html –

+3

đó là điên ... dòng chất béo nên được miễn phí cho tất cả mọi người – Mel

+0

Tôi có thể đã sai lầm giải thích điều này ở đây. Đường thẳng nằm ở giữa hình chữ nhật. Vì vậy, hãy tưởng tượng một hình chữ nhật với một đường cắt nó một nửa theo chiều dọc, không chéo – Mel

Trả lời

13

Tôi đoán về cơ bản bạn muốn dòng chất béo? Hãy giả định rằng dòng được xác định bởi hai điểm (x0, y0)(x1, y1) sau đó chúng ta có:

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

Vì bạn đang sử dụng OpenGL ES Tôi đoán bạn sẽ phải chuyển đổi chế độ dựng hình ngay lập tức (glBegin, glEnd, vv) để glDrawElements. Bạn cũng sẽ phải chuyển đổi quad thành hai tam giác.

Một điều cuối cùng, tôi hơi mệt mỏi và không chắc chắn nếu kết quả quad là ngược chiều kim đồng hồ hoặc chiều kim đồng hồ để quay ngược lại khi bạn thử cái này (glDisable(GL_CULL)).

+3

Andreas, tôi phải thay thế (-dy) bởi (dy). Tôi nghĩ đó là bởi vì bạn có ví dụ 'y0 + py' không phải 'y0 - py'. – ChrisJJ

+0

PS Đây là phiên bản có mũ kết thúc hình vuông: http://pastebin.com/KQMc6jp5 – ChrisJJ

+2

@ChrisJJ đúng, tôi đã cố sửa câu trả lời nhưng bản chỉnh sửa đã bị từ chối. Thay đổi các dấu hiệu của tham số 'x' của phương thức 'glVertex2f' để khớp với các dấu hiệu của tham số '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

Vì bạn đã đặt câu hỏi này với thẻ OpenGL, tôi sẽ giả sử mà bạn muốn có giải pháp gần OpenGL.

Như bạn đã biết, bạn có hai điểm tạo nên một đường thẳng. Cho phép gọi chúng là x1, y1 và x2, y2

Giả sử x1, y1 là điểm trên cùng bên trái và x2, y2 là góc dưới cùng bên phải.

4 điểm của bạn để âm mưu sẽ [bạn cần phải perserve để làm cho một hình chữ nhật với GL_LINES)

Height:y1-y1 
Width: x2-x1 

(x1, y1) 
(x1+width, y1) 
(x2, y2) 
(x2-width, y2) 
Các vấn đề liên quan