計算扇形與直線相交長,模擬扇形正投影

交線長計算公式:
與弧線交於兩點:
在這裏插入圖片描述

與直線交點在這裏插入圖片描述
在這裏插入圖片描述
代碼如下:

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()

結果:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章