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的keyword模块用法实例分析
Jun 30 Python
使用Django的模版来配合字符串翻译工作
Jul 27 Python
Python tkinter模块弹出窗口及传值回到主窗口操作详解
Jul 28 Python
Python编程argparse入门浅析
Feb 07 Python
python判断列表的连续数字范围并分块的方法
Nov 16 Python
pyqt5利用pyqtDesigner实现登录界面
Mar 28 Python
浅析PyTorch中nn.Module的使用
Aug 18 Python
使用python无账号无限制获取企查查信息的实例代码
Apr 17 Python
python设置中文界面实例方法
Oct 27 Python
基于Python中Remove函数的用法讨论
Dec 11 Python
Python类型转换的魔术方法详解
Dec 23 Python
pytorch分类模型绘制混淆矩阵以及可视化详解
Apr 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
基于mysql的bbs设计(三)
2006/10/09 PHP
phpMyAdmin 安装教程全攻略
2007/03/19 PHP
PHP 加密解密内部算法
2010/04/22 PHP
php imagecreatetruecolor 创建高清和透明图片代码小结
2010/05/15 PHP
php XMLWriter类的简单示例代码(RSS输出)
2011/09/30 PHP
分享php邮件管理器源码
2016/01/06 PHP
WordPress后台中实现图片上传功能的实例讲解
2016/01/11 PHP
Yii2框架实现登录、退出及自动登录功能的方法详解
2017/10/24 PHP
浅谈PHP中如何实现Hook机制
2017/11/14 PHP
Javascript 面向对象 重载
2010/05/13 Javascript
jQuery在IE下使用未闭合的xml代码创建元素时的Bug介绍
2012/01/10 Javascript
编写js扩展方法判断一个数组中是否包含某个元素
2013/11/08 Javascript
js和jquery中循环的退出和继续下一个循环
2014/09/03 Javascript
JS往数组中添加项性能分析
2015/02/25 Javascript
js实现格式化金额,字符,时间的方法
2015/02/26 Javascript
javascript实时获取鼠标坐标值并显示的方法
2015/04/30 Javascript
Extjs 点击复选框在表格中增加相关信息行
2016/07/12 Javascript
js实现数组和对象的深浅拷贝
2017/09/30 Javascript
深入分析element ScrollBar滚动组件源码
2019/01/22 Javascript
vue 框架下自定义滚动条(easyscroll)实现方法
2019/08/29 Javascript
ES6实现图片切换特效代码
2020/01/14 Javascript
[01:28:44]DOTA2-DPC中国联赛定级赛 RNG vs iG BO3第一场 1月10日
2021/03/11 DOTA
python正则表达式re模块详细介绍
2014/05/29 Python
Python二分查找详解
2015/09/13 Python
matplotlib简介,安装和简单实例代码
2017/12/26 Python
django的登录注册系统的示例代码
2018/05/14 Python
python实现指定字符串补全空格、前面填充0的方法
2018/11/16 Python
python sorted方法和列表使用解析
2019/11/18 Python
Tensorflow tf.dynamic_partition矩阵拆分示例(Python3)
2020/02/07 Python
如何使用Python发送HTML格式的邮件
2020/02/11 Python
html5时钟实现代码
2010/10/22 HTML / CSS
HTML5自定义属性前缀data-及dataset的使用方法(html5 新特性)
2017/08/24 HTML / CSS
Trina Turk官网:美国时装和泳装品牌
2018/06/10 全球购物
优秀团员事迹材料
2014/12/25 职场文书
建筑工地资料员岗位职责
2015/04/13 职场文书
《英雄联盟》2022日蚀、月蚀皮肤演示 黑潮亚索曝光
2022/04/13 其他游戏