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实现的文件夹清理程序分享
Nov 22 Python
理解Python垃圾回收机制
Feb 12 Python
python pandas 组内排序、单组排序、标号的实例
Apr 12 Python
Python读取YUV文件,并显示的方法
Dec 04 Python
Python格式化字符串f-string概览(小结)
Jun 18 Python
Python Django2.0集成Celery4.1教程
Nov 19 Python
Python有参函数使用代码实例
Jan 06 Python
Python 序列化和反序列化库 MarshMallow 的用法实例代码
Feb 25 Python
python3.6使用SMTP协议发送邮件
May 20 Python
30行Python代码实现高分辨率图像导航的方法
May 22 Python
python3.6.5基于kerberos认证的hive和hdfs连接调用方式
Jun 06 Python
解决python3.6用cx_Oracle库连接Oracle的问题
Dec 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
frename PHP 灵活文件命名函数 frename
2009/09/09 PHP
PHP的5个安全措施小结
2012/07/17 PHP
php基于数组函数实现关联表的编辑操作示例
2017/07/04 PHP
通过源码解析Laravel的依赖注入
2018/01/22 PHP
用javascript实现的支持lrc歌词的播放器
2007/05/17 Javascript
经典海量jQuery插件 大家可以收藏一下
2010/02/07 Javascript
高效率JavaScript编写技巧整理
2013/08/23 Javascript
JavaScript动态改变HTML页面元素例如添加或删除
2014/08/10 Javascript
javascript获取当前的时间戳的方法汇总
2015/07/26 Javascript
JavaScript数据库TaffyDB用法实例分析
2015/07/27 Javascript
JavaScript中的call方法和apply方法使用对比
2015/08/12 Javascript
总结JavaScript三种数据存储方式之间的区别
2016/05/03 Javascript
jQuery+Ajax+PHP弹出层异步登录效果(附源码下载)
2016/05/27 Javascript
Google 地图类型详解及示例代码
2016/08/06 Javascript
jQuery实现导航滚动到指定内容效果完整实例【附demo源码下载】
2016/09/20 Javascript
jQuery鼠标事件总结
2016/10/13 Javascript
jQuery.form.js插件不能解决连接超时(timeout)的原因分析及解决方法
2016/10/14 Javascript
JS表格组件神器bootstrap table使用指南详解
2017/04/12 Javascript
Vue 实现从小到大的横向滑动效果详解
2019/10/16 Javascript
Python 3.x读写csv文件中数字的方法示例
2017/08/29 Python
Python numpy实现二维数组和一维数组拼接的方法
2018/06/05 Python
python关于变量名的基础知识点
2020/03/03 Python
python实现简易版学生成绩管理系统
2020/06/22 Python
Django中F函数的使用示例代码详解
2020/07/06 Python
Python日志打印里logging.getLogger源码分析详解
2021/01/17 Python
详解CSS中iconfont的使用
2015/08/04 HTML / CSS
浅谈基于HTML5的在线视频播放方案
2016/02/18 HTML / CSS
史蒂夫·马登加拿大官网:Steve Madden加拿大
2017/11/18 全球购物
LivingSocial英国:英国本地优惠
2019/02/22 全球购物
LN-CC日本:高端男装和女装的奢侈时尚目的地
2019/09/01 全球购物
英国购买威士忌网站:Master of Malt
2019/09/26 全球购物
信息管理应届生求职信
2014/03/07 职场文书
校园新闻广播稿5篇
2014/10/10 职场文书
2015年妇联工作总结范文
2015/04/22 职场文书
《梅花魂》教学反思
2016/02/18 职场文书
Python接口自动化之文件上传/下载接口详解
2022/04/05 Python