標籤:

什麼是包絡線?包絡線又是如何繪製的?


包絡線

就是跟一族曲線系中的每一條都相切的曲線。

設曲線系的方程為F(x,y,c)=0

對c求偏導,得到frac{partial F}{partial c}(x,y,c)=0

聯立兩個方程,削去c,得到的就是包絡線的方程(有時不是,但這是必要條件,可以先畫圖確認包絡線的存在。)


問題的關鍵是找到一個映射函數,當知道線段上一點的位置後,如何求另一點的位置.

下圖的映射函數是:已知線段上第一點的坐標(1, x),則另一點的坐標是:(sqrt(1 - x*x), 1)

修改一下映射函數:已知線段上第一點的坐標(1, x),則另一點的坐標是:(1 - (sqrt(1 - (1-x)*(1-x)), 1)

再修改一下映射函數:已知線段上第一點的坐標(1, x),則另一點的坐標是:(sqrtf(1 - x), 1)

感覺題主提供的圖像,它的映射函數是:(1 - x, 1)

最後發下代碼:

// 頂點鏡像
void MirrorVertices(Vector3* pVertices, unsigned int count)
{
for (unsigned int i = 1; i &< 4; i++) { for (unsigned int j = 0; j &< count; j++) { pVertices[i*count + j] = pVertices[j]; if (i 1) { pVertices[i*count + j].x = -pVertices[i*count + j].x; } if (i 2) { pVertices[i*count + j].y = -pVertices[i*count + j].y; } } } } inline float MapFunc1(float x) { return sqrtf(1 - x*x); } inline float MapFunc2(float x) { return 1 - sqrtf(1 - (1 - x)*(1 - x)); } inline float MapFunc3(float x) { return sqrtf(1 - x); } void CRoundGrid::BuildVertices(Vector3* pVertices) { pVertices[0].x = FRACTAL_RADIUS; pVertices[0].y = 0.0f; pVertices[0].z = 0.0f; pVertices[1].x = FRACTAL_RADIUS; pVertices[1].y = FRACTAL_RADIUS; pVertices[1].z = 0.0f; pVertices[2].x = 0.0f; pVertices[2].y = FRACTAL_RADIUS; pVertices[2].z = 0.0f; pVertices[3].x = FRACTAL_RADIUS; pVertices[3].y = FRACTAL_RADIUS; pVertices[3].z = 0.0f; MirrorVertices(pVertices, 4); float arr[2&<&<(ROUND_GRID_COUNT - 1)]; unsigned int pos[ROUND_GRID_COUNT]; unsigned int count[ROUND_GRID_COUNT]; arr[0] = 0.5f; pos[1] = 0; count[1] = 1; float step = 0.25f; for (unsigned int i = 2; i &< m_countLevels; i++) { pos[i] = pos[i - 1] + count[i - 1]; count[i] = count[i - 1]*2; for (unsigned int j = 0; j &< count[i - 1]; j++) { arr[pos[i] +j*2] = arr[pos[i - 1] +j] - step; arr[pos[i] +j*2 + 1] = arr[pos[i - 1] +j] + step; } step *= 0.5f; } for (unsigned int i = 1; i &< m_countLevels; i++) { Vector3* pDest = pVertices + m_fractalLevels[i - 1].verticesCount; assert(m_fractalLevels[i - 1].verticesCount + count[i]*4 &<= m_verticesCount); for (unsigned int j = 0; j &< count[i]; j++) { pDest[j*4].x = arr[pos[i] +j]; pDest[j*4].y = 1.0f; pDest[j*4].z = 0.0f; pDest[j*4 + 1].x = 1.0f; pDest[j*4 + 1].y = MapFunc3(arr[pos[i] +j]); pDest[j*4 + 1].z = 0.0f; pDest[j*4] *= FRACTAL_RADIUS; pDest[j*4 + 1] *= FRACTAL_RADIUS; pDest[j*4 + 2].x = pDest[j*4].y; pDest[j*4 + 2].y = pDest[j*4].x; pDest[j*4 + 2].z = 0.0f; pDest[j*4 + 3].x = pDest[j*4 + 1].y; pDest[j*4 + 3].y = pDest[j*4 + 1].x; pDest[j*4 + 3].z = 0.0f; } MirrorVertices(pDest, 4*count[i]); } }


首先,審題.包絡線就是Envelope (Mathematics)

然後看圖,這張圖有三個部分

一:中間圍成的圖形,這個就是包絡線

二:外面的框,呃,就是個格點框

三:斜線,就是包絡線的切線族,過格點的切線族.

其實歸結起來就是兩個問題:由包絡線求切線族和由切線圖求包絡線

------------------------------------------------中二的分割線-----------------------------------------

你想問的是怎麼由格點框得到相應的包絡線嗎?

根據我中二(高中二年級)的時候創立的格點圖神教的教義,題主這麼做形成的曲線都是雙曲線,所以題主的圖就是四個雙曲線的一半拼接而成的圖形.

我向你傳授格點圖神教的入門心法.神教覆滅多年,讓我臨時想幾個中二的詞.

近似曲線SB就是包絡線啦,S和B就叫極點好了,用S表示.

神說要有切線族!於是就有了切線族F(x,y,S):

[y = frac{{C - S}}{{C + 1}}x + S - C]

神說要凈化異端C,於是我們對C求偏導:

[{(C + 1)^2} = S(x + 1)]

神說要消滅異端C,於是我們聯立方程消滅C.

[{(S + 1 - x - y)^2} = 4xy]

神說這是條雙曲線.神說題主畫的是S=20的四條這樣的線.

------------------------------------------------------正經的分界線----------------------------------------------

幸好邊界是個直角框才可以用這麼逗的方法.

邊界要是銳角鈍角甚至是圓形或者奇怪的封閉凸曲線就要炫酷的數學方法來獲得曲線族了.

最難的一步是獲得曲線族,然後求偏導聯立方程是基本功了. ( ̄??)

有多難呢,我們來考慮逆問題:

逆問題就是求給定曲線的切線族,這個更加簡單;(所以我忘記了,我去查查書)

包絡線由關於t的參數方程P(x,y)給出的話.切線族就是[frac{{x - x({t_0})}}{{x

要是由方程給出的話,那就寫成參數方程啊.ヾ( ̄▽ ̄)Bye~Bye~

隱函數方程那就隱函數求導寫切線.

[{F_x}({x_0},{y_0})(x - {x_0}) + {F_y}({x_0},{y_0})(y - {y_0}) = 0]

我們來試幾個.

克萊線:[
ho  = 4{cos ^3}frac{	heta }{3}]的切線族

[y = frac{1}{2}csc left( {frac{{4	heta }}{3}} 
ight)left( {4cos left( {frac{{2	heta }}{3}} 
ight) + left( {1 - 2x} 
ight)cos left( {frac{{4	heta }}{3}} 
ight) + 3} 
ight)]

慘不忍睹,還是看圖吧.

這是代碼

fuc0 = FromPolarCoordinates[{4 Cos[[Theta]/3]^3, [Theta]}];
fuc1 = FullSimplify[
Last[fuc0] +
D[Last[fuc0], [Theta]]*(x - First[fuc0])/
D[First[fuc0], [Theta]]];
fuc2 = Simplify[N[Table[fuc1, {[Theta], 0, 10, 0.1}]]];
Plot[fuc2, {x, -1, 4}, PlotRange -&> 3,
PlotStyle -&> Directive[Black, Thin], AspectRatio -&> 1, Axes -&> False]

心臟線

[y = frac{{	an left( {frac{	heta }{2}} 
ight)left( {cos left( 	heta  
ight) + 2xcos left( 	heta  
ight) + x - 1} 
ight)}}{{2cos left( 	heta  
ight) - 1}}]

笛卡爾葉線

[y = frac{{tleft( {left( {{t^3} - 2} 
ight)x + 3t} 
ight)}}{{2{t^3} - 1}}]

沒畫出來......不能寫這種參數式的.不均勻.

阿基米德線

[y = frac{{ - {	heta ^2} + xsin left( 	heta  
ight) + 	heta xcos left( 	heta  
ight)}}{{cos left( 	heta  
ight) - 	heta sin left( 	heta  
ight)}}]

還有很多啊,沒一個切線族方程簡單的,所以逆推的難度.嘖嘖嘖...


如圖即為包絡


推薦閱讀:

在一個由n x m個正方形格子組成的的矩形上畫一條這矩形的對角線,這線段將穿過多少個格子?
在一個正方體中按以下規則反覆連線,最後會連出多少個交點?
平行線公設到底哪裡有問題?
一個長方形內,有一個永不停歇的點以任意角度從任意位置開始運動,碰到長方形的邊之後進行鏡面反射?
局部同胚和同胚的本質區別在哪裡?

TAG:數學 | 幾何學 |