python画出三角形外接圆和内切圆的方法


Posted in Python onJanuary 25, 2018

刚看了《最强大脑》中英对决,其中难度最大的项目需要选手先脑补泰森多边形,再找出完全相同的两个泰森多边形。在惊呆且感叹自身头脑愚笨的同时,不免手痒想要借助电脑弄个图出来看看,闲来无事吹吹牛也是极好的。

今天先来画画外接圆和内切圆,留个大坑后面来填。

外接圆圆心:三角形垂直平分线的交点。
内切圆圆心:三角形角平分线的交点。

有了思路,就可以用万能的python来计算了

import matplotlib.pyplot as plt
from scipy.linalg import solve
import numpy as np
from matplotlib.patches import Circle

'''
求三角形外接圆和内切圆
'''
# 画个三角形
def plot_triangle(A, B, C):
  x = [A[0], B[0], C[0], A[0]]
  y = [A[1], B[1], C[1], A[1]]

  ax = plt.gca()
  ax.plot(x, y, linewidth=2)

# 画个圆
def draw_circle(x, y, r):
  ax = plt.gca()
  cir = Circle(xy=(x, y), radius=r, alpha=0.5)
  ax.add_patch(cir)
  ax.plot()

# 外接圆
def get_outer_circle(A, B, C):
  xa, ya = A[0], A[1]
  xb, yb = B[0], B[1]
  xc, yc = C[0], C[1]

  # 两条边的中点
  x1, y1 = (xa + xb) / 2.0, (ya + yb) / 2.0
  x2, y2 = (xb + xc) / 2.0, (yb + yc) / 2.0

  # 两条线的斜率
  ka = (yb - ya) / (xb - xa) if xb != xa else None
  kb = (yc - yb) / (xc - xb) if xc != xb else None

  alpha = np.arctan(ka) if ka != None else np.pi / 2
  beta = np.arctan(kb) if kb != None else np.pi / 2

  # 两条垂直平分线的斜率
  k1 = np.tan(alpha + np.pi / 2)
  k2 = np.tan(beta + np.pi / 2)

  # 圆心
  y, x = solve([[1.0, -k1], [1.0, -k2]], [y1 - k1 * x1, y2 - k2 * x2])
  # 半径
  r1 = np.sqrt((x - xa)**2 + (y - ya)**2)

  return(x, y, r1)

# 内切圆
def get_inner_circle(A, B, C):
  xa, ya = A[0], A[1]
  xb, yb = B[0], B[1]
  xc, yc = C[0], C[1]

  ka = (yb - ya) / (xb - xa) if xb != xa else None
  kb = (yc - yb) / (xc - xb) if xc != xb else None

  alpha = np.arctan(ka) if ka != None else np.pi / 2
  beta = np.arctan(kb) if kb != None else np.pi / 2

  a = np.sqrt((xb - xc)**2 + (yb - yc)**2)
  b = np.sqrt((xa - xc)**2 + (ya - yc)**2)
  c = np.sqrt((xa - xb)**2 + (ya - yb)**2)

  ang_a = np.arccos((b**2 + c**2 - a**2) / (2 * b * c))
  ang_b = np.arccos((a**2 + c**2 - b**2) / (2 * a * c))

  # 两条角平分线的斜率
  k1 = np.tan(alpha + ang_a / 2)
  k2 = np.tan(beta + ang_b / 2)
  kv = np.tan(alpha + np.pi / 2)

  # 求圆心
  y, x = solve([[1.0, -k1], [1.0, -k2]], [ya - k1 * xa, yb - k2 * xb])
  ym, xm = solve([[1.0, -ka], [1.0, -kv]], [ya - ka * xa, y - kv * x])
  r1 = np.sqrt((x - xm)**2 + (y - ym)**2)

  return(x, y, r1)

if __name__ == '__main__':
  A = (1., 1.)
  B = (5., 2.)
  C = (5., 5.)

  plt.axis('equal')
  plt.axis('off')
  plot_triangle(A, B, C)

  x, y, r1 = get_outer_circle(A, B, C)
  plt.plot(x, y, 'ro')
  draw_circle(x, y, r1)

  x_inner, y_inner, r_inner = get_inner_circle(A, B, C)
  plt.plot(x_inner, y_inner, 'ro')
  draw_circle(x_inner, y_inner, r_inner)

  plt.show()

