如何获得圆弧和直线的交点?
How to get the intersection points of an Arc and a line?
我需要在弧内放置几个线段,但为此我需要有交点,这样我才能将线完美地放置在弧内;
我想到了一种计算距离并检查它是否小于半径的方法,但问题是我需要知道 C、D 和 E 点,以便我可以放置线段,所以我在这里迷路了,有人可以帮忙吗?
编辑
- 指定了半径
- 线段的数量可能会有所不同,但至少有 2 条线
- 线条从起始边界开始,到结束边界结束;例如:起点是
C
,终点是 D
编辑
为了清楚我要做什么,我上传了另一张插图;
我需要获取[CD]、[EI]、[JK]行的坐标,
好的...我们开始吧。以下代码段应该适用于任何圆弧(用角度和半径定义)和您想要的任意数量的等距线段。
目前,它假定圆弧完全水平放置(如您的示例),但可以 "easily" 扩展以允许 translated/rotated 圆弧。
getLinesCoords()
函数将 return 一个对象,其 x
和 y
属性包含具有每个段对应坐标的数组。
"y" 坐标是距中心(图像中的 G)的线段 "height","x" 是 start/end 位置,始终从中心(left/right 取决于符号 +/-)。
有什么问题欢迎提问
// *** ARC ***
const R = 100; // RADIUS
const PHI = 180; // ANGLE (DEG)
// *** LINES ***
const LINES = 10; // NUMBER OF LINES TO BE PLACED
// *** CALCULATIONS ***
const coords = getLinesCoords(R, PHI, LINES);
console.log(coords);
function getLinesCoords(radius, angle, linesNum) {
let i = 0;
let arcAvailHeight = 0;
let linesSep = 0;
let linesYCoords = [];
let linesXCoords = [];
let angleRad = angle * Math.PI / 180;
// GET AVAILABLE HEIGHT FOR PLACING LINES
arcAvailHeight = radius * (1 - Math.cos(angleRad / 2));
// GET LINES SEPARATION
linesSep = arcAvailHeight / (linesNum + 1);
// GET Y COORDINATES FOR LINES
for (i = 0; i < linesNum; i++) {
linesYCoords[i] = linesSep * (i + 1);
}
// GET CORRESPONDING X COORDINATES FOR LINES
linesYCoords.forEach((y) => {
linesXCoords.push(Math.sqrt(radius**2 - (radius * Math.cos(angleRad / 2) + y)**2));
});
return ({x: linesXCoords, y: linesYCoords});
}
我需要在弧内放置几个线段,但为此我需要有交点,这样我才能将线完美地放置在弧内;
我想到了一种计算距离并检查它是否小于半径的方法,但问题是我需要知道 C、D 和 E 点,以便我可以放置线段,所以我在这里迷路了,有人可以帮忙吗?
编辑
- 指定了半径
- 线段的数量可能会有所不同,但至少有 2 条线
- 线条从起始边界开始,到结束边界结束;例如:起点是
C
,终点是D
编辑
为了清楚我要做什么,我上传了另一张插图;
我需要获取[CD]、[EI]、[JK]行的坐标,
好的...我们开始吧。以下代码段应该适用于任何圆弧(用角度和半径定义)和您想要的任意数量的等距线段。
目前,它假定圆弧完全水平放置(如您的示例),但可以 "easily" 扩展以允许 translated/rotated 圆弧。
getLinesCoords()
函数将 return 一个对象,其 x
和 y
属性包含具有每个段对应坐标的数组。
"y" 坐标是距中心(图像中的 G)的线段 "height","x" 是 start/end 位置,始终从中心(left/right 取决于符号 +/-)。
有什么问题欢迎提问
// *** ARC ***
const R = 100; // RADIUS
const PHI = 180; // ANGLE (DEG)
// *** LINES ***
const LINES = 10; // NUMBER OF LINES TO BE PLACED
// *** CALCULATIONS ***
const coords = getLinesCoords(R, PHI, LINES);
console.log(coords);
function getLinesCoords(radius, angle, linesNum) {
let i = 0;
let arcAvailHeight = 0;
let linesSep = 0;
let linesYCoords = [];
let linesXCoords = [];
let angleRad = angle * Math.PI / 180;
// GET AVAILABLE HEIGHT FOR PLACING LINES
arcAvailHeight = radius * (1 - Math.cos(angleRad / 2));
// GET LINES SEPARATION
linesSep = arcAvailHeight / (linesNum + 1);
// GET Y COORDINATES FOR LINES
for (i = 0; i < linesNum; i++) {
linesYCoords[i] = linesSep * (i + 1);
}
// GET CORRESPONDING X COORDINATES FOR LINES
linesYCoords.forEach((y) => {
linesXCoords.push(Math.sqrt(radius**2 - (radius * Math.cos(angleRad / 2) + y)**2));
});
return ({x: linesXCoords, y: linesYCoords});
}