python 已知平行四边形三个点,求第四个点的案例

我就废话不多说了,大家还是直接看代码吧!

import numpy as np
#已知平行四边形三个点,求第四个点
#计算两点之间的距离
def CalcEuclideanDistance(point1,point2):
  vec1 = np.array(point1)
  vec2 = np.array(point2)
  distance = np.linalg.norm(vec1 - vec2)
  return distance
#计算第四个点
def CalcFourthPoint(point1,point2,point3): #pint3为A点
  D = (point1[0]+point2[0]-point3[0],point1[1]+point2[1]-point3[1])
  return D
#三点构成一个三角形,利用两点之间的距离,判断邻边AB和AC,利用向量法以及平行四边形法则,可以求得第四个点D
def JudgeBeveling(point1,point2,point3):
  dist1 = CalcEuclideanDistance(point1,point2)
  dist2 = CalcEuclideanDistance(point1,point3)
  dist3 = CalcEuclideanDistance(point2,point3)
  dist = [dist1, dist2, dist3]
  max_dist = dist.index(max(dist))
  if max_dist == 0:
    D = CalcFourthPoint(point1,point2,point3)
  elif max_dist == 1:
    D = CalcFourthPoint(point1,point3,point2)
  else:
    D = CalcFourthPoint(point2,point3,point1)
  return D

print(JudgeBeveling((0,1),(1,0),(1,1)))
print(JudgeBeveling((5,39),(500,35),(496,17)))

补充知识:计算图像中任意四个点连成的四边形面积与Ground truth的IOU(Python)

1.先求任意四个点连成四边形的面积

这个问题可以用下面的图简单的看一下

图像的坐标如上图所示,大致的想法就是四个点可以确定四条线,然后进行判断,在红色区域中则为面积中的一个像素,否则不在。先求四条线的斜率

def line_slope(x1,y1,x2,y2,x3,y3,x4,y4):
    k1=(y2-y1)/(x2-x1)
    k2=(y3-y2)/(x3-x2)
    k3=(y4-y3)/(x4-x3)
    k4=(y1-y4)/(x1-x4)
    return k1,k2,k3,k4

然后计算每个位置上的各个函数值

        l1=int(tk1*(i-tx1)+ty1)
        l2=int(tk2*(i-tx2)+ty2)
        l3=int(tk3*(i-tx3)+ty3)
        l4=int(tk4*(i-tx4)+ty4)

判断条件很重要,因为左边是那样排列的,所以判断条件就是

(l1<=j)&(l2>=j)&(l3>=j)&(l4<=j)

也就是在红色区域中任取一点都满足这个条件。定义一个全局变量,满足条件就+1。面积就求出来了。

其实求面积并不是我的目的

2.求相交的面积

两个面积分别求出来以后,两个面积的交集面积最简单的可以通过对照两个区域的坐标进行求解。

也就是在分别计算两个面积的时候记下符合条件的坐标(x,y)存放到数组中,最后比较两个数组中相等的元素的个数即可求解。

3.并面积

交的面积计算完后,可以用下面的公式(S1:四边形1的面积、S2:四边形2的面积、iu:交面积)

并面积=S1-iu+S2

4.IOU

交面积/并面积

5.测试

(1)

(2)

(3)

可以看到最后一种情况红框已经把ground truth包含了,所以可以直接用S2/S1来检验算法的准确性

而13882/19307=0.719013829181126,可以证明算法的准确性。

测试代码:链接

和别的算法进行比较

还是有区别的。。。

v2是向量方法计算

v3是shapely包计算

