2013-03-08 13 views
7

có lẽ không phải là nơi thích hợp để đăng bài này nhưng tôi không biết nơi nào khác để đăng nó.Công thức chung để tính khoảng cách bằng không gian 3d-

tôi có 5 dòng (d1 -> d5) phân bố đều nhau trong phối cảnh 3D, tôi có các giá trị của (a) góc, (d1) và (b5). tôi cần tính toán (b2, b3, b4, d2, d3, d4, d5) với jquery.

enter image description here

tôi có thể tính toán d5 với:

d5 = d1 - (b5 * Math.tan(a)) 

nhưng tôi không có ý tưởng làm thế nào để tính toán b2, b3 và b4. (d1 được chia thành 4 phân đoạn giống hệt nhau) bất kỳ trợ giúp nào sẽ được đánh giá cao.

+0

Nó có thể là http://math.stackexchange.com mà bạn muốn. 1 cho hình ảnh anyway. – Popnoodles

+0

Đầu tiên - câu hỏi này thật tuyệt vời. Thứ hai - @popnoodles có lẽ là chính xác. Thứ ba - bạn đang tìm kiếm các giá trị độ dài cho từng phân đoạn dòng? –

+0

@popnoodles: cảm ơn tôi sẽ đăng ở đó ngay – razzak

Trả lời

2

Điều bạn đang tìm kiếm là quy mô dự án. Cách dễ nhất để thực hiện tính toán này là sử dụng các tọa độ đồng nhất, lấy một hình chữ nhật (giống như hình trong hình đầu tiên bên dưới) mà V là "vô cùng xa bên phải" và tìm một phép biến đổi phóng xạ bản đồ hình chữ nhật này đến hình thang bức tranh thứ hai. Các đỉnh của hình chữ nhật là (0 | 0), (0 | d1), (b5 | d1), (b5 | 0) và các đỉnh tương ứng của hình thang là (0 | 0), (0 | d1), (b5 | d5), (b5 | 0).

Illustration of a projective transformation for obtaining a projective scale

Kể từ đây là những bốn điểm trong đó không có ba thẳng hàng, chúng tôi có thể tìm thấy một ma trận duy nhất (lên đến rộng) M cho sự chuyển đổi này. Sau khi một số toán học, nó chỉ ra rằng ma trận này là:

[d1*b5,0,0] 
[0,b5*d5,0] 
[d1-d5,0,b5*d5] 

Nếu bạn muốn tìm tọa độ b3 và d3, ví dụ, bạn có thể nhân ma trận này với tọa độ đồng nhất của các điểm ở giữa dòng , tức là vectơ (0,5 * b5, d1,1)^T và bạn nhận được các tọa độ đồng nhất của điểm (b3 | d3), có thể được chuyển đổi thành các tọa độ Euclide bằng dehomogenisation, tức là chia hai thành phần đầu tiên cho phần thứ ba. Nói chung, nếu bạn có hai điểm (b1 | d1) và (bn | dn) và muốn biết tọa độ của các điểm cân bằng n-2 nằm ngang trên thang tỷ lệ như thế này, bạn có thể tính toán các tọa độ bi và di là như thế này (trong trường hợp của bạn, n sẽ là 5, tất nhiên):

let M := matrix [[d1*bn, 0, 0], [0, bn*dn, 0], [d1-dn, 0, bn*dn]] 
let v := ((i-1)/(n-1)*bn, d1, 1) 
let (x,y,z) := M*v 
let bi := x/z and di := y/z 

như bạn thấy, đây là một thuật toán đơn giản để tính toán tọa độ của các điểm projectively cách đều, và nó generalises độc đáo để tùy ý số điểm.

Nếu bạn muốn có một công thức khép kín, bạn có thể tính toán bi và di trực tiếp như:

let bi := (bn*d1*(i-1))/(dn*n+(d1-dn)*i-d1) 
let di := d1*dn*(n-1)/(dn*n+(d1-dn)*i-d1) 
+0

cảm ơn câu trả lời của bạn, nhưng làm cách nào tôi có thể sử dụng nó trong jquery ?! – razzak

