Python - 如何找到圆的x和y坐标以在地图上创建弧线

4
我在编写一个Python脚本,根据我收到的数据在地图上绘制一些点和曲线。我试图使用以下任意数据来获取圆弧/圆的中心坐标。但是我很难理解这个问题。
  • 点1的纬度和经度
  • 点2的纬度和经度
  • 起始角度
  • 结束角度
  • 圆的半径

我知道解决这个问题并不需要这么多数据。

我还有一个标志,告诉我这是左转还是右转。

是否可能使用上述信息计算x和y坐标?

我已经有一个在JavaScript中运行的函数来绘制弧形。

function drawArc(center, initialBearing, finalBearing, radius) {{
    var d2r = Math.PI / 180;   // degrees to radians 
    var r2d = 180 / Math.PI;   // radians to degrees 

    var points = 32; 

    // find the raidus in lat/lon 
    var rlat = (radius / EarthRadiusMeters) * r2d;
    var rlng = rlat / Math.cos(center.lat() * d2r); 

    var extp = new Array();

    if (initialBearing > finalBearing) finalBearing += 360;
    var deltaBearing = finalBearing - initialBearing;
    deltaBearing = deltaBearing/points;
    for (var i=0; (i < points+1); i++) 
    {{ 
      extp.push(center.DestinationPoint(initialBearing + i*deltaBearing, radius)); 
      bounds.extend(extp[extp.length-1]);
    }}
    return extp;
}}

我真的找不到一个好方法来获取圆形的中心点的x和y坐标。

enter image description here


2
我只想指出,你把顺时针度数作为正数让我的大脑感到不适。 - Cory Kramer
在math.stackexchange上有很多关于这种问题的答案。示例 - wflynny
我现在会查看那些答案。看起来它们可能有我需要的东西。尽管其中一些仍不清楚。 - Snhp9
@CoryKramer:许多图形库将“原点”定义为屏幕的左上角,并使“y”轴向下指。在这种情况下,顺时针为正度数是有意义的,因为整个图形都沿着“传统”轴方向镜像反转了x轴。 - Jake Griffin
@JakeGriffin 很有趣。我来自工程/物理背景,所以习惯于将上/右/前视为正方向,逆时针旋转为正方向。 - Cory Kramer
@CoryKramer:我也来自工程背景,所以我理解你的困惑。你的方法对我来说更有意义。我只是指出,在某些情况下,重新调整事物有时会使解决方案更简单。通常,任何特定问题都有许多有效的解决方案。 :-) - Jake Griffin
2个回答

1

给定一个点 (Px, Py),该点的起始角度 (Pa) 和半径 (r),您可以按以下方式计算中心点 (Cx, Cy):

Cx = Px - r * cos(Pa)
Cy = Py - r * sin(Pa)

例如,如果您想要以点(1,2)为中心的弧的中心,该弧在半径为3的圆上以Pi/3弧度(60度)处,则可以按以下方式计算中心:
Cx = 1 - 3 * cos(Pi/4) = 1 - 3 * 0.5 = 1 - 1.5 = -0.5
Cy = 1 - 3 * sin(Pi/4) = 1 - 3 * sqrt(2)/2 = -1.1213
C = (-0.5, -1.1213)

还有一些类似的公式可以使用,根据其他信息计算出中心点。例如,您可以通过给定“第一个”和“第二个”点、半径和“转向方向”(左或右)来计算中心点。这些方程式是相当简单的三角函数推导。


这个在球面地图上能用吗?我的曲线随机地放置在地图上。 - Snhp9

0
据我所知,中心点不取决于圆的参数。它是画布上的XY坐标。它可以在任何地方,或者更常见的是在图片中间看起来更好。

看这里:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import cairo, math

radius=100

starting_angle = math.radians(210) #  angle in radians
ending_angle = math.radians(330)

WIDTH, HEIGHT = radius*2+20, radius*2+20 # Canvas size

x=WIDTH/2 # X position
y=HEIGHT/2 # Y position


surface = cairo.ImageSurface (cairo.FORMAT_ARGB32, WIDTH, HEIGHT)
context = cairo.Context (surface)

# Background Neutral Gray ----------
context.set_source_rgb(0.25, 0.25, 0.25)
context.rectangle(0, 0, WIDTH, HEIGHT)
context.fill()


# Red Sector -------------------
context.set_source_rgb(1, 0, 0) # rgb color red
context.arc(x, y, radius, starting_angle, ending_angle)
context.line_to (x, y)
context.fill()


surface.write_to_png ("img.png") # Output to PNG

enter image description here


我正在尝试获取地图上两点之间的弧。因此,我需要根据这些点获取正确的x和y坐标。您已经根据画布的宽度和高度硬编码了中心点。 - Snhp9
好的。我说中心点可以在任何地方。我猜你的地图在XY维度上是平面的?由于我没有地图,所以我围绕圆形制作了我的画布。只需找到您的地图上该点的XY坐标并绘制一个圆即可。 - Alex Ivanov
我明白了。2D并不完全适用于3D。总是有一些东西不匹配。 - Alex Ivanov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接