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实现详解
Dec 15 Python
理解python中生成器用法
Dec 20 Python
朴素贝叶斯Python实例及解析
Nov 19 Python
python与字符编码问题
May 24 Python
python pytest进阶之conftest.py详解
Jun 27 Python
Python使用sklearn实现的各种回归算法示例
Jul 04 Python
Python中的单下划线和双下划线使用场景详解
Sep 09 Python
Python with语句和过程抽取思想
Dec 23 Python
Pytorch框架实现mnist手写库识别(与tensorflow对比)
Jul 20 Python
Python爬取12306车次信息代码详解
Aug 12 Python
Expected conditions模块使用方法汇总代码解析
Aug 13 Python
一文详述 Python 中的 property 语法
Sep 01 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
PHP4实际应用经验篇(8)
2006/10/09 PHP
php实现12306余票查询、价格查询示例
2014/04/17 PHP
php封装json通信接口详解及实例
2017/03/07 PHP
PHP内存溢出优化代码详解
2021/02/26 PHP
PHP常用字符串输出方法分析(echo,print,printf及sprintf)
2021/03/09 PHP
jQuery ctrl+Enter shift+Enter实现代码
2010/02/07 Javascript
用javascript模仿ie的自动完成类似自动完成功的表单
2012/12/12 Javascript
给事件响应函数传参数的四种方式小结
2013/12/05 Javascript
Javascript四舍五入Math.round()与Math.pow()使用介绍
2013/12/27 Javascript
js函数在frame中的相互调用详解
2014/03/03 Javascript
jquery跟js初始化加载的多种方法及区别介绍
2014/04/02 Javascript
Jquery仿IGoogle实现可拖动窗口示例代码
2014/08/22 Javascript
JavaScript导航脚本判断当前导航
2016/07/12 Javascript
Angular2安装angular-cli
2017/05/21 Javascript
javascript将list转换成树状结构的实例
2017/09/08 Javascript
浅谈在vue中用webpack打包之后运行文件的问题以及相关配置方法
2018/02/21 Javascript
微信小程序实现基于三元运算验证手机号/姓名功能示例
2019/01/19 Javascript
easyUI使用分页过滤器对数据进行分页操作实例分析
2020/06/01 Javascript
在Python中操作列表之list.extend()方法的使用
2015/05/20 Python
jupyter安装小结
2016/03/13 Python
django admin添加数据自动记录user到表中的实现方法
2018/01/05 Python
Python+tkinter使用80行代码实现一个计算器实例
2018/01/16 Python
pandas中的ExcelWriter和ExcelFile的实现方法
2020/04/24 Python
python实现发送带附件的邮件代码分享
2020/09/22 Python
python实现一个简单RPC框架的示例
2020/10/28 Python
解决margin 外边距合并问题
2019/07/03 HTML / CSS
美国领先的奢侈手表在线零售商:WatchMaxx
2017/12/17 全球购物
澳大利亚制造的蜡烛和扩散器:Glasshouse Fragrances
2018/05/20 全球购物
超市营业员求职简历的自我评价
2013/10/17 职场文书
财政局长自荐信范文
2013/12/22 职场文书
一岗双责责任书
2014/04/15 职场文书
新闻编辑求职信
2014/07/13 职场文书
学生实习证明模板汇总
2014/09/25 职场文书
淘宝文案策划岗位职责
2015/04/14 职场文书
暑期辅导班宣传单
2015/07/14 职场文书
JavaWeb Servlet实现网页登录功能
2021/07/04 Java/Android