我有一個測驗任務。聽起來像這樣。寫2個函式。第一個函式必須包含一個秘密點,比如說 [12, 45, 99]。這個點在 3D 空間中,它的坐標只能取 0 到 100 之間的整數值。這個函式以任意點為引數,計算秘密點到給定點的距離。
const secretPoint = [12, 45, 99];
export default function getDistance(manualPoint) {
if (manualPoint.length !== 3) {
console.error("Wrong manualPoint!");
}
let sum = 0;
for (let i = 0; i < manualPoint.length; i ) {
const difference = secretPoint[i] - manualPoint[i];
sum = Math.pow(difference, 2);
}
const result = Math.sqrt(sum);
return result;
}
第二個函式必須在呼叫第一個函式的最少次數中找到 SECRET 點的坐標。
這就是問題所在,因為我不知道如何正確地做到這一點。假設對已排序資料陣列的最快搜索是二進制搜索是合乎邏輯的。在我們的例子中,這是合適的,因為。我們正在尋找從 0 到 100 的 3 個坐標。
為了不使我的任務復雜化,我決定首先撰寫一個函式,只在一個平面上搜索坐標。
這是我嘗試做到的方式。我有一個最小值 - 0 和一個最大值 - 100。所以我們用給定的值呼叫第一個函式[0 0 0] / [0 0 100]
并比較結果。如果在第一種情況下到秘密點的距離大于在第二種情況下。所以所需的坐標 0 0 Z 位于 50 到 100 的范圍內。我們繼續以相同的方式縮小該點的搜索區域。
這個函式不正確,我知道。但不知何故,有時它給了我正確的值,但有時會出現 1 或 2 的錯誤。
const secretPoint = [12, 45, 99];
function binarySearch() {
let left = 0;
let right = 100;
let mid;
while (left <= right) {
mid = (right - left) / 2 left;
if (getDistance([0, 0, left]) < getDistance([0, 0, right])) {
console.log(Math.floor(mid));
right = mid - 1;
} else {
console.log(Math.floor(mid));
left = mid 1;
}
}
return -1;
}
binarySearch();
輸出是這樣的:50 75 88 94 97 99
所以現在它以某種方式作業正常,但讓我們將 secretPoint 更改為
const searchPoint = [12, 45, 28];
和輸出是這樣的: 50 24 37 30 27 29
所以這是錯誤的。
uj5u.com熱心網友回復:
距中心給定距離的點位于具有該半徑的球體上。兩個中心定義了兩個球體,它們在一個圓上相交。第三個球體確定圓上的兩個點。最后,需要第四點來區分這兩者。
所以你基本上需要為三個球體的交點實作一個演算法。
球面方程在 X、Y、Z 上是二次的,具有特殊形式。通過減去兩對方程,你得到兩個線性方程,它們是兩個平面的線性方程。這些平面的交點是一條直線。通過寫出直線的引數方程,很容易得到與其中一個球體的交點。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/524672.html
下一篇:C 在命令列中讀取“輸入”
