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中join和split用法实例
Apr 14 Python
CentOS中使用virtualenv搭建python3环境
Jun 08 Python
Python3实现Web网页图片下载
Jan 28 Python
对python3 urllib包与http包的使用详解
May 10 Python
python 读取鼠标点击坐标的实例
Dec 29 Python
python实现超市商品销售管理系统
Oct 25 Python
python小程序之4名牌手洗牌发牌问题解析
May 15 Python
python和JavaScript哪个容易上手
Jun 23 Python
django haystack实现全文检索的示例代码
Jun 24 Python
Python定义一个Actor任务
Jul 29 Python
python处理写入数据代码讲解
Oct 22 Python
Python实现简单的俄罗斯方块游戏
Sep 25 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 多进程 解决难题
2009/06/22 PHP
PHP static局部静态变量和全局静态变量总结
2014/03/02 PHP
ThinkPHP内置jsonRPC的缺陷分析
2014/12/18 PHP
Zend Framework+smarty用法实例详解
2016/03/19 PHP
(仅IE下有效)关于checkbox 三态
2007/05/12 Javascript
javascript获取当前日期时间及其它操作函数
2011/01/11 Javascript
jquery ready(fn)事件使用介绍
2013/08/21 Javascript
js中Math之random,round,ceil,floor的用法总结
2013/12/26 Javascript
js实现的复制兼容chrome和IE
2014/04/03 Javascript
一个获取第n个元素节点的js函数
2014/09/02 Javascript
Javscript调用iframe框架页面中函数的方法
2014/11/01 Javascript
javascript实现省市区三级联动下拉框菜单
2015/11/17 Javascript
js生成随机数(指定范围)的实例代码
2016/07/10 Javascript
JSON与String互转的实现方法(Javascript)
2016/09/27 Javascript
js+html5实现半透明遮罩层弹框效果
2020/08/24 Javascript
bootstrap modal+gridview实现弹出框效果
2017/08/15 Javascript
vue点击按钮动态创建与删除组件功能
2019/12/29 Javascript
[46:00]Ti4 冒泡赛第二轮LGD vs C9 2
2014/07/14 DOTA
[02:38]2018DOTA2亚洲邀请赛赛前采访-VGJ.T
2018/04/03 DOTA
Python过滤函数filter()使用自定义函数过滤序列实例
2014/08/26 Python
利用python爬取软考试题之ip自动代理
2017/03/28 Python
python爬虫中get和post方法介绍以及cookie作用
2018/02/08 Python
python实现画五角星和螺旋线的示例
2019/01/20 Python
详解js文件通过python访问数据库方法
2019/03/03 Python
解决python 文本过滤和清理问题
2019/08/28 Python
python实现文件的分割与合并
2019/08/29 Python
TensorFlow 读取CSV数据的实例
2020/02/05 Python
使用Python Tkinter实现剪刀石头布小游戏功能
2020/10/23 Python
使用HTML5技术开发一个属于自己的超酷颜色选择器
2013/09/22 HTML / CSS
美国瑜伽品牌:Gaiam
2017/10/31 全球购物
会计学生自我鉴定
2014/02/06 职场文书
2015年母亲节活动总结
2015/02/10 职场文书
2015年社区卫生工作总结
2015/04/21 职场文书
《怀念母亲》教学反思
2016/02/19 职场文书
Python天气语音播报小助手
2021/09/25 Python
nginx location 带斜杠【 / 】与不带的区别
2022/04/13 Servers