2010-08-30 41 views
10

Tôi chạy vào trường hợp đặc biệt mà tôi cần phải tạo ra dòng đối xứng cực hay ray trong lưới 2D theo thứ tự từ (x0, y0) qua (x1, y1) như thế này:Thuật toán đường siêu đối xứng?

void drawSymmetricalLine(int x0, int y0, int x1, int y1) 
{ 
    // loop and handle each (x, y)... 
} 

Vấn đề thực tế nằm trong điểm nơi các thuật toán vẽ đường phổ biến KHÔNG vẽ cả hai tọa độ (điểm còn lại được đánh dấu là x bên dưới) vì nó có vẻ dày hơn, điều này là mong muốn trong trường hợp của tôi. Hiệu suất cũng không quan trọng nhưng đơn giản.

Dưới đây là những gì tôi có nghĩa là các đường đối xứng cực:

ox ooo 
oo  ooo 


o o 
o o 
    o o 
     o 

Trả lời

4

Bạn có thể sử dụng Bresenham's line algorithm và sửa đổi nó một chút vì vậy khi thay đổi bước để di chuyển vị trí bốc thăm từ một hàng khác bạn vẽ cả trước và sau các pixel trên trục y cho trục x hiện tại.

1

Nếu đơn giản được ưu tiên hơn hiệu suất, hãy viết một thuật toán đệ quy. Tại mỗi bước tính DX = X1-X0 và ​​DY = Y1-Y0.

Dừng đệ quy khi DX = 0 hoặc DY = 0 (trong trường hợp này dòng của bạn là dọc hoặc ngang).

Nếu không, hãy tính hai điểm cuối "ở giữa", theo tính chẵn lẻ của DX và DY, và vẽ hai nửa dòng một cách đệ quy.

0

Sử dụng Bresenham's line algorithm trừ khi bạn vẽ một điểm tại (x0 + dx, y0 + dy), cũng vẽ một điểm tại (x1-dx, y1-dy). Bằng cách đó bạn đảm bảo rằng nó là đối xứng từ cả hai phía.

Đó là một chút không hiệu quả, nhưng bạn nói rằng không quan trọng.

2

Hiển thị dòng hai lần, một lần từ p0 đến p1 và một lần nữa từ p1 đến p0.

+0

Đây là những gì tôi làm cho tầm nhìn đối xứng trong trò chơi. – Madmenyo

Các vấn đề liên quan