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实现的一个p2p文件传输实例
Jun 04 Python
github配置使用指南
Nov 18 Python
Python文件及目录操作实例详解
Jun 04 Python
python实现对excel进行数据剔除操作实例
Dec 07 Python
linux下安装python3和对应的pip环境教程详解
Jul 01 Python
Django之创建引擎索引报错及解决详解
Jul 17 Python
用Pytorch训练CNN(数据集MNIST,使用GPU的方法)
Aug 19 Python
基于Tensorflow的MNIST手写数字识别分类
Jun 17 Python
Keras SGD 随机梯度下降优化器参数设置方式
Jun 19 Python
Keras实现DenseNet结构操作
Jul 06 Python
PyCharm 光标变成黑块的解决方式
Feb 06 Python
python中@contextmanager实例用法
Feb 07 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中使用TCPDF生成PDF文档实例
2014/07/01 PHP
PHP的switch判断语句的“高级”用法详解
2014/10/01 PHP
解析arp病毒背后利用的Javascript技术附解密方法
2007/08/06 Javascript
js 鼠标拖动对象 可让任何div实现拖动效果
2009/11/09 Javascript
在页面上用action传递参数到后台出现乱码的解决方法
2013/12/31 Javascript
JavaScript中原型和原型链详解
2015/02/11 Javascript
JavaScript实现广告的关闭与显示效果实例
2015/07/02 Javascript
jQuery实现可编辑的表格实例讲解(2)
2015/09/17 Javascript
jQuery Validate表单验证插件 添加class属性形式的校验
2016/01/18 Javascript
Bootstrap对话框使用实例讲解
2016/09/24 Javascript
第一次接触神奇的Bootstrap
2016/10/14 Javascript
Canvas 制作动态进度加载水球详解及实例代码
2016/12/09 Javascript
Node.js使用NodeMailer发送邮件实例代码
2017/03/06 Javascript
JS简单获取当前日期时间的方法(如:2017-03-29 11:41:10 星期四)
2017/03/29 Javascript
可能被忽略的一些JavaScript数组方法细节
2019/02/28 Javascript
基于Node的Axure文件在线预览的实现代码
2019/08/28 Javascript
简单分析js中的this的原理
2019/08/31 Javascript
Angular单元测试之事件触发的实现
2020/01/20 Javascript
在VUE style中使用data中的变量的方法
2020/06/19 Javascript
[40:13]Ti4 冒泡赛第二天 iG vs NEWBEE 2
2014/07/15 DOTA
python subprocess 杀掉全部派生的子进程方法
2017/01/16 Python
Python八大常见排序算法定义、实现及时间消耗效率分析
2018/04/27 Python
Django在pycharm下修改默认启动端口的方法
2019/07/26 Python
Windows10下Tensorflow2.0 安装及环境配置教程(图文)
2019/11/21 Python
Python图片的横坐标汉字实例
2019/12/04 Python
python matplotlib:plt.scatter() 大小和颜色参数详解
2020/04/14 Python
jupyter notebook运行命令显示[*](解决办法)
2020/05/18 Python
python3 os进行嵌套操作的实例讲解
2020/11/19 Python
北美三大旅游网站之一:Travelocity
2017/08/12 全球购物
英国街头品牌:Bee Inspired Clothing
2018/02/12 全球购物
瑞士领先的网上超市:LeShop.ch
2018/11/14 全球购物
HashMap和Hashtable的区别
2013/05/18 面试题
建材业务员岗位职责
2013/12/08 职场文书
幼儿园小班评语大全
2014/04/17 职场文书
2014年财政所工作总结
2014/11/22 职场文书
ant design charts 获取后端接口数据展示
2022/05/25 Javascript