点 point
定义 :
struct point
{
double x,y;
};
线 line
定义 :
Struct line
{
Point s,e;
};
精度差
Const double eps=1e-8;
Int sgn(double x)
{
If(fabs(x)<eps) return 0;
If(x<0)return -1;
Else return 1;
}
直线
1)一般形式:ax+by+c=0或y=kx+b
2)直线的斜率k=(y2-y1)/(x2-x1);
当y1=y2时,k=0与x轴平行
当 x1 = x2 时,k不存在
当 x1,x2无限接近时,k趋无穷大,这种情况要小心
3)两条直线垂直
K1*k2= - 1;
线段
1)凸组合:
假设x1,x2,...,xn是一组对象(要根据讨论问题的背景来确定)
a1,a2,...,an是n个常数,并且满足a1+...+an=1,
那么a1x1+...+anxn就称为x1,...,xn的凸组合
设两个不同的点:p1(x1,y1) p2(x2,y2)的凸组合是满足条件p3(x3,y3)0<=a<=1
根据凸组合:
X3=ax1+(1-a)x2, y3=ay1+(1-a)y2;
所以:
P3=ap1+(1-a)p2;
2) 线段:
P1,p2分别为线段的端点;
向量(矢量)的概念
1)定义:这个我就不多说了,大家高中就学过了,从某一点出发,有长度有方向,的就叫向量。
a*b=|a|*|b|cos<a,b>
设p1,p2为两点
|P1p2|=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
2)矢量的加减法:
加法口诀:首尾相连,再相加
减法口诀:同起点,指被减
3)投影
矢量b 在a上的投影“模”是(a.b)/|a|
4)矢量的数量积(点乘)
两个矢量的数量积是一个数,大小等于这两个矢量的模的乘积再乘他们的夹角余弦。
a.(点乘)b=|a||b|cos<a,b>;
设a,b为向量,a=(x1,y1) b(x2,y2);
a.(点乘)b=x1*x2+y1*y2;
当a垂直b,a.(点乘)b=0
自乘:a.a=|a|^2;
满足 结合律,交换律,分配律;
5)矢量的矢量积(叉乘,叉积)
向量积,数学中又称外积、叉积,物理中称矢积、叉乘,是一种在向量空间中向量的二元运算。与点积不同,它的运算结果是一个向量而不是一个标量。并且两个向量的叉积与这两个向量的和垂直。[1]
向量积|c|=|a×b|=|a| |b|sin<a,b>
设p1,p2为矢量p1(x1,y1)p2(x2,y2) 若p1,p2,同起点
P1*(叉积)p2=x1y2-x2y1;
若结果为正数,说明p1在p2的顺时针方向,
若结果为负数,说明p1在p2的逆时针方向,
若结果为0 ,则p1,p2模相等且共线。
程序表达:设点 p0,p1,p2
R=multiply(p0,p1,p2)
R>0 则p0p1在p0p2的顺时针方向
R=0 则p0p1与p0p2共线
R<0 则p0p1在p0p2的逆时针方向
Double multiply(point p0,point p1,point p2)
{
Return ((p1.x-p0.x)*(p2.y=p0.y)-(p2.x-p0.x)*(p1.y-p0.y));
}
实际应用的一个矢量转到另一个矢量,确定旋转的方向就用叉积
求法向量做法:
叉乘(Cross product)
叉乘:Vector1(x1,y1,z1),Vector2(x2,y2,z2):
其结果是个矢量。
方向是Vector1,Vector2构成的平面法线。再使用右手定则
长度是Length(Vector1)*Length(Vector2)*sin(theta)
theta是Vector1 & Vector2的夹角。
所以,平行的矢量叉乘结果为0矢量(长为0,方向任意)
计算结果矢量:(ox,oy,oz)
ox=(y1 * z2)-(y2 * z1)
oy=(z1 * x2)-(z2 * x1)
oz=(x1 * y2)-(x2 * y1)
用途:计算法向量,这是生成3D图形的很关键一步。
求面积做法:
首先:两个向量的叉积不是面积,两个向量的叉积是一个向量.
两个向量的叉积的模是面积.
6)矢量的旋转
将矢量b逆时针旋转a角度后的矢量为
|cos a -sin a|
|sin a cos a |*b