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 06 Python
用python写asp详细讲解
Dec 16 Python
Python实现字典的key和values的交换
Aug 04 Python
火车票抢票python代码公开揭秘!
Mar 08 Python
解决pip install的时候报错timed out的问题
Jun 12 Python
mac 安装python网络请求包requests方法
Jun 13 Python
python内置模块collections知识点总结
Dec 19 Python
django数据模型(Model)的字段类型解析
Dec 25 Python
python读取多层嵌套文件夹中的文件实例
Feb 27 Python
浅谈Python3中print函数的换行
Aug 05 Python
python调试工具Birdseye的使用教程
May 25 Python
matplotlib如何设置坐标轴刻度的个数及标签的方法总结
Jun 11 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中的按位与和按位或操作示例
2014/01/27 PHP
php使用百度翻译api示例分享
2014/01/31 PHP
PHP使用CURL实现对带有验证码的网站进行模拟登录的方法
2014/07/23 PHP
laravel5实现微信第三方登录功能
2018/12/06 PHP
浅谈PHP中的Trait使用方法
2019/03/22 PHP
jQuery 位置插件
2008/12/25 Javascript
jQuery select控制插件
2009/08/17 Javascript
javascript 动态修改样式和层叠样式表代码
2010/04/27 Javascript
Javascript 八进制转义字符(8进制)
2011/04/08 Javascript
在Javascript中处理字符串之big()方法的使用
2015/06/08 Javascript
解决angular的post请求后SpringMVC后台接收不到参数值问题的方法
2015/12/10 Javascript
基于BootStrap Metronic开发框架经验小结【八】框架功能总体界面介绍
2016/05/12 Javascript
JS 对java返回的json格式的数据处理方法
2016/12/05 Javascript
json的结构与遍历方法实例分析
2017/04/25 Javascript
React Js 微信禁止复制链接分享禁止隐藏右上角菜单功能
2017/05/26 Javascript
jQuery 表单序列化实例代码
2017/06/11 jQuery
jQuery实现的简单图片轮播效果完整示例
2018/02/08 jQuery
mock.js实现模拟生成假数据功能示例
2019/01/15 Javascript
一秒学会微信小程序制作table表格
2019/02/14 Javascript
Bootstarp在pycharm中的安装及简单的使用方法
2019/04/19 Javascript
vue中更改数组中属性,在页面中不生效的解决方法
2019/10/30 Javascript
vue-resource post数据时碰到Django csrf问题的解决
2020/03/13 Javascript
写给新手同学的vuex快速上手指北小结
2020/04/14 Javascript
jquery更改元素属性attr()方法操作示例
2020/05/22 jQuery
基于python求两个列表的并集.交集.差集
2020/02/10 Python
详解利用css3的var()实现运行时改变scss的变量值
2021/03/02 HTML / CSS
HTML5 新标签全部总汇(推荐)
2016/06/13 HTML / CSS
阿里巴巴美国:Alibaba美国
2019/11/24 全球购物
上海微创软件面试题
2012/06/14 面试题
集团公司人力资源部岗位职责
2014/01/03 职场文书
思想品德自我评价
2014/02/04 职场文书
C++程序员求职信
2014/05/07 职场文书
省级青年文明号申报材料
2014/05/23 职场文书
2016年小学六一儿童节活动总结
2016/04/06 职场文书
自制短波长线天线频率预选器 - 成功消除B2K之流的镜像
2021/04/22 无线电
Vue过滤器(filter)实现及应用场景详解
2021/06/15 Vue.js