2012-01-02 74 views
7

Tôi có một tam giác vuông đơn vị và một giá trị ở mỗi 3 đỉnh. Tôi cần nội suy để tìm giá trị tại một điểm trong tam giác. Số giờ tìm kiếm đã không có gì thực sự cho tôi biết cách thực hiện điều này. Đây là nỗ lực gần nhất của tôi, mà thực sự là khá chặt chẽ nhưng không hoàn toàn đúng -Nội suy của một hình tam giác

   result = 
       v1 * (1 - x) * (1 - y) + 
       v2 * x * (1 - y) + 
       v3 * x * y; 

v1, v2, v3 và là những giá trị tại 3 đỉnh của tam giác. (x, y) là điểm trong tam giác mà bạn đang cố tìm giá trị của.

Bất kỳ phương pháp nào cũng có thể giúp tôi ở đây. Nó không nhất thiết phải là một đơn vị/tam giác vuông.

Thông tin cập nhật: Tôi có một mạng lưới các điểm cách đều nhau và một giá trị tại mỗi điểm. Tôi tạo một hình tam giác ra khỏi 3 điểm gần nhất trên lưới. Đây là hình ảnh minh họa nó - enter image description here
Vì vậy, tôi phải nội suy giữa 5, 3 và 7 để tìm giá trị của x. Điểm cũng có thể nằm trong tam giác khác, có nghĩa là bạn sẽ nội suy giữa 5, 7 và giá trị của góc dưới cùng bên trái của hình vuông.

Trong mã tôi đã cho thấy, v1 = 5, v2 = 3, v3 = 7.
x là khoảng cách phân đoạn (khoảng [0-1]) theo hướng "x" và y là khoảng cách phân đoạn theo hướng "y".
Trong ví dụ của hình ảnh, x lẽ sẽ vào khoảng 0,75 và y sẽ vào khoảng 0,2

Dưới đây là những nỗ lực gần nhất của tôi -
enter image description here
Created sử dụng -

 if (x > y) //if x > y then the point is in the upper right triangle 
      return 
       v1 * (1 - x) * (1 - y) + 
       v2 * x * (1 - y) + 
       v3 * x * y; 
     else //bottom left triangle 
      return 
       v1 * (1 - x) * (1 - y) + 
       v4 * (1 - x) * y + 
       v3 * x * y; 

Và nỗ lực khác -
enter image description here
Được tạo bằng -

if (x > y) 
      return 
       (1 - x) * v1 + (x - y) * v2 + y * v3; 
     else 
      return 
       (1 - y) * v1 + (y - x) * v4 + x * v3; 

Chúng đều gần với những gì tôi cần nhưng rõ ràng là không hoàn toàn đúng.

+0

Vì vậy, mà đỉnh là mà ? Chỉ cho tôi cách hệ thống tọa độ của bạn hoạt động, theo cách nào x và y đi đến đâu và ở đâu v1 v2 và v3. – Dan

+0

@Dan Ok Tôi đã cập nhật một số thông tin để cho biết tôi đang làm gì sâu hơn một chút. – Frobot

+0

Bạn có phương pháp diễn giải cụ thể nào không? Tuyến tính/bilinear/hàng xóm gần nhất? – rsaxvc

Trả lời

2

Tôi hỏi này cách đây 3 năm và đã vẫn được làm việc trên một cách để làm điều này. Tôi tin rằng nó là không thể trừ khi sử dụng một tam giác đều. Đây là một cách tốt để làm điều đó bằng cách sử dụng tọa độ barycentric và sau đó thêm một kỹ thuật mà được thoát khỏi hầu hết các hiện vật. v1, v2, v3 là các giá trị tại ba điểm của tam giác. x, y là điểm bạn muốn tìm giá trị.

if (x > y) 
     { 
      b1 = -(x - 1); 
      b2 = (x - 1) - (y - 1); 
      b3 = 1 - b1 - b2; 
     } 
     else 
     { 
      b1 = -(y - 1); 
      b2 = -((x - 1) - (y - 1)); 
      b3 = 1 - b1 - b2; 
     } 

     float 
      abs = x - y; 
     if (abs < 0) abs *= -1; 
     if (abs < 0.25f) 
     { 
      abs = 0.25f - abs; 
      abs *= abs; 
      b1 -= abs; 
      b3 -= abs; 
     } 

     b1 *= b1; 
     b2 *= b2; 
     b3 *= b3; 
     float fd = 1/(b1 + b2 + b3); 
     b1 *= fd; 
     b2 *= fd; 
     b3 *= fd; 

     return 
       v1 * b1 + 
       v2 * b2 + 
       v3 * b3; 
+3

Nói, bạn có thể đăng hình ảnh của kết quả để so sánh không? – rsaxvc

1

Ok, do đó, chúng tôi sẽ thực hiện phép nội suy tuyến tính, giả sử rằng độ dốc là hằng số đối với x và y. d/dx = v2 - v1d/dy = v3 - v2f(0,0) = v1. Chúng ta có một phương trình vi phân hai chiều đơn giản.

