当前位置: 首页 > 知识库问答 >
问题:

使用圆心、半径和圆上的3点计算圆弧上的点

元景天
2023-03-14

给定圆心、半径和3个点,我想通过指定开始绘制的角度和旋转的角度,绘制一条从第一个点开始、穿过第二个点并在第三个点结束的圆弧。为此,我需要计算圆弧上的点。我希望计算的点数是可变的,这样我就可以调整计算圆弧的精度,这意味着我可能需要一个循环,在计算完一个点后,通过旋转一点来计算每个点。我已经阅读了这个问题的答案,用2个点和圆心画圆弧,但它只解决了角度计算的问题,因为我不知道如何画画布。实现了“drawArc”。

共有1个答案

胡高寒
2023-03-14

该问题分为两部分:

  1. 如何找到经过第三点的两点之间的弧?
  2. 如何在找到的弧上生成一组点?

让我们从第一部分开始。给定(O, r)圆上的三个ABC点,我们要找到穿过BAC之间的圆弧。要找到圆弧的内角,我们需要计算ABAC圆弧的定向角。如果AB的角度大于AC,我们就错了方向:

Va.x = A.x - O.x;
Va.y = A.y - O.y;
Vb.x = B.x - O.x;
Vb.y = B.y - O.y;
Vc.x = C.x - O.x;
Vc.y = C.y - O.y;

tb = orientedAngle(Va.x, Va.y, Vb.x, Vb.y);
tc = orientedAngle(Va.x, Va.y, Vc.x, Vc.y);

if tc<tb
    tc = tc - 2 * pi;
end


function t = orientedAngle(x1, y1, x2, y2)
    t = atan2(x1*y2 - y1*x2, x1*x2 + y1*y2);
    if t<0
        t = t + 2 * pi;
    end
end

现在是第二部分。你说:

我可能需要一个循环,在计算完一个点后,通过旋转一点来计算每个点。

但问题是,有多少?由于圆的周长随着半径的增加而增加,因此无法使用固定角度达到固定精度。换句话说,要绘制两条具有相同角度和不同半径的圆弧,我们需要不同数量的点。我们可以假设[几乎]恒定的是这些点之间的距离,或者我们绘制的用于模拟圆弧的线段的长度:

segLen = someConstantLength;
arcLen = abs(tc)*r;
segNum = ceil(arcLen/segLen);
segAngle = tc / segNum;
t = atan2(Va.y, Va.x); 

for i from 0 to segNum
    P[i].x = O.x + r * cos(t);
    P[i].y = O.y + r * sin(t);
    t = t + segAngle;
end

请注意,虽然在此方法中AC肯定会被创建,但pointB不一定是创建的点之一。但是,此点与最近段的距离将非常小。

 类似资料:
  • js 已知圆弧的起点坐标、终点坐标、半径,圆心坐标,如何计算弧线上的坐标? js 已知圆弧的起点坐标、终点坐标、半径,圆心坐标,如何计算弧线上的坐标?

  • 我已经10年没做过这样的数学了...我正在编程一个2D游戏和移动一个球员周围。当我移动播放器时,我试图计算离播放器位置200像素的圆上的点,给定-360到360之间的正或负角度(度)。屏幕是1280x720,0,0是屏幕的中心点。玩家在整个笛卡尔坐标系中移动。我试图找到的点可以不在屏幕上。 我尝试了文章中用半径和角度找到点的公式,但我不相信我理解了什么是“角度”,因为当我把角度作为-360到360

  • 我查阅了多个用不同形式的数学(微积分、几何、三角学等)编写的示例,但无法将其中任何一个转换为代码。我的理解是,给出的值产生两个不同的中心/交点。这些就是我需要弄清楚的。 这个解释器是在Arduino上运行的,用C语言编写的,如果有人能用伪代码来指导我,我会非常感激的。 谢了!

  • arcTo()介绍 arcTo()方法接收5个参数,分别是两个切点的坐标和圆弧半径。这个方法是依据切线画弧线,即由两个切线确定一条弧线。 具体如下。 arcTo(x1,y1,x2,y2,radius) 这个函数以给定的半径绘制一条弧线,圆弧的起点与当前路径的位置到(x1, y1)点的直线相切,圆弧的终点与(x1, y1)点到(x2, y2)的直线相切。因此其通常配合moveTo()或lineTo(

  • 主要内容:弧形,圆形,示例,实例-2弧形 以下代码显示如何绘制以,为中心,半径为并从角度延伸到角度(270度长)的圆弧。 上面的代码生成以下结果。 圆形 类创建一个新的圆,其中指定的半径和中心位置以像素为单位。 上面的代码生成以下结果。 示例 以下代码显示了如何使用构造函数传递半径和中心。 上面的代码生成以下结果。 实例-2 圈形与DropShadow,如下代码所示 - 方法返回节点的边界区域,例如其宽度和高度。计算包括节点的实际尺

  • 我想用圆心(x,y)和半径r画一个圆。