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中的random()方法的使用介绍
May 15 Python
python实现12306火车票查询器
Apr 20 Python
关于python列表增加元素的三种操作方法
Aug 22 Python
在python tkinter中Canvas实现进度条显示的方法
Jun 14 Python
python实现一行输入多个值和一行输出多个值的例子
Jul 16 Python
在pytorch中为Module和Tensor指定GPU的例子
Aug 19 Python
Tensorflow中tf.ConfigProto()的用法详解
Feb 06 Python
python如何利用paramiko执行服务器命令
Nov 07 Python
Django REST Framework 分页(Pagination)详解
Nov 30 Python
python中的时区问题
Jan 14 Python
Python基础之hashlib模块详解
May 06 Python
分享python函数常见关键字
Apr 26 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 常用算法和时间复杂度
2013/07/01 PHP
php中输出json对象的值(实现方法)
2018/03/07 PHP
详解PHP 7.4 中数组延展操作符语法知识点
2019/07/19 PHP
javascript Split方法,indexOf方法、lastIndexOf 方法和substring 方法
2009/03/21 Javascript
Javascript 代码也可以变得优美的实现方法
2009/06/22 Javascript
解决Jquery向页面append新元素之后事件的绑定问题
2015/03/16 Javascript
浅谈Javascript数组索引
2015/07/29 Javascript
js实现点击向下展开的下拉菜单效果代码
2015/09/01 Javascript
JS简单实现点击复制链接的方法
2016/08/03 Javascript
使用bootstrap实现多窗口和拖动效果
2016/09/22 Javascript
JS定时检测任务任务完成后执行下一步的解决办法
2016/12/22 Javascript
解决Vue.js由于延时显示了{{message}}引用界面的问题
2018/08/25 Javascript
Vue弹出菜单功能的实现代码
2018/09/12 Javascript
使用ng-packagr打包Angular的方法示例
2018/09/21 Javascript
vuex 解决报错this.$store.commit is not a function的方法
2018/12/17 Javascript
vue实现编辑器键盘抬起时内容跟随光标距顶位置向上滚动效果
2020/05/28 Javascript
vue watch监控对象的简单方法示例
2021/01/07 Vue.js
[01:50:49]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster BO3 第三场 1月24日
2021/03/11 DOTA
让python的Cookie.py模块支持冒号做key的方法
2010/12/28 Python
kNN算法python实现和简单数字识别的方法
2014/11/18 Python
python 接口_从协议到抽象基类详解
2017/08/24 Python
rabbitmq(中间消息代理)在python中的使用详解
2017/12/14 Python
django输出html内容的实例
2018/05/27 Python
python 用for循环实现1~n求和的实例
2019/02/01 Python
基于Python解密仿射密码
2019/10/21 Python
python多进程 主进程和子进程间共享和不共享全局变量实例
2020/04/25 Python
Python 实现PS滤镜的旋涡特效
2020/12/03 Python
HTML5是否真的可以取代Flash
2010/02/10 HTML / CSS
全球知名巧克力品牌:Godiva
2016/07/22 全球购物
运动会开幕式邀请函
2014/02/03 职场文书
《桃花心木》教学反思
2014/02/17 职场文书
工程承包协议书
2014/04/22 职场文书
拾金不昧表扬信
2015/01/16 职场文书
出国留学英文自荐信
2015/03/25 职场文书
教师师德承诺书2016
2016/03/25 职场文书
「租借女友」第2季樱泽墨角色PV&新视觉图公开
2022/03/21 日漫