ejsoon 写了: gemini
一線段的兩個端點坐標為(x1,y1),(x2,y2),如何判斷點(x3,y3)是否在此線段上?偏差為z。給出js代碼。
要判斷點 `(x3, y3)` 是否在線段 `(x1, y1)` 到 `(x2, y2)` 上,並且允許一定的偏差 `z`,你可以使用以下 JavaScript 代碼:
```javascript
function isPointOnSegment(x1, y1, x2, y2, x3, y3, z) {
// 計算線段的向量 (dx, dy)
let dx = x2 - x1;
let dy = y2 - y1;
// 計算點 (x3, y3) 到線段起點 (x1, y1) 的向量 (dx3, dy3)
let dx3 = x3 - x1;
let dy3 = y3 - y1;
// 計算點 (x3, y3) 到線段終點 (x2, y2) 的向量 (dx4, dy4)
let dx4 = x3 - x2;
let dy4 = y3 - y2;
// 計算線段的長度
let segmentLength = Math.sqrt(dx * dx + dy * dy);
// 計算點 (x3, y3) 到線段起點和終點的距離
let distanceToStart = Math.sqrt(dx3 * dx3 + dy3 * dy3);
let distanceToEnd = Math.sqrt(dx4 * dx4 + dy4 * dy4);
// 計算點 (x3, y3) 到線段的垂直距離
let crossProduct = dx * dy3 - dy * dx3;
let perpendicularDistance = Math.abs(crossProduct) / segmentLength;
// 檢查點是否在線段上,允許一定的偏差 z
if (perpendicularDistance <= z &&
distanceToStart <= segmentLength + z &&
distanceToEnd <= segmentLength + z) {
return true;
}
return false;
}
// 示例使用
let x1 = 1, y1 = 1, x2 = 5, y2 = 5;
let x3 = 3, y3 = 3, z = 0.5;
if (isPointOnSegment(x1, y1, x2, y2, x3, y3, z)) {
console.log("點 (x3, y3) 在線段上");
} else {
console.log("點 (x3, y3) 不在線段上");
}
```
### 解釋:
1. **向量計算**:我們首先計算線段的向量 `(dx, dy)`,以及點 `(x3, y3)` 到線段起點和終點的向量。
2. **距離計算**:接著計算點 `(x3, y3)` 到線段起點和終點的距離,以及點到線段的垂直距離。
3. **條件判斷**:最後,檢查垂直距離是否小於等於偏差 `z`,並且點到線段起點和終點的距離是否在允許的範圍內。
這樣可以有效地判斷點 `(x3, y3)` 是否在線段 `(x1, y1)` 到 `(x2, y2)` 上,並允許一定的偏差 `z`。