下面看看两个三角形的结果:

python画出三角形外接圆和内切圆的方法

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中defaultdict的用法详解
Jun 07 Python
Django rest framework基本介绍与代码示例
Jan 26 Python
详解python实现线程安全的单例模式
Mar 05 Python
python 读取txt,json和hdf5文件的实例
Jun 05 Python
Python使用一行代码获取上个月是几月
Aug 30 Python
python存储16bit和32bit图像的实例
Dec 05 Python
pytorch对可变长度序列的处理方法详解
Dec 08 Python
Python类继承和多态原理解析
Feb 05 Python
Python实现名片管理系统
Feb 14 Python
Python实现猜年龄游戏代码实例
Mar 25 Python
Python SQLAlchemy库的使用方法
Oct 13 Python
python time()的实例用法
Nov 03 Python
Python实现批量压缩图片
Jan 25 #Python
python生成圆形图片的方法
Mar 25 #Python
scrapy spider的几种爬取方式实例代码
Jan 25 #Python
scrapy爬虫完整实例
Jan 25 #Python
python实现画圆功能
Jan 25 #Python
Python中常用信号signal类型实例
Jan 25 #Python
简单实现python画圆功能
Jan 25 #Python
You might like
php学习笔记 数组遍历实现代码
2011/06/09 PHP
使用Apache的htaccess防止图片被盗链的解决方法
2013/04/27 PHP
PHPThumb图片处理实例
2014/05/03 PHP
PHP判断网络文件是否存在的方法
2015/03/12 PHP
YII动态模型(动态表名)支持分析
2016/03/29 PHP
PHP AjaxForm提交图片上传并显示图片源码
2016/11/29 PHP
jQuery autocomplete插件修改
2009/04/17 Javascript
用JQuery 实现AJAX加载XML并解析的脚本
2009/07/25 Javascript
js 效率组装字符串 StringBuffer
2009/12/23 Javascript
JQuery index()方法使用代码
2010/06/02 Javascript
离开页面时检测表单元素是否被修改,提示保存的js代码
2010/08/25 Javascript
JQuery 传送中文乱码问题的简单解决办法
2016/05/24 Javascript
第二篇Bootstrap起步
2016/06/21 Javascript
JavaScript学习总结之正则的元字符和一些简单的应用
2017/06/30 Javascript
JavaScript链式调用实例浅析
2018/12/19 Javascript
JavaScript数据结构与算法之检索算法实例分析【顺序查找、最大最小值、自组织查询】
2019/02/22 Javascript
详解在HTTPS 项目中使用百度地图 API
2019/04/26 Javascript
vue父子组件的通信方法(实例详解)
2019/11/10 Javascript
基于javascript canvas实现五子棋游戏
2020/07/08 Javascript
[54:29]2018DOTA2亚洲邀请赛 4.7 淘汰赛 VP vs LGD 第二场
2018/04/09 DOTA
在Python编程过程中用单元测试法调试代码的介绍
2015/04/02 Python
Python实现字典依据value排序
2016/02/24 Python
python实现简单登陆流程的方法
2018/04/22 Python
PyQT实现菜单中的复制,全选和清空的功能的方法
2019/06/17 Python
python如何将多个PDF进行合并
2019/08/13 Python
python实现复制大量文件功能
2019/08/31 Python
tensorflow从ckpt和从.pb文件读取变量的值方式
2020/05/26 Python
Python日志打印里logging.getLogger源码分析详解
2021/01/17 Python
Hotels.com加拿大:领先的在线住宿网站
2018/10/05 全球购物
ruby如何进行集成操作?Ruby能进行多重继承吗?
2013/10/16 面试题
师说教学反思
2014/02/07 职场文书
羽毛球社团活动总结
2014/06/27 职场文书
2015年网络管理员工作总结
2015/05/21 职场文书
详解分布式系统中如何用python实现Paxos
2021/05/18 Python
Python道路车道线检测的实现
2021/06/27 Python
mysql sum(if())和count(if())的用法说明
2022/01/18 MySQL