+0

Không vi phạm, nhưng JavaScript là ngôn ngữ trực tiếp từ địa ngục và tôi sẽ không chạm vào nó. Tuy nhiên, tôi không thấy vấn đề - tất cả những gì bạn phải làm là viết mã JavaScript cho hai dòng mã cuối cùng mà tôi đã đăng, điều đó không nên khó trong bất kỳ ngôn ngữ lập trình nào. Có thể một cái gì đó như http://pastebin.com/T3yuyTW3. b [1], b [5], d [1], d [5] phải chứa các giá trị thích hợp khi bắt đầu chương trình, các mục nhập b và d khác sẽ được điền vào vòng lặp. (Tôi không biết đây có phải là JavaScript hợp lệ hay không, nhưng đó phải là ý chính của nó) –

+0

giả sử hai công thức là chính xác 'let bi: = (bn * d1 * (i-1))/(dn * n + (d1-dn) * i-d1) cho phép di: = d1 * dn * (n-1)/(dn * n + (d1-dn) * i-d1) ' nếu tôi thay đổi góc (a) nó dường như không có ảnh hưởng gì đến công thức! – razzak

0

enter image description here

tiên chúng ta cần phải tính toán những gì chiều dài của mặt tiếp giáp của toàn bộ tam giác d1 ->v ->c là (phía dọc bên trái của nó):

tan(Θ) = opposite/adjacent 
opposite * tan(Θ) = adjacent 
adjacent = opposite * tan(Θ) 
adjacent = d1 * tan(a) 

sau đó chúng ta cần là biết bao nhiêu lên khỏi mặt đất mỗi dòng từ v là khi nó được cho dòng d1. Cho rằng biến s là như nhau cho tất cả các bộ phận và giả định N chia phân đoạn (trong trường hợp này 3), truy cập của chúng tôi là i rằng bắt đầu từ 1 và đi vào N:

opposite(i) = i * (d1/N) 

Bây giờ chúng ta cần góc dòng từ v cho mỗi điểm đánh dấu s làm:

tan(Θi) = opposite/adjacent 
Θi = arctan(opposite/adjacent) 
Θi = arctan(opposite(i)/adjacent) 
Θi = arctan((i * (d1/N))/(d1 * tan(a))) 

Sử dụng một số hình/trig ta có thể nói rằng góc đi từ d1 qua điểm c lên trên d5 là (90 ° - a).Chúng tôi sẽ gọi góc này một 'Luật

a' = 90° - a 

sin cho chúng ta biết:

A'/sin(a') = opposite(i)/sin(b') 

vì vậy bây giờ chúng ta giải quyết cho A' vì chúng ta cần một số trợ giúp nhằm kích thước của hình vuông màu cam :

A' = (opposite(i) * sin (a'))/sin(b') 

từ b' = (một + Θi) này biến thành:

A' = (opposite(i) * sin (90° - a))/sin(a + Θi) 

Cùng một điều áp dụng nhưng giải quyết cho h trong cam tam giác (xem hình):

h/sin(90°-Θi) = A'/sin(90°) 
h = (A' * sin(90°-Θi))/sin(90°)  
b2 = h 

Đưa nó tất cả cùng nhau (hy vọng không sao chép/dán những sai lầm trên phần của tôi) và không đơn giản hóa:

b2 = ((((i * (d1/N)) * sin (90° - a))/sin(a + Θi)) * sin(90° - arctan((i * (d1/N))/(d1 * tan(a)))))/sin(90°)  

Bây giờ hãy rửa/lặp lại cho mỗi giá trị i và biến thành mã (Tôi đã làm điều đó nhưng tôi quá mệt mỏi) :)

+0

'tan (Θ) = đối diện/liền kề - -> liền kề = đối diện/tan (0) 'đúng không? – razzak

+0

yup :) Đối với một ', đó là vì tam giác từ các điểm b5-> d5-> c có tổng số 180 deg ở bên trong. một trong số đó là 90 và cái kia là a, do đó góc còn lại là 180-90-a = 90-a mặc dù bạn có thể đúng về nó phụ thuộc vào b5 –

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