以上这篇python 已知平行四边形三个点,求第四个点的案例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • python 已知三条边求三角形的角度案例

    我就废话不多说了,还是直接看代码吧! import math a=1;//边1 b=1;//边2 c=math.sqrt(2);//边3 A=math.degrees(math.acos((a*a-b*b-c*c)/(-2*b*c)))//夹角1 B=math.degrees(math.acos((b*b-a*a-c*c)/(-2*a*c)))//夹角2 C=math.degrees(math.acos((c*c-a*a-b*b)/(-2*a*b)))//夹角3 print(A) print(B

  • python由已知数组快速生成新数组的方法

    需求描述 在利用numpy进行数据分析时,常有的一个需求是:根据已知的数组生成新数组.这个问题又可以分为两类: 根据筛选条件生成子数组: 根据变换条件生成新数组(新数组shape与原数组相同) 下面简单总结. 生成子数组 情况1 已知数组a,以及若干筛选条件conds,要求从数组a中生成一个子数组b. 解决办法:b=a[conds].比如b=a[a>0],b=a[(a>=1)|(a<=-2)], b=a[(a>=1)&(a<=3)] 实例:如下 # 实例1.1:已知数

  • python 已知平行四边形三个点,求第四个点的案例

    我就废话不多说了,大家还是直接看代码吧! import numpy as np #已知平行四边形三个点,求第四个点 #计算两点之间的距离 def CalcEuclideanDistance(point1,point2): vec1 = np.array(point1) vec2 = np.array(point2) distance = np.linalg.norm(vec1 - vec2) return distance #计算第四个点 def CalcFourthPoint(point1,p

  • 浅谈python已知元素,获取元素索引(numpy,pandas)

    目前搜索到的方法有: np.where('元素') 还有就是pandas的方法: df.index('元素') 但是第二个方法的问题就是会报错,嗯,这就比较尴尬了,查询了网上的解决方案,有这样的: 此外使用 df[df['列名'].isin([相应的值])] 这个命令会输出等于该值的行. 此外如果想快速找到dataframe最后几行的话,可以使用的方法是tail,可以获取若干行的值 以上这篇浅谈python已知元素,获取元素索引(numpy,pandas)就是小编分享给大家的全部内容了,希望能给

  • python 已知一个字符,在一个list中找出近似值或相似值实现模糊匹配

    已知一个元素,在一个list中找出相似的元素 使用场景: 已知一个其它来源的字符串, 它有可能是不完全与我数据库中相应的字符串匹配的,因此,我需要将其转为适合我数据库中的字符串 使用场景太绕了, 直接举例来说吧 随便举例: 按青岛城市的城区来说, 我数据库中存储的城区是个list:['市北区', '市南区', '莱州市', '四方区']等 从其它的数据来源得到一个城区是:市北 我怎么得到与市北相似相近的市北区 解决方案: In [1]: import difflib In [2]: cityar

  • Python实现加密的RAR文件解压的方法(密码已知)

    博主之前在网上找了很多资料,发现rarfile库不能直接调用,需要安装unrar模块,下面将详细介绍整个实现流程. 第一步:安装unrar模块,直接pip install unrar可能会找不到库,需要下载unrar library,也就是UnRAR.dll,下载地址为:http://www.rarlab.com/rar/UnRARDLL.exe: 第二步:将unrar安装路径添加到系统环境变量,64位操作系统的路径为C:\Program Files (x86)\UnrarDLL\x64,然后还

  • python绘制已知点的坐标的直线实例

    如下所示: import matplotlib.pyplot as plt import numpy as np x = [11422,11360,11312,11274,11233,11196,11160,11129,11098,11038, 10984,10944,10903,10863,10828,10789,10752,10715,10675,10639, 10654,10619,10587,10550,10510,10466,10425,10389,10350,10311, 10272

  • Python根据已知邻接矩阵绘制无向图操作示例

    本文实例讲述了Python根据已知邻接矩阵绘制无向图操作.分享给大家供大家参考,具体如下: 有六个点:[0,1,2,3,4,5,6],六个点之间的邻接矩阵如表格所示,根据邻接矩阵绘制出相对应的图 0 1 2 3 4 5 6 0 0 1 0 1 0 1 0 1 1 0 1 1 1 1 1 2 0 1 0 1 0 1 0 3 1 1 1 0 1 1 1 4 0 1 0 1 1 1 1 5 1 1 1 1 1 0 0 6 0 1 0 1 1 0 0 将点之间的联系构造成如下矩阵 N = [[0, 3,

  • python lambda函数及三个常用的高阶函数

    进行编程时,一般我们会给一个函数或者变量起一个名字,该名称是用于引用或寻址函数变量.但是有一个低调的函数,你不需要赋予它名字,因此该函数也叫匿名函数.该函数就是Python中的Lambda函数,下面就来为大家解析python-lambda函数,三个常用的高阶函数. 为什么要使用Python Lambda函数? 匿名函数可以在程序中任何需要的地方使用,但是这个函数只能使用一次,即一次性的.因此Python Lambda函数也称为丢弃函数,它可以与其他预定义函数(如filter(),map()等)一

  • python实现输入三角形边长自动作图求面积案例

    三角形是个好东西,比如知道三条边边长,可以判断能不能组成三角形(两边之和大于第三边),如果可以就进一步计算其面积(海伦公式),最后还能把这个三角形画出来(余弦定理求角度),所以说这个作为一个编程题目用于教学是比较棒的. 在jupyterlab中运行效果如下: python源代码如下: # %matplotlib inline # 建议在jupyterlab中运行 import math import numpy as np import matplotlib.pyplot as plt def

  • python操作RabbitMq的三种工作模式

    一.简介: RabbitMq 是实现了高级消息队列协议(AMQP)的开源消息代理中间件.消息队列是一种应用程序对应用程序的通行方式,应用程序通过写消息,将消息传递于队列,由另一应用程序读取 完成通信.而作为中间件的 RabbitMq 无疑是目前最流行的消息队列之一. ​ RabbitMq 应用场景广泛: 系统的高可用:日常生活当中各种商城秒杀,高流量,高并发的场景.当服务器接收到如此大量请求处理业务时,有宕机的风险.某些业务可能极其复杂,但这部分不是高时效性,不需要立即反馈给用户,我们可以将这部

随机推荐