首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python从四点创建一个椭圆

Python从四点创建一个椭圆
EN

Stack Overflow用户
提问于 2020-08-26 17:04:20
回答 1查看 803关注 0票数 1

我试图做一个非常基本的形状连接4点。我现在有一个看起来像的情节。然而,我似乎找不到一个模块,它可以适当地生成连接所有四个点的椭圆。这四点都是不同的(它们是测试的结果,目的是显示每个属性有多少)。我已经找到了许多模块来创建矩形,椭圆或圆圈,但这些形状都不会与点保持一致。是否有一个更通用的模块,可以连接所有四个点的形状,更像一个椭圆形?

我还看到了一些模块,可以在两点之间创建一个弧线,我认为这可能是有用的,我可以对所有四个点都这样做。当我尝试这样做时,它需要与弧角有关的输入,而我不知道如何计算。对此的任何帮助都是非常感谢的!

下面是我用来生成所显示的图像的代码。

代码语言:javascript
运行
复制
import matplotlib.pyplot as plt
import numpy as np

# Axes go from 0 to 100%
fig,ax = plt.subplots(figsize=(15,12))

x = [-40,-20,20,20]
y = [-40,20,20,-20]

plt.scatter(x,y)
ax.fill_between([-100, 0],-100,0,alpha=0.3, color='#1F98D0')  # blue
ax.fill_between([0, 100], -100, 0, alpha=0.3, color='#F9D307')  # yellow
ax.fill_between([-100, 0], 0, 100, alpha=0.3, color='#F38D25')  # orange
ax.fill_between([0, 100], 0, 100, alpha=0.3, color='#DA383D')  # red
plt.axis('off')
plt.show()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-26 19:32:35

下面的方法通过4点创建一个插值样条来创建一个“基本表单”。它的一个优点是,当有3分或4分以上时,它也能工作。

代码语言:javascript
运行
复制
import matplotlib.pyplot as plt
from scipy import interpolate
import numpy as np

fig, ax = plt.subplots(figsize=(15, 12))

x = [-40, -20, 20, 20]
y = [-40, 20, 20, -20]

ax.scatter(x, y, zorder=3)
ax.fill_between([-100, 0], -100, 0, alpha=0.3, color='#1F98D0')  #blue
ax.fill_between([0, 100], -100, 0, alpha=0.3, color='#F9D307')  #yellow
ax.fill_between([-100, 0], 0, 100, alpha=0.3, color='#F38D25')  #orange
ax.fill_between([0, 100], 0, 100, alpha=0.3, color='#DA383D')  #red

tck, u = interpolate.splprep([x + x[:1], y + y[:1]], s=0, per=True)
unew = np.linspace(0, 1, 100)
basic_form = interpolate.splev(unew, tck)
ax.plot(basic_form[0], basic_form[1], color='lime', lw=2)
ax.fill(basic_form[0], basic_form[1], color='lime', alpha=0.3)

ax.axis('off')
plt.show()

同样的方法也适用于椭圆形形状无法匹配或过大的情况:

注意,唯一定义椭圆需要5个点(但不是每5个随机点都可以拟合一个椭圆)。如果你真的需要一个椭圆,找到最小的一个到4个点是相当麻烦的。

这里是一种方法的开始,它将椭圆定义为两个焦点((x0,y0)(x1,y1))的距离之和为常数a的点。然后可以搜索存在解决方案的最小a

代码语言:javascript
运行
复制
from sympy import symbols, sqrt, Eq, nsolve

a, x0, y0, x1, y1, xi, yi = symbols('a x0 y0 x1 y1 xi yi', real=True)
ellipse = Eq(sqrt((xi - x0) ** 2 + (yi - y0) ** 2) + sqrt((xi - x1) ** 2 + (yi - y1) ** 2), a)

x = [-40, -20, 20, 20]
y = [-40, 20, 20, -20]

ai = 85
sol = nsolve([ellipse.subs(xi, i).subs(yi, j).subs(a, ai) for i, j in zip(x, y)], (x0, y0, x1, y1), (-10, 0, 10, 0))
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63602454

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档