交線長計算公式:
與弧線交於兩點:
與直線交點
代碼如下:
import math
import struct
import numpy as np
import matplotlib.pyplot as plt #plt用於顯示圖片
import sympy as sy#solve方法只能求解線性方程組
from scipy.optimize import root,fsolve
#扇形相關程序(扇形參數:角度phi,半徑長r,原點位置(首先假設爲(0,0)))
#扇形定義爲:r=4;phi=45度,這樣兩條直線爲y=x和y=-x;扇形定義爲x^2+y^2=16
#扇形可以看作兩條線段和一條弧線組成,直線與扇形三邊可能的交線情況有三種:
#1、與兩條線段相交
#2、與其中一條線段+弧線相交
#3、與弧線交於兩點
p = np.linspace(0.0314,(math.pi-0.001),1000)#將(0,pi)平均分爲1000份,取不到0,因爲此時光線垂直於x軸
x = np.linspace(-0.2,4,1000)
m = np.zeros((1000,1000))#存儲數據
def some_values(p,d,r):
v1=d*math.cos(p)*math.tan(p)
v2=r*r*pow(math.cos(p),4)+r*r*pow(math.cos(p),4)*pow(math.tan(p),2)-d*d*pow(math.cos(p),2)#根號內容
v3=pow(math.cos(p),2)+pow(math.tan(p),2)*pow(math.cos(p),2)
v4=-d
v5=d*pow(math.tan(p),2)*pow(math.cos(p),2)
v6=math.cos(p)*math.tan(p)
v7=math.cos(p)
v8=math.cos(p)*(math.tan(p)-1)
v9=math.cos(p)*(math.tan(p)+1)
return v1,v2,v3,v4,v5,v6,v7,v8,v9
def distance_1(x1,x2,x3,x4,x5,x6,x7,x8,x9): #直線與y=x相交所得交點
# k=math.tan(phi)
x = -x4/x8
y = -x4/x8
return x,y
def distance_2(x1,x2,x3,x4,x5,x6,x7,x8,x9):#直線與y=-x相交所得交點
# k=math.tan(phi)
x = -x4/x9
y =x4/x9
return x,y
def distance_3(x1,x2,x3,x4,x5,x6,x7,x8,x9):#直線與半徑爲r下半圓相交所得交點
if (x2<0):
x=y=0
else:
x=(x1-math.sqrt(x2))/x3
y=(x4+(x5-x6*math.sqrt(x2))/x3)/x7
return x,y
def distance_4(x1,x2,x3,x4,x5,x6,x7,x8,x9):#直線與半徑爲r上半圓相交所得交點
if (x2<0):
x=y=0
else:
x=(x1+math.sqrt(x2))/x3
y=(x4+(x5+x6*math.sqrt(x2))/x3)/x7
return x,y
def setxy(p,d,r):
phi=math.pi/2-p
values=some_values(phi,d,r)
q=distance_1(values[0],values[1],values[2],values[3],values[4],values[5],values[6],values[7],values[8])
w=distance_2(values[0],values[1],values[2],values[3],values[4],values[5],values[6],values[7],values[8])
e=distance_3(values[0],values[1],values[2],values[3],values[4],values[5],values[6],values[7],values[8])
rr=distance_4(values[0],values[1],values[2],values[3],values[4],values[5],values[6],values[7],values[8])
x_tuples=[q,w,e,rr]#存入元組
x_newt=sorted(x_tuples,key=lambda x:x[0])#對於元組內元素以x爲key進行排序
# print(x_newt)
x_choose0=x_newt[0]
x_choose1=x_newt[1]#賦值
x_choose2=x_newt[2]#賦值
x_choose3=x_newt[3]
dis=math.sqrt(pow(x_choose2[0]-x_choose1[0],2)+pow(x_choose2[1]-x_choose1[1],2))#求距離公式
return dis
for i in range(len(p)):
for j in range(len(x)):
m[i][j]=setxy(p[i],x[j],4)
# print(m[i][j])
plt.imshow(m,cmap='gray')
plt.axis('off')
plt.show()
# print(setxy(0.8,2,4))
結果:
直線橢圓
直線和橢圓交線長
import math
import struct
import numpy as np
import matplotlib.pyplot as plt #plt用於顯示圖片
import sympy as sy#solve方法只能求解線性方程組
from scipy.optimize import root,fsolve
#橢圓相關程序(扇形參數:角度phi,半徑長r,原點位置(首先假設爲(0,0)))
#橢圓定義爲:x^2/a1^2+y^2/b1^2=1
#直線定義爲:y=tan(p)*x-(d/cos(p))
#Solve[{(x^2)/a^2 + (y^2)/b^2 == 1, y=tan(p)*x-(d/cos(p)), {x, y}]
p = np.linspace(0.0314,math.pi,1000)#將(0,pi)平均分爲1000份
x = np.linspace(-5,5,5000)
m = np.zeros((1000,5000))#存儲數據
#由於計算複雜,所以對於相同的式子最好只計算一遍,作爲變量傳入數組
def some_values(p,d,a,b):#分爲三部分
v1=a*a*d*math.cos(p)*math.tan(p)
v2=a*a*pow(b,4)*pow(math.cos(p),4)+pow(a,4)*b*b*pow(math.cos(p),4)*pow(math.tan(p),2)-a*a*b*b*d*d*pow(math.cos(p),2)#根號中的數
v3=b*b*pow(math.cos(p),2)+a*a*pow(math.cos(p),2)*pow(math.tan(p),2)#除數
v4=-d
v5=a*a*d*pow(math.cos(p),2)*pow(math.tan(p),2)
v6=math.cos(p)*math.tan(p)
v7=math.cos(p)
return v1,v2,v3,v4,v5,v6,v7
def distance_1(x1,x2,x3,x4,x5,x6,x7): #直線與橢圓下半部分交點座標
if(x2<0):
r=0
else:
r=x2
x=(x1-math.sqrt(r))/x3
y=(x4+(x5-x6*math.sqrt(r))/x3)/x7
return x,y
def distance_2(x1,x2,x3,x4,x5,x6,x7): #直線與橢圓上半部分交點座標
if(x2<0):
r=0
else:
r=x2
x=(x1+math.sqrt(r))/x3
y=(x4+(x5+x6*math.sqrt(r))/x3)/x7
return x,y
def setxy(p,d,a,b):
phi=math.pi/2-p
values=some_values(phi,d,a,b)
q=distance_1(values[0],values[1],values[2],values[3],values[4],values[5],values[6])
w=distance_2(values[0],values[1],values[2],values[3],values[4],values[5],values[6])
dis=math.sqrt(pow(w[0]-q[0],2)+pow(w[1]-q[1],2))#求距離公式
return dis
for i in range(len(p)):
for j in range(len(x)):
m[i][j]=setxy(p[i],x[j],4,2)#選擇合適的參數
# print(m[i][j])
plt.imshow(m,cmap='gray')
plt.axis('off')
plt.show()
結果: