两个可能常用到的几何知识
圆和椭圆的参数方程
圆的参数方程
特殊圆的参数方程【圆心(0,0),半径R】
其参数α的几何意义是圆上动点和圆心连线的旋转角,如下图所示;
一般圆的参数方程【圆心(m,n),半径R】
其参数α的几何意义仿上例理解;
椭圆的参数方程
其参数ϕ的几何意义是对应的大圆或小圆半径的旋转角∠AOM,也就是椭圆的离心角.不是椭圆上动点和中心连线的旋转角∠AOP;切记!
虽然∠AOM和∠AOP二者不相等,但是很显然这二者也是一一对应的,并且它们的范围都是==[0,2π)==。
引例
已知椭圆的参数方程为
点M在椭圆上,对应参数t=
π
3
\frac{π}{3}
3π,点O为原点,则直线OM的斜率为
3
\sqrt 3
3。
分析:这个说法是错误的,怎么纠正呢?
当t=
π
3
\frac{π}{3}
3π时,代入得到 x=2cos(
π
3
\frac{π}{3}
3π)=1,y=2sin(
π
3
\frac{π}{3}
3π)=2
3
\sqrt 3
3,故M(1,2
3
\sqrt 3
3),
则kOM=
y
−
0
x
−
0
\frac{y−0}{x−0}
x−0y−0=2
3
\sqrt 3
3。
化为参数方程
介绍一个容易记忆的方法:
类比:cos2θ+sin2θ=1
- 当圆为x2+y2=4时,先转换为(
x
2
\frac{x}{2}
2x)2+(
y
2
\frac{y}{2}
2y)2=1,
cos2θ+sin2θ=1 与 ( x 2 \frac{x}{2} 2x)2+( y 2 \frac{y}{2} 2y)2=1
对应上式,得到 cosθ= x 2 \frac{x}{2} 2x,sinθ= y 2 \frac{y}{2} 2y,故圆的参数方程为
当然,我们还可以这样交叉对应,得到 sinθ= x 2 \frac{x}{2} 2x,cosθ= y 2 \frac{y}{2} 2y,故圆的参数方程还可以为
说明:
- 由此说明,当我们取的参数不一样时,圆的参数方程是不一样的,即圆的参数方程可能不唯一。两种参数的含义不一定一样。
- 我们约定俗成的取法是第一种。
- 参数方程的参数有时候有明确的几何意义,有时候没有。
- 当圆为 (x−a)2+(y−b)2=R2 时,先转换为(
x
−
a
R
\frac{x−a}{R}
Rx−a)2+(
y
−
b
R
\frac{y−b}{R}
Ry−b)2=1,
对应上式,得到 cosθ= x − a R \frac{x−a}{R} Rx−a,sinθ= y − b R \frac{y−b}{R} Ry−b,故圆的参数方程为
- 当椭圆为
x
2
a
2
\frac{ x^2}{ a^2}
a2x2+
y
2
b
2
\frac{y^2}{b^2}
b2y2=1 时,先转化为(
x
a
\frac{x}{a}
ax)2+(
y
b
\frac{y}{b}
by)2=1,
对应上式得到 cosθ= x a \frac{x}{a} ax,sinθ= y b \frac{y}{b} by,故椭圆的参数方程为
Unity中的使用
Vector3 point;
float m_width = 5.0f;
float number = 20;
float Stage = 360 / number;
List<Vector3> circle = new List<Vector3>();
for (int i = 0; i < number; i++)
{
Vector3 temp = new Vector3(point.position.x + m_width * Mathf.Cos(Stage * i), point.position.y + m_width * Mathf.Sin(Stage * i), 0);
circle.Add(temp);
}
最终的结果就是:链表对象circle
中存储了20个圆上的点。
参数方程的优点
当处理圆或者椭圆上的任意一点到直线的距离的最值时,参数方程就会体现出它巨大的优越性。原因在于:如果是普通方程时,点的坐标形式为(x,y),转化得到的必然是二元形式的,而如果是参数方程,转化得到的必然是一元形式的,肯定要比二元的简单的多。
向量的垂直向量
原理:两个向量垂直的点积为0
-
二维状况下,向量(X1,Y1)与垂直向量(X2,Y2)的点积为0。
即:X1X2+Y1Y2=0
-
三维状态下,向量(X1,Y1,Z1)与垂直向量(X2,Y2,Z2)的点积为0。
即:X1X2+T1T2+Z1Z2=0
Unity用法引例
求二维垂直向量
Vector2 dir;
Vector2 verticalDirection = new Vector2(dir.y, -dir.x);
注意:二维状态下,与一个向量垂直的应该是一条线。故结果并不是唯一的。
下面再写几个:
Vector2 verticalDirection_1 = new Vector2(1, -dir.x / dir.y);
Vector2 verticalDirection_2 = new Vector2(-dir.y / dir.x, 1);
求三维垂直向量
注意:三维状态下,与一个向量垂直的应该是一个面。故结果也不是唯一的,比二维状态下情况还要多。
同二维状态,这里我也只写几个:
Vector3 dir;
Vector3 verticalDirection = new Vector3(dir.y, -dir.x, 0);
Vector3 verticalDirection_1 = new Vector3(-_dir.z / _dir.x, 0, 1);
Vector3 verticalDirection_2 = new Vector3(1 , 0 , -dir.x / dir.z);
...