ACM 几何基础(1)

来源:互联网 发布:mac 10.11 替换 matlab 编辑:程序博客网 时间:2024/05/17 06:33

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=0y=kx+b

2)直线的斜率k=(y2-y1)/(x2-x1);

y1=y2时,k=0x轴平行

x1 = x2 时,k不存在

x1x2无限接近时,k趋无穷大,这种情况要小心

 

3)两条直线垂直

K1*k2= - 1

 

线段

1)凸组合:

假设x1,x2,...,xn是一组对象(要根据讨论问题的背景来确定)
a1,a2,...,an是n个常数,并且满足a1+...+an=1,
那么a1x1+...+anxn就称为x1,...,xn的凸组合

设两个不同的点:p1x1y1)  p2x2y2)的凸组合是满足条件p3x3y30<=a<=1

根据凸组合:

X3=ax1+(1-a)x2,    y3=ay1+(1-a)y2;

 所以:

P3=ap1+(1-a)p2;

2) 线段:

   P1p2分别为线段的端点;

 

向量(矢量)的概念

1)定义:这个我就不多说了,大家高中就学过了,从某一点出发,有长度有方向,的就叫向量。

a*b=|a|*|b|cos<a,b>

p1p2为两点

|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>;

ab为向量,a=x1y1)  bx2y2);

a.(点乘)b=x1*x2+y1*y2;

a垂直ba.(点乘)b=0

自乘:a.a=|a|^2;

满足 结合律,交换律,分配律;

 

 

 

5)矢量的矢量积(叉乘,叉积)

向量积,数学中又称外积、叉积,物理中称矢积、叉乘,是一种在向量空间中向量的二元运算。与点积不同,它的运算结果是一个向量而不是一个标量。并且两个向量的叉积与这两个向量的和垂直。[1] 

 

向量积|c|=|a×b|=|a| |b|sin<a,b>

 

p1,p2为矢量p1x1,y1p2(x2,y2)p1,p2,同起点

P1*(叉积)p2=x1y2-x2y1;

若结果为正数,说明p1p2的顺时针方向,

若结果为负数,说明p1p2的逆时针方向,

若结果为0 ,则p1p2模相等且共线。

 

程序表达:设点 p0p1,p2

R=multiply(p0,p1,p2)

R>0 p0p1p0p2的顺时针方向

R=0 p0p1p0p2共线

R<0 p0p1p0p2的逆时针方向

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)

叉乘:Vector1x1y1z1),Vector2x2y2z2):

其结果是个矢量。

方向是Vector1Vector2构成的平面法线。再使用右手定则

长度是LengthVector1*LengthVector2*sintheta

thetaVector1 & Vector2的夹角。

所以,平行的矢量叉乘结果为0矢量(长为0,方向任意)

计算结果矢量:(oxoyoz

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




1 0
原创粉丝点击