d{f(x,y)} = (v2 - v1)*dx 
f(x,y) = (v2 - v1)*x + g(y) 
d{f(x,y)} = g'(y) = (v3 - v2)*dy 
g(y) = (v3 - v2)*y + C 
f(x,y) = (v2 - v1)*x + (v3 - v2)*y + C 
f(0,0) = v1 = (v2 - v1)*0 + (v3 - v2)*0 + C = C 
f(x,y) = (v2 - v1)*x + (v3 - v2)*y + v1 

hoặc về v2 v1 và v3

f(x,y) = (1 - x)*v1 + (x - y)*v2 + y*v3 

Nếu bạn muốn làm điều đó trong một hình vuông cho bốn đỉnh, như trên với v4 ở phía dưới bên trái tại x = 0 y = 1 Dưới đây là các điều kiện: d/dx = (v2 - v1) (1 - y) + (v3 - v4) y, d/dy = (v3 - v2) x + (v4 - v1) (1 - x), f(0,0) = v1

d/dx = (v2 - v1) (1 - y) + (v3 - v4) y 
f(x,y) = (v2 - v1) (1 - y) x + (v3 - v4) y x + g(y) 
d/dy = (v3 - v2) x + (v4 - v1) (1 - x) = -(v2 - v1) x + (v3 - v4) x + g'(y) 
v3 - v2 + (v4 - v1)/x + v4 - v1 = -v2 + v1 + v3 - v4 + g'(y)/x 
(v4 - v1)/x + 2*(v4 - v1) = g'(y)/x 
g'(y) = (v4 - v1) + 2 x (v4 - v1) 
g(y) = (v4 - v1) (1 + 2 x) y + C 
f(x,y) = (v2 - v1) (1 - y) x + (v3 - v4) y x + (v4 - v1) (1 + 2 x) y + C 
f(0,0) = (v2 - v1) (1 - 0) 0 + (v3 - v4) 0 0 + (v4 - v1) (1 + 2 0) 0 + C = v1 
f(x,y) = (v2 - v1) (1 - y) x + (v3 - v4) y x + (v4 - v1) (1 + 2 x) y + v1 
+0

Giả sử điều này sẽ nhận được giá trị phù hợp, tôi cũng phải tính đến các điểm không nằm trong tam giác phía trên bên phải và thay vào đó sẽ nằm ở phần dưới bên trái của hình vuông. Vì vậy, tôi cũng cần v4.Tôi đã thử điều này - 'if (x> y) // nếu điểm nằm trong tam giác phía trên bên phải trả lại (1 - x) * v1 + (x - y) * v2 + y * v3; else // nếu điểm nằm trong tam giác bên trái phía dưới return (1 - x) * v1 + (x - y) * v4 + y * v3; ' Nhưng điểm không hoạt động – Frobot

+0

Loại gradient/là/điều này mà bạn đang cố gắng tạo ra? Nếu bạn muốn làm điều đó dựa trên một hình vuông thì nó phức tạp hơn một chút vì 'd/dx = (v2 - v1) (1 - y) + (v3 - v4) y' và' d/dy = (v3 - v2) x + (v4 - v1) (1 - x) '. Nó vẫn còn có thể. – Dan

+0

Không hoàn toàn chắc chắn những gì bạn đang yêu cầu, nhưng đó là một chức năng tiếng ồn mượt mà tôi đang thực hiện. Tôi có nó làm việc bằng cách sử dụng hình vuông đầy đủ và làm nội suy song tuyến, tương tự như nhiễu perlin, nhưng tôi đang cố gắng để làm cho nó hoạt động bằng cách sử dụng hình tam giác thay vì hình vuông. – Frobot

0

Dưới đây là một số giả cho gần hàng xóm:

if(dist(p, p1) <= dist(p, p2) && dist(p, p1) <= dist(p, p3)) 
    return val(p1) 
if(dist(p, p2) <= dist(p, p3) && dist(p, p2) <= dist(p, p1)) 
    return val(p2) 
if(dist(p, p3) <= dist(p, p1) && dist(p, p3) <= dist(p, p2)) 
    return val(p3) 

Tôi nghĩ rằng đây cũng tạo ra một sơ đồ Voronoi

+0

Tôi cần một số dạng nội suy tuyến tính vì hàng xóm gần nhất sẽ chỉ tạo ra các ô vuông lớn màu – Frobot

+0

Không phải hình vuông. Nó sẽ chỉ tạo ra các ô vuông khi sử dụng các điểm lấy mẫu tại các vị trí vuông và bạn đã chỉ định các hình tam giác. – rsaxvc

+0

Xin lỗi, ý tôi là nó sẽ tạo ra những hình tam giác màu lớn * – Frobot

3

Bạn nên sử dụng tọa độ barycentric. Có một rất kỹ lưỡng ghi lên đây mà cũng thảo luận về các giải pháp thay thế và tại sao tọa barycentric là tốt nhất: CodePlea - Interpolating in a Triangle

Về cơ bản, trọng lượng sẽ kết thúc như thế này:

enter image description here

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