数学中的坐标系统(笛卡尔坐标系统)
这里A(0,0), B(1,2), C(4,3), D(–1,2), E(–2,–1), F(3,–2).
计算机中的坐标系统(屏幕坐标系统)
注意这里的y轴在两个坐标系统是相反的。在后面将会研究将笛卡尔坐标系统转换为屏幕坐标系统。
在3D的坐标系中,没有一个工业标准,有的采用y轴向上(y-up)的坐标系,有的采用z轴向上(z-up)的坐标系,有的采用右手坐标系统(right-handed coordinate system),有的采用左手系统(left-handed coordinate system)。
这里我们采用y轴向上的右手坐标系统。
这里有一个p点的小例子:
在传统过的数学方法表示中通常是括号加注的方式,如P(1,2,3),但是对于程序员来说,他们更加喜欢这样的表示方式,如p<1,2,3>或者p[1,2,3],因为这样表示可以进行矢量运算,矢量运算后面将会介绍。
点定义:
- struct Point2D
- {
- float x,y;
- }
- struct Point3D
- {
- float x,y,z;
- }
直线公式:
Ax + By = C (A和B不能同时为0)
讨论:
A和B不为0:为斜线(不垂直于x轴和y轴);
A为0,B不为0:直线为垂直于y轴的直线,且于y轴交与点(0,C/B);
A不为0,B为0:直线为垂直于x轴的直线,且于x轴交与点(C/A,0);
例1:
例2:
斜率:
定义斜率:
- float GetSlope(Point2D p1,Point2D p2)
- {
- float slope;
- if(p1.x-p2.x!=0)
- {
- slope=(p1.y-p2.y)/(p1.x-p2.x);
- return slope;
- }
- }
已知:直线A:y1=k1*x1+b1 直线B:y2=k2*x2+b2
两直线相互垂直的条件是:斜率乘积为-1,即k1*k2=-1。
两直线平行的条件是:斜率相等,即k1=k2;当k1=k2且b1=b2直线重合。
两直线相交的条件是:斜率不相等,即k1!=k2;两直线垂直是直线相交的一种特殊情况。
公式:a2+b2=c2(勾股定理)
2D:
3D:
计算机实现:
- float Distance2D(Point2D p1,Point2D p2)
- {
- float dx=p1.x-p2.x;
- float dy=p1.y-p2.y;
- float distance=sqrt(pow(dx,2)+pow(dy,2));
- return distance;
- }
- float Distance3D(Point3D p1,Point3D p2)
- {
- float dx=p1.x-p2.x;
- float dy=p1.y-p2.y;
- float dz=p1.z-p2.z;
- float distance=sqrt(pow(dx,2)+pow(dy,2)+pow(dz,2));
- return distance;
- }
2.两点之间的中点
公式:
2D:
3D:
计算机实现:
- Point2D MidPoint2D(Point2D p1,Point2D p2)
- {
- float sx=p1.x+p2.x;
- float sy=p1.y+p2.y;
- Point2D midPoint;
- midPoint.x=sx/2;
- midPoint.y=sy/2;
- return midPoint;
- }
- 3D中点计算
- Point3D Distance3D(Point3D p1,Point3D p2)
- {
- float sx=p1.x+p2.x;
- float sy=p1.y+p2.y;
- float sz=p1.z+p2.z;
- Point3D midPoint;
- midPoint.x=sx/2;
- midPoint.y=sy/2;
- midPoint.z=sz/2;
- return midPoint;
- }
如果你投掷一个铅球或者踢足球,它们将做一个抛物线运动。因为它们总是受一个垂直于地面的重力加速度g的作用。下图为四个方向上的抛物线。
公式:
垂直轴向上的抛物线:y=a(x–h)2+k, 顶点为(h,k),关于x=h对称.
水平轴向上的抛物线:x=a(y–k)2+h, 顶点为(h,k),关于y=k对称.
举例: