2015-04-27 19 views
7

Tôi đang cố sắp xếp các điểm đồng nhất hơn hoặc ít hơn dọc theo bề mặt của một quả cầu đơn vị.Sắp xếp các điểm đồng nhất trên một hình cầu bằng cách sử dụng Fibonacci Lattices

I'm told rằng mặc dù vấn đề này rất khó, Fibonacci Lattices đưa ra giải pháp rất tốt.

Tôi đã thử một vài ngày để làm theo phương pháp rất đơn giản được cung cấp trong tài liệu được liên kết, nhưng tôi không thể làm cho nó trông đúng.

Tôi đang sử dụng javascript và tôi có một mảng đối tượng e, mỗi đối tượng hiển thị thông số latlon. Đây là chức năng tôi sử dụng để sắp xếp các điểm trên mặt cầu: (giả định cho bây giờ mà số điểm luôn luôn là số lẻ)

function arrangeEntries(e) 
{ 
    var p = e.length; 
    var N = (p - 1)/2; 

    for (var i = -N; i <= N; i++) 
    { 
     e[i + N].lat = Math.asin((2 * i)/(2 * N + 1)); 
     e[i + N].lon = mod(i, 1.618034) * 3.883222; 
    } 
} 

với

function mod(a, b) 
{ 
    return a - Math.floor(a/b) * b; 
} 

Không giống như trong tài liệu, tôi latlon bằng radian chứ không phải độ. Điều này là để tôi có thể vẽ chúng sau này bằng cách sử dụng các tọa độ X/Y/Z mà tôi có được bằng cách sử dụng các hàm javascript Math.sinMath.cos, các hàm này chấp nhận radian chứ không phải độ.

Dòng đầu tiên cho lat là khá thẳng về phía trước. Tôi bỏ qua hệ số 180/Pi trong tài liệu vì tôi muốn giữ kết quả bằng radian.

Dòng thứ hai cho số lon lấy mô đun của chỉ mục sử dụng tỷ lệ vàng và thay vì nhân với hệ số 360/Phi để trả lời theo độ, tôi nhân với (360/Phi) * (Pi/180) để trả lời bằng radian.

Kể từ khi chức năng trang điểm không quan tâm những gì radian loạt mất, tôi không cần phải chắc chắn latlon là trong phạm vi (-pi, pi]

Để làm cho điểm:.

function render(e) 
{ 
    var offsetX = Math.floor(canvas.width/2); 
    var offsetY = Math.floor(canvas.height/2); 

    var r = Math.min(canvas.width, canvas.height) * 0.4; 

    ctx.clearRect(0, 0, canvas.width, canvas.height); 

    for (var i = 0; i < e.length; i++) 
    { 
     var x = Math.cos(e[i].lat) * Math.sin(e[i].lon); 
     var y = Math.sin(e[i].lat) * Math.sin(e[i].lon); 
     var z = Math.cos(e[i].lon); 

     // Make z go from 0.1 to 1 for scaling: 
     z += 1; 
     z /= 2; 
     z *= 0.9; 
     z += 0.1; 

     ctx.beginPath(); 
     ctx.arc(r * x + offsetX, r * y + offsetY, z*5, 0, 2 * Math.PI, false); 
     ctx.fillStyle = "#990000"; 
     ctx.fill(); 
     ctx.lineWidth = 2; 
     ctx.strokeStyle = "#FF0000"; 
     ctx.stroke(); 
     ctx.closePath(); 
    } 
} 

để đưa ra một ảo giác về chiều sâu cho đến khi tôi đặt xoay trong, tôi nhân bán kính của điểm bằng cách z phối hợp, mà tôi theo đường thẳng rộng tới [0.1,1.0].

Dưới đây là một JSFiddle liên kết với tất cả các mã: https://jsfiddle.net/wexpwngc/ Nếu bạn tăng số điểm từ 101 lên một cái gì đó lớn hơn nhiều như 1001, sau đó bạn sẽ thấy rằng có rất nhiều vón cục xung quanh các cực, và có một số nơi thưa thớt trên điểm.

Tôi đã gặp vấn đề này một thời gian rồi. Ai có thể nhìn thấy nơi tôi đã phạm sai lầm?

+0

xem các liên kết sau: [sphere triangulation] (http://stackoverflow.com/a/29139125/2521214), [hình cầu có đỉnh bằng nhau] (http://stackoverflow.com/a/25031737/2521214), [ lưới/bản đồ hình cầu] (http://stackoverflow.com/a/25082674/2521214) cho các lựa chọn thay thế đơn giản hơn – Spektre

Trả lời

0

e [i + N] .lon của bạn bị tắt theo hệ số 0.5.

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