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通过DOM和SAX方式解析XML的应用实例分享
Nov 16 Python
Python设置默认编码为utf8的方法
Jul 01 Python
使用pyecharts在jupyter notebook上绘图
Apr 23 Python
Python下载网络小说实例代码
Feb 03 Python
儿童学习python的一些小技巧
May 27 Python
Python  Django 母版和继承解析
Aug 09 Python
python科学计算之narray对象用法
Nov 25 Python
python读取Kafka实例
Dec 23 Python
Python实现隐马尔可夫模型的前向后向算法的示例代码
Dec 31 Python
推荐8款常用的Python GUI图形界面开发框架
Feb 23 Python
python 函数嵌套及多函数共同运行知识点讲解
Mar 03 Python
python 进阶学习之python装饰器小结
Sep 04 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
Ajax+PHP 边学边练之四 表单
2009/11/27 PHP
解析Ubuntu下crontab命令的用法
2013/06/24 PHP
yii2.0整合阿里云oss删除单个文件的方法
2017/09/19 PHP
判断用户的在线状态 onbeforeunload事件
2011/03/05 Javascript
浮动的div自适应居中显示的js代码
2013/12/23 Javascript
教你在heroku云平台上部署Node.js应用
2014/07/30 Javascript
轻松创建nodejs服务器(8):非阻塞是如何实现的
2014/12/18 NodeJs
js实现匹配时换色的输入提示特效代码
2015/08/17 Javascript
jquery实现漫天雪花飞舞的圣诞祝福雪花效果代码分享
2015/08/20 Javascript
js中获取时间new Date()的全面介绍
2016/06/20 Javascript
canvas实现爱心和彩虹雨效果
2017/03/09 Javascript
浅谈Koa2框架利用CORS完成跨域ajax请求
2018/03/06 Javascript
微信小程序使用component自定义toast弹窗效果
2018/11/27 Javascript
如何从零开始手写Koa2框架
2019/03/22 Javascript
JS实现网站吸顶条
2020/01/08 Javascript
vue使用微信扫一扫功能的实现代码
2020/04/11 Javascript
[02:03]风行者至宝清风环佩外观展示
2020/09/05 DOTA
web.py在模板中输出美元符号的方法
2014/08/26 Python
python使用socket远程连接错误处理方法
2015/04/29 Python
利用python在excel里面直接使用sql函数的方法
2019/02/08 Python
使用Flask-Cache缓存实现给Flask提速的方法详解
2019/06/11 Python
对python3中的RE(正则表达式)-详细总结
2019/07/23 Python
解决pyCharm中 module 调用失败的问题
2020/02/12 Python
python中tkinter窗口位置\坐标\大小等实现示例
2020/07/09 Python
详解Python中@staticmethod和@classmethod区别及使用示例代码
2020/12/14 Python
css3.0 图形构成实例练习二
2013/03/19 HTML / CSS
Joe Fresh官网:加拿大时尚品牌和零售连锁店
2016/11/30 全球购物
美国汽车轮胎和轮毂销售网站:Tire Rack
2018/01/11 全球购物
英国国家美术馆商店:National Gallery
2019/05/01 全球购物
Java中各种基本数据类型的默认值都是什么
2016/12/22 面试题
介绍一下Java中的static关键字
2012/05/12 面试题
销售会计工作职责
2013/12/02 职场文书
关于调整工作时间的通知
2015/04/24 职场文书
检讨书范文大全
2015/05/07 职场文书
五年级语文教学反思
2016/03/03 职场文书
vue2的 router在使用过程中遇到的一些问题
2022/04/13 Vue.js