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保存MongoDB上的文件到本地的方法
Mar 16 Python
PyCharm 创建指定版本的 Django(超详图解教程)
Jun 18 Python
win10子系统python开发环境准备及kenlm和nltk的使用教程
Oct 14 Python
python打印直角三角形与等腰三角形实例代码
Oct 20 Python
python 变量初始化空列表的例子
Nov 28 Python
Python绘制三角函数图(sin\cos\tan)并标注特定范围的例子
Dec 04 Python
Pandas 解决dataframe的一列进行向下顺移问题
Dec 27 Python
浅谈matplotlib.pyplot与axes的关系
Mar 06 Python
django的模型类管理器——数据库操作的封装详解
Apr 01 Python
Python3基于print打印带颜色字符串
Jul 06 Python
python3中布局背景颜色代码分析
Dec 01 Python
python 高阶函数简单介绍
Feb 19 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/12/08 PHP
php字符编码转换之gb2312转为utf8
2013/10/28 PHP
PHP获取文件夹内文件数的方法
2015/03/12 PHP
php递归实现无限分类的方法
2015/07/28 PHP
PHP 开发者该知道的 5 个 Composer 小技巧
2016/02/03 PHP
php ajax异步读取rss文档数据
2016/03/29 PHP
php根据命令行参数生成配置文件详解
2019/03/15 PHP
非常不错的功能强大代码简单的管理菜单美化版
2008/07/09 Javascript
php图像生成函数之间的区别分析
2012/12/06 Javascript
JavaScript中使用document.write向页面输出内容实例
2014/10/16 Javascript
js创建对象的方法汇总
2016/01/07 Javascript
jQuery实现ajax无刷新分页页码控件
2017/02/28 Javascript
微信小程序 开发MAP(地图)实例详解
2017/06/27 Javascript
AngularJS select设置默认值的实现方法
2017/08/25 Javascript
解决layui表格内文本超出隐藏的问题
2019/09/12 Javascript
vue实现div单选多选功能
2020/07/16 Javascript
python使用fileinput模块实现逐行读取文件的方法
2015/04/29 Python
Python实现的递归神经网络简单示例
2017/08/11 Python
python绘制热力图heatmap
2020/03/23 Python
Python网页解析器使用实例详解
2020/05/30 Python
使用CSS3的rem属性制作响应式页面布局的要点解析
2016/05/24 HTML / CSS
css3 transform属性详解
2014/09/30 HTML / CSS
世界上最大的汽车共享网站:Zipcar
2017/01/14 全球购物
印尼最大的婴儿用品购物网站:Orami
2017/09/28 全球购物
澳大利亚玩具剧场:Toy Playhouse
2019/03/03 全球购物
MAC彩妆澳洲官网:M·A·C AU
2021/01/17 全球购物
JAVA代码查错题
2014/10/10 面试题
SQL面试题
2013/04/30 面试题
考察现实表现材料
2014/05/19 职场文书
校庆口号
2014/06/20 职场文书
中学生运动会通讯稿大全
2014/09/18 职场文书
银行委托书范本
2014/09/28 职场文书
银行服务理念口号
2015/12/25 职场文书
用Python可视化新冠疫情数据
2022/01/18 Python
vue 自定义的组件绑定点击事件
2022/04/21 Vue.js
python blinker 信号库
2022/05/04 Python