【问题标题】:How to get the intersection points of an Arc and a line?如何获得圆弧和直线的交点?
【发布时间】:2020-01-06 11:26:58
【问题描述】:

我需要在圆弧内放置几条线段,但要做到这一点,我需要有交点,以便我可以完美地将线放在圆弧内;

我想了一种方法来计算距离并检查它是否小于半径,但问题是我需要知道 C、D 和 E 点以便我可以放置线部分,所以我在这里迷路了,有人可以帮忙吗?

编辑

  • 指定半径
  • 线段数可能不同,但至少有 2 条线
  • 行从起始边界开始,在结束边界结束;例如:起点是C,终点是D

编辑 为了清楚我想要做什么,我正在上传另一个插图;

我需要得到[CD],[EI],[JK]线的坐标,

【问题讨论】:

  • Glassner 的 Graphics Gems 包含用于解决各种数学/图形问题的快速代码。这本书很天才:amazon.com/Graphics-Gems-Andrew-S-Glassner/dp/0122861663
  • 你的弧是如何定义的? (半径+角度?)线段是否需要从弧中心开始并在弧边界结束?您希望它们有多少细分或分布/密度?
  • @ErnestoStifano 线段从一个边界开始,在另一边界结束。指定半径,段数可能会改变,但至少 2 个。
  • 目前还不清楚你要做什么......除非它有180度或更大的角度,否则弧中没有“对边”这样的东西。无论如何,定位段的逻辑是什么?是随机的吗?
  • 好的,我看到了你最后的编辑...你想随机放置片段吗?等距?从上还是从下开始?

标签: javascript math trigonometry


【解决方案1】:

好的……我们开始吧。以下 sn-p 应该适用于任何弧(用角度和半径定义)以及您想要的任意数量的等距线段。

目前,它假定弧完美地水平放置(如在您的示例中),但可以“轻松”扩展以允许平移/旋转弧。

getLinesCoords() 函数将返回一个对象,该对象的xy 属性包含具有每个段对应坐标的数组。

“y”坐标是线段距中心的“高度”(图像中的 G),“x”是开始/结束位置,始终从中心开始(左/右取决于符号 +/-)。

如果您有任何问题,请提出。

// *** 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});

}

【讨论】:

    猜你喜欢
    • 2015-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多