【问题标题】:Calculate Arc Center Point, Knowing It's Start and End Degrees计算圆弧中心点,知道它的起点和终点度数
【发布时间】:2012-10-14 13:57:45
【问题描述】:

这个答案的最快描述是我试图找到白点的坐标。深红色是绘制圆(深蓝色)上绘制的弧线。

更长的解释: 我有一个扩展 View 的类,它正在画布上画一个圆圈(画布的宽度和高度相等):

canvas.drawArc(rectF, 0, 360, true, paint); // mOvals is a RectF object with 4 coordinates

然后我绘制一个宽度为 N% 的弧(在本例中假设为 225)。弧线从 -90 度开始(因为画布中的 0 度意味着 3 点钟)和“偏离”N 度(在本例中为 225 度)。

我正在尝试计算 X/Y 坐标或剩余弧的中心(红色弧未覆盖的区域;即在 N 和 360 之间)。

如果有帮助的话,我的圆的半径是 canvasWidth/2。

这是我绘制红色弧线的方法:

long arcEnd = (360 * fractionNumber) / totalNumber;
canvas.drawArc(rectF, -90, arcEnd, true, paint);

【问题讨论】:

    标签: android canvas geometry


    【解决方案1】:

    (已更新原始答案。现在可能有点过于冗长,但我希望它有所帮助。)

    您正在寻找 XY 坐标(称为笛卡尔坐标),但这些坐标很难直接计算。诀窍是首先通过极坐标。极坐标和笛卡尔是同一事物的两种表达方式,即网格中的一个点,可以相互转换。

    极坐标由角度和距中心点的距离组成。您可以计算所需的角度,因为您知道需要覆盖的圆的百分比,并且您可以计算到中心的距离,因为您知道圆的半径。

    你的覆盖弧是 225 度,所以余数是 135,一半是 67.5 度。因此,您要查找的点的角度为 225+67.5 = 292.5 度。该点的半径是圆半径的一半,即canvasWidth/4

    一旦确定了极坐标(292.5, canvasWidth/4),就可以使用conversion function 将其转换为XY 坐标。有一件事有点棘手:Math.cos(double)Math.sin(double) 期望他们的论点在radians,而不是度数。在进行转换之前,您将 292.5/360 表示为 x/2π,通过将值乘以 π/180 来实现,在这种情况下得到 5.1051。

    假设canvasWidth 是400:

    double tdeg 292.5d; // Calculated from arc percentage 
    int r =  100;      // Calculated from canvas width
    
    double trad = tdeg * (Math.PI/180d); // = 5.1051
    
    int x = (int) r * Math.cos(trad);
    int y = (int) r * Math.sin(trad);
    

    【讨论】:

    • 你能详细说明一下吗?我尝试通过Math.atan2(x, y) 运行原始X 和Y 坐标,但它只返回一个类似0.8612618928415864 的数字。您知道如何将其转换为实际坐标吗?
    • 通过转换输入的不是 XY 坐标(笛卡尔坐标),而是极坐标。极坐标和笛卡尔只是表达同一事物(网格中的一个点)的两种方式。极坐标由角度(通常在 0 到 360 度或 0 到 2π 之间)和到中心点的距离组成。您可以计算所需的角度,因为您知道百分比,并且您可以计算距离,因为您知道圆的半径。一旦确定了极坐标,就可以使用我链接到的函数将其转换为 XY 坐标。
    • 有人找到解决方案了吗?非常感谢您的帮助,谢谢
    • @Barend 为什么我们必须这样做canvasWidth/4
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-21
    • 1970-01-01
    • 2021-04-09
    • 1970-01-01
    相关资源
    最近更新 更多