2011-12-27 46 views
5

Tôi đang tìm một thuật toán tốt để tạo khoảng thời gian đánh dấu chính/nhỏ đẹp cho trục DateTime trên thành phần biểu đồ tùy chỉnh. Tôi đã đọc this previous question ở đây, trong đó thảo luận một cách tốt đẹp để tính toán các ve lớn/nhỏ và giá trị tối thiểu/tối đa cho một trục số. Tuy nhiên, rất khó để dịch điều này thành các phép tính trục ngày.Tính thời gian ngày Khoảng thời gian tối thiểu, tối đa và lớn nhỏ nhất

Lý do là một số phạm vi ngày ở các cơ sở khác nhau đối với các phạm vi ngày khác, một số không phải là khung thời gian nhất quán. Xem xét phạm vi trục trong vài phút. Tính toán này khá dễ dàng vì bạn có thể chia số phút lên bằng cách sử dụng một thuật toán tương tự như được trình bày ở trên. Tuy nhiên bạn sẽ làm gì khi cùng một trục được yêu cầu trình bày dữ liệu trong phạm vi năm/tháng hoặc tháng/tuần?

Yêu cầu cho trục này là nó có thể tính toán các dấu tick lớn/nhỏ để biểu đồ không bao giờ quá lộn xộn, với phạm vi dữ liệu đầu vào tính bằng mili giây đến vài tháng và nhiều năm. Nó được dự định sẽ được sử dụng trên biểu đồ thời gian thực để trình bày tĩnh không quan trọng bằng khả năng cập nhật nhanh chóng. Thuật toán đơn giản của tôi thực hiện điều này:

  • Nếu phạm vi> 3 năm, chọn lớn = 1 năm, nhỏ = 3month
  • Nếu phạm vi> 1 năm, chọn lớn = 3 tháng, nhỏ = 1 tháng
  • Nếu phạm vi> 3 tháng, chọn chính = tháng, nhỏ = không có gì (tôi đã xem xét tuần tuy nhiên kể từ tháng không chia hết cho tuần có vẻ lẻ)
  • Nếu phạm vi> 1 tuần, chọn lớn = 1 ngày, nhỏ = không có gì
  • Nếu phạm vi < 1 ngày, hãy chọn giờ theo thuật toán số đẹp
  • Nếu phạm vi < 1 giờ, chọn phút
  • Nếu phạm vi < 1 phút, chọn giây

vv ...

Như bạn có thể thấy nó rất nhiều if-báo cáo và có thể bỏ lỡ một cái gì đó. Trong phương pháp này tôi thường kết thúc với ổn định vào những ngày nhất định và tôi đã tự hỏi nếu có một cách dễ dàng hoặc phổ biến để tiếp cận vấn đề này.

Trân trọng, Andrew

Trả lời

2
  1. Có một mảng được sắp xếp của tất cả các bọ ve có thể: 1 giây, 1 phút, 1 giờ, 1 ngày, 1 tháng, 1 năm.
  2. Quyết định khoảng cách tối thiểu cho điểm chính (min_dist_major) là gì và đối với trẻ vị thành niên (min_dist_minor) đánh dấu vào. Đó là các hằng số và có giá trị bằng pixel.
  3. Tìm dấu tích nhỏ nhất lớn hơn min_dist_major khi được hiển thị trên màn hình.
  4. Sau đó tìm thấy dấu nhỏ nhất nhỏ hơn dấu tick lớn nhưng lớn hơn min_dist_minor khi được hiển thị trên màn hình. Nếu không tìm thấy dấu tích nhỏ thì nó không tồn tại.

Bạn có thể mở rộng mảng của mình bằng các dấu tích khác, chẳng hạn như 2 và 5 của mọi loại.

+0

Giải pháp tuyệt vời, hãy để tôi thử điều đó. Tôi giả sử cho phụ thứ hai, và lớn hơn 1 năm bạn có thể sử dụng tính toán đánh dấu số: bội số của 1, 2, 5 –

+0

Bạn có thể sử dụng bất kỳ giá trị nào bạn thích, nhưng 1, 2 và 5 là phổ biến nhất.Trong nhiều tháng sẽ là 1, 2, 3, 4 và 6, và trong nhiều ngày cùng với 1, 2 và 5, tôi cũng sẽ thêm 10 và 15. Vấn đề là nếu bạn không biết giới hạn trên. Chỉ cần thêm 10, 20, 50, 100, 200, 500 năm và bạn có thể tốt :) – Dialecticus

+0

Một vấn đề mà tôi có là có bọ ve lớn chia hết cho bọ ve nhỏ. Điều này chủ yếu là do làm thế nào các phần khác của phần mềm của tôi tính toán tọa độ cho các dấu tick. 3 tháng/tuần là một sự kết hợp xấu ví dụ. Những gì tôi có thể làm thay vào đó là vô hiệu hóa nhỏ cho một số kết hợp đánh dấu. Sẽ cố gắng sln của bạn, cho tôi một vài ngày vì nó là Giáng sinh một tất cả ;-) –

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