给出第二坐标和第三坐标及第三条边,求(右)三角形的第三坐标

2024-09-25 12:25:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我从很远的地方开始解释我的问题,这样您就可以提出完全不同的方法并理解定制对象和函数。 多年来,我记录了许多自行车的GPS轨迹(.gpx)。我决定将这些(大部分是重叠的)轨迹合并到一个大图形中,并合并/删除大部分轨迹点。到目前为止,我已经成功地简化了轨迹(gpxpy模块中的特性,它删除了大约90%的轨迹点,同时保留了角点的位置),并将它们加载到我当前的程序中。在

当前的python3程序包括加载gpx轨迹和优化图形和四次扫描。我的计划步骤如下:

  1. 从gpx导入点(工作)
  2. 相邻的连接点(工作)
  3. 在小角度下合并边(问题在于此步骤)
  4. 去除直线上的点(两个边之间的角度超过170度)。看来是有效的。在
  5. 通过重置点的唯一索引进行清理(工作)
  6. 图中所有边的最终检查。在

在我的程序中,我开始用0计算步数,因为第一步只是打开和解析文件。Stackoverflow不允许我从0开始订购。在

为了存储图形,我有一个字典punktid(爱沙尼亚语中的points),其中punkt(point)对象存储在key uid/ui(惟一ID)。唯一ID也存储在点本身中。在第2步和第3步中使用权重属性来计算点的平均值,同时考虑之前的合并。在

class punkt:
    def __init__(self,lo,la,idd,edge=set(),ele=0, wei=1):
        self.lng=lo        #Longtitude
        self.lat=la        #Latitude
        self.uid=idd       #Unique ID
        self.edges=edge    #Set of neighbour nodes
        self.att=ele       #Elevation
        self.weight=wei    #Used to get weighted average
>>> punktid
{1: <__main__.punkt object at 0x0000006E9A9F7FD0>, 
 2: <__main__.punkt object at 0x0000006E9AADC470>, 3: ...}
>>> punktid[1].__dict__
{'weight': 90, 'uid': 9000, 'att': 21.09333333333333, 'lat': 59.41757, 'lng': 24.73907, 'edges': {1613, 1218, 1530}}

如您所见,在清理中有一个小错误,uid没有更新。我已经修好了,但我把它放在里面了,这样你们就可以看到图形的比例了。punktid的最大指数为1699/11787。在

进入核心问题

假设我有3个点:A、B和C(在下面的代码片段中分别是I、lyhem(2)和lyhem(0)。A与B和C具有公共边,但B和C可能没有公共边。C比B更接近A。为了减小图的大小,我想把C移到边AB附近(同时考虑B和C的权重),并将AB重定向到C

我想出的解决方案是在AB上找到最接近C的临时点D,然后找到D和C之间的加权平均值,将其保存为E,并将所有C边和AB重定向到该点。Simplified figure-注意,E=(C+D)/2并不完全准确。我不能添加两个以上的链接,但我有额外的2个图片说明我的问题。在

最大的问题是找到D的坐标。我在Mathematica网站上找到了possible solution,但它包含了±号,因为在寻找坐标时有两个可能的坐标。但我有一条线,点在哪里。总之,我不知道如何正确实现它,我的代码变得相当混乱:

^{pr2}$

这是一个代码段,由于缺少变量/函数,在复制粘贴后可能不会运行。在第3个if语句中的第22行到第43行,从开始if sin(b)*lyhem[1]<r到{}计算新点。然后将旧边重定向到新节点。在

清楚地说明问题:如果线段的两个坐标(AC)和这些点上的角度已知(ACB角度应为90度),如何在射线(AB)上找到点?如何在python3.5中实现它?在

PS.(Meta)如果有人需要完整的源,我如何提供它(上传单个文本文件而不注册)?在这里粘贴还是粘贴?如果我上传到其他网站,如何提供链接,如果新手用户被限制在两个?在


Tags: 对象函数self程序id图形uidab