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网络编程学习笔记(六):Web客户端访问
Jun 09 Python
Python Tkinter简单布局实例教程
Sep 03 Python
Python自动扫雷实现方法
Jul 25 Python
python 实时遍历日志文件
Apr 12 Python
Python中强大的命令行库click入门教程
Dec 26 Python
python ftp 按目录结构上传下载的实现代码
Sep 12 Python
对python的输出和输出格式详解
Dec 08 Python
Python列表常见操作详解(获取,增加,删除,修改,排序等)
Feb 18 Python
Flask框架中request、请求钩子、上下文用法分析
Jul 23 Python
python求平均数、方差、中位数的例子
Aug 22 Python
感知器基础原理及python实现过程详解
Sep 30 Python
wxPython窗体拆分布局基础组件
Nov 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使用mysqldump命令导出数据库
2015/04/14 PHP
关于Yii2框架跑脚本时内存泄漏问题的分析与解决
2019/12/01 PHP
Thinkphp 框架基础之源码获取、环境要求与目录结构分析
2020/04/27 PHP
W3C Group的JavaScript1.8 新特性介绍
2009/05/19 Javascript
JavaScript保留两位小数的2个自定义函数
2014/05/05 Javascript
基于NodeJS的前后端分离的思考与实践(三)轻量级的接口配置建模框架
2014/09/26 NodeJs
基于JavaScript代码实现pc与手机之间的跳转
2015/12/23 Javascript
Vue开发过程中遇到的疑惑知识点总结
2017/01/20 Javascript
js实现拖拽功能
2017/03/01 Javascript
canvas实现刮刮卡效果
2017/03/14 Javascript
Angular2实现组件交互的方法分析
2017/12/19 Javascript
js技巧之十几行的代码实现vue.watch代码
2018/06/09 Javascript
Vue中的作用域CSS和CSS模块的区别
2018/10/09 Javascript
怎样在vue项目下添加ESLint的方法
2019/05/16 Javascript
JS 实现发送短信验证码的“59秒后重新发送验证短信”功能
2019/08/23 Javascript
vue自定义指令实现仅支持输入数字和浮点型的示例
2019/10/30 Javascript
浅谈vuex的基本用法和mapaction传值问题
2019/11/08 Javascript
对Python中type打开文件的方式介绍
2018/04/28 Python
Python读写及备份oracle数据库操作示例
2018/05/17 Python
python上传时包含boundary时的解决方法
2020/04/08 Python
如何在 Matplotlib 中更改绘图背景的实现
2020/11/26 Python
IE滤镜与CSS3效果(详细整理分享)
2013/01/25 HTML / CSS
纯CSS3实现带动画效果导航菜单无需js
2013/09/27 HTML / CSS
Html5 canvas实现粒子时钟的示例代码
2018/09/06 HTML / CSS
世界上最大的乐器零售商:Guitar Center
2017/11/07 全球购物
方法名是否可以与构造器的名字相同
2012/06/04 面试题
编写函数,将一个3*3矩阵转置
2013/10/09 面试题
项目专员岗位职责
2013/12/04 职场文书
体育专业个人求职信范文
2013/12/27 职场文书
运动会解说词50字
2014/01/18 职场文书
销售员个人求职的自我评价
2014/02/10 职场文书
仓管员岗位责任制
2014/02/19 职场文书
法院干警四风问题个人对照检查材料思想汇报
2014/10/07 职场文书
写给汽车4S店的创业计划书,拿来即用!
2019/08/09 职场文书
导游词之吉林花园山
2019/10/17 职场文书
解决pycharm安装scrapy DLL load failed:找不到指定的程序的问题
2021/06/08 Python