什麼是包絡線?包絡線又是如何繪製的?
包絡線
就是跟一族曲線系中的每一條都相切的曲線。設曲線系的方程為
對c求偏導,得到
聯立兩個方程,削去c,得到的就是包絡線的方程(有時不是,但這是必要條件,可以先畫圖確認包絡線的存在。)問題的關鍵是找到一個映射函數,當知道線段上一點的位置後,如何求另一點的位置.下圖的映射函數是:已知線段上第一點的坐標(1, x),則另一點的坐標是:(sqrt(1 - x*x), 1)修改一下映射函數:已知線段上第一點的坐標(1, x),則另一點的坐標是:(1 - (sqrt(1 - (1-x)*(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)
然後看圖,這張圖有三個部分一:中間圍成的圖形,這個就是包絡線二:外面的框,呃,就是個格點框三:斜線,就是包絡線的切線族,過格點的切線族.其實歸結起來就是兩個問題:由包絡線求切線族和由切線圖求包絡線------------------------------------------------中二的分割線-----------------------------------------你想問的是怎麼由格點框得到相應的包絡線嗎?根據我中二(高中二年級)的時候創立的格點圖神教的教義,題主這麼做形成的曲線都是雙曲線,所以題主的圖就是四個雙曲線的一半拼接而成的圖形.神說要有切線族!於是就有了切線族F(x,y,S):
神說要凈化異端C,於是我們對C求偏導:神說要消滅異端C,於是我們聯立方程消滅C.神說這是條雙曲線.神說題主畫的是S=20的四條這樣的線.
------------------------------------------------------正經的分界線----------------------------------------------幸好邊界是個直角框才可以用這麼逗的方法.邊界要是銳角鈍角甚至是圓形或者奇怪的封閉凸曲線就要炫酷的數學方法來獲得曲線族了.最難的一步是獲得曲線族,然後求偏導聯立方程是基本功了. ( ̄??)有多難呢,我們來考慮逆問題:
逆問題就是求給定曲線的切線族,這個更加簡單;(所以我忘記了,我去查查書)包絡線由關於t的參數方程P(x,y)給出的話.切線族就是要是由方程給出的話,那就寫成參數方程啊.ヾ( ̄▽ ̄)Bye~Bye~隱函數方程那就隱函數求導寫切線.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]
心臟線
笛卡爾葉線
沒畫出來......不能寫這種參數式的.不均勻.阿基米德線如圖即為包絡
推薦閱讀:
※在一個由n x m個正方形格子組成的的矩形上畫一條這矩形的對角線,這線段將穿過多少個格子?
※在一個正方體中按以下規則反覆連線,最後會連出多少個交點?
※平行線公設到底哪裡有問題?
※一個長方形內,有一個永不停歇的點以任意角度從任意位置開始運動,碰到長方形的邊之後進行鏡面反射?
※局部同胚和同胚的本質區別在哪裡?