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 遍历列表里面序号和值的方法(三种)
Feb 17 Python
Python基于time模块求程序运行时间的方法
Sep 18 Python
numpy中实现ndarray数组返回符合特定条件的索引方法
Apr 17 Python
Python使用tkinter库实现文本显示用户输入功能示例
May 30 Python
python中plot实现即时数据动态显示方法
Jun 22 Python
python 获取图片分辨率的方法
Jan 08 Python
spark dataframe 将一列展开,把该列所有值都变成新列的方法
Jan 29 Python
Python的条件锁与事件共享详解
Sep 12 Python
基于Django统计博客文章阅读量
Oct 29 Python
python不使用for计算两组、多个矩形两两间的iou方式
Jan 18 Python
python_array[0][0]与array[0,0]的区别详解
Feb 18 Python
通过实例解析Python文件操作实现步骤
Sep 21 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获取网页内容方法总结
2008/12/04 PHP
php图片加中文水印实现代码分享
2012/10/31 PHP
学习php设计模式 php实现建造者模式
2015/12/07 PHP
php ci 获取表单中多个同名input元素值的代码
2016/03/25 PHP
利用PHP判断是手机移动端还是PC端访问的函数示例
2017/12/14 PHP
PHP+Oracle本地开发环境搭建方法详解
2019/04/01 PHP
Jquery 复选框取值兼容FF和IE8(测试有效)
2013/10/29 Javascript
简单的js图片轮换代码(js图片轮播)
2014/05/06 Javascript
node.js中实现同步操作的3种实现方法
2014/12/05 Javascript
JS基于面向对象实现的放烟花效果
2015/05/07 Javascript
js实现拖拽效果(构造函数)
2015/12/14 Javascript
js+canvas绘制五角星的方法
2016/01/28 Javascript
基于jquery实现最简单的选项卡切换效果
2016/05/08 Javascript
js判断出两个字符串最大子串的函数实现方法
2016/11/01 Javascript
jQuery自定义组件(导入组件)
2016/11/08 Javascript
Three.js加载外部模型的教程详解
2017/11/10 Javascript
详解如何使用 vue-cli 开发多页应用
2017/12/16 Javascript
vue使用xe-utils函数库的具体方法
2018/03/06 Javascript
解决vue同一slot在组件中渲染多次的问题
2018/09/06 Javascript
微信小程序wx.request的简单封装
2019/11/13 Javascript
Python实现按特定格式对文件进行读写的方法示例
2017/11/30 Python
使用pandas读取csv文件的指定列方法
2018/04/21 Python
python dict 相同key 合并value的实例
2019/01/21 Python
Python利用字典破解WIFI密码的方法
2019/02/27 Python
详解python3安装pillow后报错没有pillow模块以及没有PIL模块问题解决
2019/04/17 Python
Django 响应数据response的返回源码详解
2019/08/06 Python
Python 字节流,字符串,十六进制相互转换实例(binascii,bytes)
2020/05/11 Python
Python datetime模块的使用示例
2021/02/02 Python
意大利制造的男鞋和女鞋:SCAROSSO
2018/03/07 全球购物
加拿大时尚潮流大码女装购物网站:Addition Elle
2018/04/02 全球购物
亚洲领先的设计购物网站:Pinkoi
2020/11/26 全球购物
Linux Interview Questions For software testers
2013/05/17 面试题
参观接待方案
2014/03/17 职场文书
2016年世界人口日宣传活动总结
2016/04/05 职场文书
《家世》读后感:看家训的力量
2019/12/30 职场文书
利用Python实时获取steam特惠游戏数据
2022/06/25 Python