2013-02-25 26 views
5

Tôi đang cố gắng hiểu cách vẽ một tập hợp các điểm (/ đặt pixel) tạo thành một vòng tròn mà không cần sử dụng chức năng thư viện .C cách vẽ điểm/đặt pixel mà không sử dụng thư viện đồ họa hoặc bất kỳ chức năng thư viện nào khác

Bây giờ, việc nhận tọa độ (x, y) của các điểm được cung cấp bán kính đơn giản.

for (x=-r; x <r; x=x+0.1) { 
     y = sqrt(r*r - x*x); 
     draw(x,y, 0, 0); 
    } 

Nhưng một khi tôi có điểm, bạn thực sự vẽ vòng tròn là điều gây nhầm lẫn với tôi. Tôi có thể sử dụng thư viện đồ họa nhưng tôi muốn hiểu cách bạn có thể làm điều đó mà không cần sử dụng thư viện đồ họa

void draw(float x, float y, float center_x, float center_y) { 
      //logic to set pixel given x, y and circle's center_x and center_y 
      // basically print x and y on the screen say print as a dot . 
      // u 'd need some sort of a 2d char array but how do you translate x and y 
      // to pixel positions 
    } 

Ai đó có thể chia sẻ bất kỳ liên kết/tham chiếu nào hoặc giải thích cách thức hoạt động này?

+3

Trong môi trường nào? – JasonD

+4

vui lòng xác định "vẽ"! nếu bạn có nghĩa là: "in trên màn hình", điều này phụ thuộc rất nhiều vào hệ thống bạn sử dụng. –

Trả lời

6
char display[80][26]; 

void clearDisplay(void) { 
    memset(display, ' ', sizeof(display)); 
} 

void printDisplay(void) { 
    for (short row=0; row<26; row++) { 
    for (short col=0; col<80; col++) { 
     printf("%c", display[col][row]); 
    } 
    printf("\n"); 
    } 
} 


void draw(float x, float y, float center_x, float center_y) { 
    if (visible(x,y)) { 
    display[normalize(x)][normalize(y)] = '.'; 
    } 
} 

EDITH: bạn đã thay đổi nhận xét của bạn, để kết hợp nhiều câu hỏi của bạn, vì vậy tôi sẽ mở rộng câu trả lời của tôi một chút.

bạn có hai bộ tọa độ:

  • tọa độ thế giới (như kinh độ quy mô và vĩ độ trên bản đồ thế giới hoặc femtometers trên kính hiển vi nam châm điện) đây là những chủ yếu là x và y của bạn
  • hiển thị tọa độ: những là đại diện cho thiết bị hiển thị của bạn, như Nexus 7 hoặc Nexus 10 Tablet, với kích thước vật lý (pixel hoặc pels hoặc chấm trên mỗi inch)

bạn cần số liệu, biến đổi tọa độ thế giới của bạn thành phối hợp hiển thị nates. Để làm cho mọi thứ phức tạp hơn, bạn cần một cửa sổ (phần của thế giới bạn muốn hiển thị cho người dùng) để cắt những thứ bạn không thể hiển thị (như châu Phi, khi bạn muốn hiển thị châu Âu). Và bạn có thể muốn phóng to thế giới của bạn phối để phù hợp với tọa độ hiển thị của bạn (bao nhiêu europe bạn muốn hiển thị)

Những số liệu và mẩu là biến đổi đại số đơn giản

  • phóng to thế giới phối hợp để hiện thị phối hợp: hiển thị-x = thế giới x-* yếu tố (femtometer hoặc kilomet để pixel)
  • dịch trung tâm cấp quốc tế để hiển thị trung tâm: hiển thị-x + điều chỉnh

và vân vân. Chỉ wikipedia cho "chuyển đổi đại số" hoặc "geometrics"

+0

Đẹp ... - nhưng tại sao 26 không 25 hoặc thậm chí tốt hơn 24? – alk

+0

@alk: chỉ là một số, bạn nói đúng, 24 có thể tốt hơn –

2

Đó là một câu hỏi khó bởi vì về mặt kỹ thuật C không có bất kỳ khả năng đầu vào/đầu ra tích hợp nào. Ngay cả việc ghi vào một tập tin cũng yêu cầu một thư viện. Trên các hệ thống nhất định, như DOS ở chế độ thực, bạn có thể truy cập trực tiếp vào bộ nhớ video và thiết lập các pixel bằng cách ghi các giá trị vào bộ nhớ đó, nhưng các hệ điều hành hiện đại thực sự cản trở việc thực hiện điều đó. Bạn có thể thử viết một bộ nạp khởi động để khởi động chương trình trong một chế độ CPU dễ dãi hơn mà không có một hệ điều hành, nhưng đó là một lượng lớn các sâu.

Vì vậy, sử dụng thư viện stdio tối thiểu, bạn có thể viết lên stdout bằng đồ họa ascii như các câu trả lời khác hoặc bạn có thể xuất ra định dạng đồ họa đơn giản như xbm. . Lựa chọn tốt hơn có thể là định dạng .

Đối với phần bản vẽ vòng tròn, hãy xem số cổ điển Bresenham algorithm. Hoặc, đối với quá nhiều thông tin, chương 1 trong số A Trip Down the Graphics Pipeline của Jim Blinn mô tả các thuật toán vẽ vòng tròn khác nhau!

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