RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1010974
Accepted
Sergey Kuznetsov
Sergey Kuznetsov
Asked:2020-08-07 16:36:12 +0000 UTC2020-08-07 16:36:12 +0000 UTC 2020-08-07 16:36:12 +0000 UTC

如何显示直线的交点和圆锥曲线的边界

  • 772

使用这个问题:https ://stackoverflow.com/questions/57312462/how-to-find-and-draw-the-intersection-points-of-contour-shapes在圆锥表示为双曲线的情况下(p,q,v,k,b=5,7,2,3,4 #hyperbole) ,程序输出通过点 V 的直线与二次曲线的交点。夸张的程序的结果:在此处输入图像描述

但是,在将二次曲线表示为椭圆 ( p,q,v,k,b=5,0.7,2,3,4 # ellipse) 的情况下,除了位于二次曲线边界上的点之外,还会显示位于椭圆内部的点。椭圆程序的结果:在此处输入图像描述

我的代码:

import numpy as np
import matplotlib.pyplot as plt

def find_roots(x, y):
   s = np.abs(np.diff(np.sign(y))).astype(bool)
   return x[:-1][s] + np.diff(x)[s] / (np.abs(y[1:][s] / y[:-1][s]) + 1)

# p,q,v,k,b=5,7,2,3,4 #hyperbole

p,q,v,k,b=5,0.7,2,3,4 # ellipse

if(((2 * b * k * p) - (2 * b * k * q) + (k * k) - (b * b * q * q)) > 0):
   print("conic is an ellipse")
elif (((2 * b * k * p) - (2 * b * k * q) + (k * k) - (b * b * q * q)) == 0):
   print("conic is a parabola")
else:
   print("conic is a hyperbole")

X = np.arange(-50, 50, 0.05)

plt.plot(-v, 0)
plt.scatter(-v, 0, color='red', marker='o')
plt.text(-v, 0.8, "V", horizontalalignment="center")

xmin, xmax, ymin, ymax = -10, 10, -10, 10
ax = plt.gca()
ax.get_xlim()
ax.set_xlim([xmin, xmax])
ax.set_ylim([ymin, ymax])
ax.spines['left'].set_position('center')
ax.spines['bottom'].set_position('center')
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)

x, y = np.meshgrid(X, X)
l = b * x + b * v - v * y
vb = plt.contour(x, y, l, [0], colors='red')

conic = x * x * b * 2 * p * k - x * x * b * 2 * q * k + x * x * k * k + y * y - b * 2 * y + 2 * b * q * x * y
cnc = plt.contour(x, y, (conic), [0], colors='blue')

c = cnc.collections[0].get_paths()[-1]
v0 = c.vertices
x1 = np.sort(v0[:, 0])
y1 = v0[np.argsort(v0[:, 0]), 1]

vb1 = vb.collections[0].get_paths()[0]
v1 = vb1.vertices
x2 = np.sort(v1[:, 0])
y2 = v1[np.argsort(v1[:, 0]), 1]

x = np.linspace(max(x1.min(), x2.min()), min(x1.max(), x2.max()), 1000)

y1i = np.interp(x, x1, y1)
y2i = np.interp(x, x2, y2) 

x_intersect = find_roots(x, y1i - y2i)
y_intersect = np.interp(x_intersect, x, y1i)

plt.plot(x_intersect, y_intersect, marker="X", ms=5, color="limegreen")

plt.show()

如何只显示一条线的交点。通过点 V 和 圆锥(椭圆)的边界?

python
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    MaxU - stop genocide of UA
    2020-08-07T17:23:27Z2020-08-07T17:23:27Z

    如果您使用二维对象,任务可以大大简化:

    def graphs_intersection_pos(g1, g2):
        return np.argwhere(np.diff(np.sign(g1 - g2))).ravel()
    
    def line(x):
        return v*x + b
    
    
    X = np.arange(-50, 50, 0.05)
    
    plt.plot(-v, 0)
    plt.scatter(-v, 0, color='red', marker='o')
    plt.text(-v, 0.8, "V", horizontalalignment="center")
    
    xmin, xmax, ymin, ymax = -10, 10, -10, 10
    ax = plt.gca()
    ax.get_xlim()
    ax.set_xlim([xmin, xmax])
    ax.set_ylim([ymin, ymax])
    ax.spines['left'].set_position('center')
    ax.spines['bottom'].set_position('center')
    ax.spines['top'].set_visible(False)
    ax.spines['right'].set_visible(False)
    
    
    x, y = np.meshgrid(X, X)
    l = b * x + b * v - v * y
    vb = plt.contour(x, y, l, [0], colors='red')
    
    conic = x * x * b * 2 * p * k - x * x * b * 2 * q * k + x * x * k * k + y * y - b * 2 * y + 2 * b * q * x * y
    cnc = plt.contour(x, y, (conic), [0], colors='blue')
    
    plt.plot(X, line(X), color="red")
    

    # X,Y координаты коники / эллипса / контура
    coords = cnc.allsegs[0][0]
    # точки прямой должны соответствовать X значениям эллипса
    x_line = coords[:, 0]
    y_line = line(x_line)
    
    # находим индексы точек пересечения    
    idx = graphs_intersection_pos(coords[:, 1], y_line)
    plt.scatter(x_line[idx], y_line[idx], color="green", s=50)
    

    在此处输入图像描述

    • 4

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    根据浏览器窗口的大小调整背景图案的大小

    • 2 个回答
  • Marko Smith

    理解for循环的执行逻辑

    • 1 个回答
  • Marko Smith

    复制动态数组时出错(C++)

    • 1 个回答
  • Marko Smith

    Or and If,elif,else 构造[重复]

    • 1 个回答
  • Marko Smith

    如何构建支持 x64 的 APK

    • 1 个回答
  • Marko Smith

    如何使按钮的输入宽度?

    • 2 个回答
  • Marko Smith

    如何显示对象变量的名称?

    • 3 个回答
  • Marko Smith

    如何循环一个函数?

    • 1 个回答
  • Marko Smith

    LOWORD 宏有什么作用?

    • 2 个回答
  • Marko Smith

    从字符串的开头删除直到并包括一个字符

    • 2 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5