2010-03-15 31 views
5

Tôi có một tập hợp các điểm như: pointA (3302.34.9392.32), pointB (34322.32,11102.03), v.v.Điều chỉnh tọa độ 2D và giữ nguyên khoảng cách euclide tương đối của chúng?

Tôi cần quy mô các vì vậy mỗi toạ độ x và y nằm trong khoảng (0.0 - 1.0). Tôi đã thử làm điều này bằng cách đầu tiên tìm giá trị x lớn nhất trong tập dữ liệu (maximum_x_value) và giá trị y lớn nhất trong tập hợp (minimum_y_value). Sau đó tôi đã làm như sau:

pointA.x = (pointA.x - minimum_x_value)/(maximum_x_value - minimum_x_value) 
pointA.y = (pointA.y - minimum_y_value)/(maximum_y_value - minimum_y_value) 

Điều này thay đổi khoảng cách tương đối (?) Và do đó làm cho dữ liệu vô dụng cho mục đích của tôi. Có cách nào để mở rộng các tọa độ này trong khi giữ nguyên khoảng cách tương đối của chúng không?

+0

Bạn có thể làm rõ câu hỏi không? Không thể mở rộng các điểm và giữ nguyên khoảng cách của chúng, vì vậy tôi cho rằng bạn muốn giữ nguyên các góc giữa các điểm còn nguyên vẹn. –

Trả lời

3

Nếu bạn có nghĩa là bạn không giữ tỷ lệ khung hình: chỉ cần chia tỷ lệ cho hình vuông bao quanh tối thiểu thay vì hình chữ nhật giới hạn tối thiểu. Bạn nên chọn hệ số tỷ lệ dọc theo cả hai trục để tối đa (dx, dy).

3

Bạn phải chia tỷ lệ chúng theo cùng một yếu tố để giữ khoảng cách giống nhau.

Tôi muốn quên đi trừ tối thiểu (Lưu ý: phần này chỉ đúng nếu các điểm luôn tích cực, đó là trường hợp sử dụng thông thường của tôi), và chỉ chia cho tối đa hai maxes:

maxval = max(max(A.x), max(A.y)) #or however you find these 
A.x = A.x/maxval 
A.y = A.y/maxval 
+0

Điều này sẽ không hoạt động nếu các giá trị đầu vào có thể âm. – tzaman

+0

Giá trị đầu vào không bao giờ âm. Tôi đã sử dụng cách tiếp cận mà bạn đề cập, nhưng kể từ khi điểm của tôi không đi từ 0.0 - 20000.0 v.v., nhưng thường là 19000.0 - 20000.0, nếu tôi không trừ giá trị nhỏ nhất, tất cả các điểm kết thúc trong một góc 0-1 .... Tôi chia tất cả các điểm bằng cùng một giá trị mặc dù (max_value - minimum_value luôn giống nhau). Nếu tôi hiểu bạn một cách chính xác, điều đó có nghĩa là họ giữ khoảng cách tương đối của họ? – eiaxlid

+0

Cách tiếp cận của tôi trừ trung tâm từ mỗi phạm vi, vì vậy bạn sẽ không gặp vấn đề 'góc'. Trừ các tác phẩm tối thiểu, nhưng sau đó dữ liệu không được tập trung vào '(0.5, 0.5)'. Khoảng cách tương đối nên được duy trì miễn là bạn duy trì cùng một yếu tố tỷ lệ, vâng. – tzaman

10

Bạn cần quy mô các giá trị x và các giá trị y bằng cùng một số tiền! Tôi khuyên bạn nên mở rộng quy mô lớn hơn trong hai phạm vi (hoặc x hoặc y). Trong giả, bạn muốn có một cái gì đó giống như

scale = max(maximum_x_value - minimum_x_value, 
      maximum_y_value - minimum_y_value) 

Sau đó, tất cả các khoảng cách giữa các điểm sẽ được nhân rộng bởi scale, đó là những gì tôi đoán bạn đang yêu cầu, vì vậy nếu điểm p_1 đã hai lần càng xa điểm p_2 từ p_3 trước khi thay đổi kích thước, nó sẽ gấp đôi sau khi thay đổi kích thước. Bạn sẽ có thể chứng minh điều này cho chính mình khá dễ dàng bằng cách sử dụng định lý Pythagore.

7

Giả sử bạn muốn thiết lập toàn bộ dữ liệu của bạn sẽ được tập trung vào (0.5, 0.5) với một loạt các (0,1) trong cả hai trục, đó là dễ dàng nhất để nghĩ về tổng chuyển đổi cần thiết trong ba bước:

  1. Trung tâm dữ liệu về nguồn gốc :
    P.x -= (maxX + minX)/2
    P.y -= (maxY + minY)/2
  2. Scale nó xuống bởi số lượng như nhau trong cả hai khía cạnh, như vậy mà lớn hơn của hai dãy trở thành (-0.5, 0.5):
    scale = max(maxX - minX, maxY - minY)
    P.x /= scale
    P.y /= scale
  3. Dịch điểm bởi (0.5, 0.5) để mang lại tất cả mọi thứ mà bạn muốn nó:
    P.x += 0.5
    P.y += 0.5

Cách tiếp cận này có lợi thế là làm việc một cách hoàn hảo cho bất kỳ dữ liệu đầu vào cho trước, và cũng làm cho càng nhiều đơn vị vuông càng tốt trong khi vẫn duy trì tỷ lệ khung hình (và vì thế khoảng cách tương đối).

+0

Không chắc bước đầu tiên là chính xác. Không khi minX/minY nhỏ hơn 0 và sắp xếp sai khi lớn hơn 0. Hãy thử 'Px - = minX + ((maxX - minX)/2)' và 'Py - = minY + ((maxY - minY)/2)' – swdev

+0

@swdev bạn nói đúng, nó đã tắt, nhưng câu trả lời đúng chỉ là '(max + min)/2' vì chúng ta muốn tìm điểm giữa và trừ đi. Đã sửa lỗi, nhờ kiểm tra toán học! – tzaman

4

Bước 1: Tái định vị trí nguồn gốc
Hãy mới "nguồn gốc" của bạn được (minimum_x_value, minimum_y_value). Chuyển tất cả các điểm dữ liệu của bạn bằng cách trừ minimum_x_value khỏi tất cả các tọa độ x và trừ minimum_y_value khỏi tất cả các tọa độ y.

Bước 2: Chuẩn hóa dữ liệu còn lại
Quy mô phần còn lại của dữ liệu của bạn để vừa trong cửa sổ 0.0-1.0. Tìm số max_coord là số tiền lớn hơn giá trị x tối đa hoặc giá trị y tối đa của bạn. Chia tất cả tọa độ x và y theo max_coord.

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