版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
坐标空间及其变换GDI十在视图和窗口中绘图或定位总是在一个二维坐标系进行,依据作用方法的不同,坐标有多种表示方法,并且各种不同坐标之间可以相互转换。世界坐标系、设备坐标系和页面坐标系GDI+为我们提供了三种坐标空间:世界坐标系、页面坐标系和设备坐标系。世界坐标系是应用程序用来进行图形输入输出所使用的一种与设备无关的笛卡尔坐标系。通常,我们可以根据自己的需要和方便定义一个自己的世界坐标系,这个坐标系称为用户坐标系。例如,前面DrawLine(&newPen,20,10,200,100);中的坐标都是以这个用户坐标系为基准的,默认时使用像素为单位。设备坐标系是指显示设备或打印设备坐标系下的坐标,它的特点是以设备上的象素点为单位。对于窗口中的视图而言,设备坐标的原点在客户区的左上角,x坐标从左向右递增,y坐标自上而下递增。由于设备的分辨率不同,相同坐标值的物理位置可能不同。如对于边长为100的正方形,当显示器为640x480和800x600时的大小是不一样的。页面坐标系是指某种映射模式下的一种坐标系。所谓映射是指将世界坐标系通过某种方式进行的变换。默认时,设备坐标和页面坐标是一致的。坐标映射和坐标原点的设置为了能保证打印或显示的结果不受设备的影响,GDI+定义了一些映射方法和属性来决定设备坐标和页面坐标之间的关系。这些映射方法和属性有:SetPageUnit和GetPageUnit这两个属性函数是用来设置和获取每个单位所对应的实际度量单位。它通常可以有下列的值:UnitDisplay--每个页面单位为1/75英寸;UnitPixel--每个页面单位为1个像素,此时页面坐标与设备坐标相同;UnitPoint--每个页面单位为1/72英寸;
Unitinch--每个页面单位为1英寸;UnitDocument--每个页面单位为1/300英寸;UnitMillimeter--每个页面单位为1毫米。例如,或将Ex_GDIPlusDlg示例中的绘图代码修改成:usingnamespaceGdiplus;Graphicsgraphics(dc.m_hDC);graphics.SetPageUnit(UnitMillimeter);PennewPen(Color(255,0,0),3);HatchBrushnewBrush(HatchStyleCross,Color(255,0,255,0),Color(255,0,0,255));graphics.DrawRectangle(&newPen,50,50,100,60);graphics.FillRectangle(&newBrush,50,50,100,60);其结果如图所示。则笔画宽度为3,以及矩形的左上角顶点坐标和大小其结果如图所示。图7.4图7.4将页面单位设置为皇米后的结果SetPageScale和GetPageScale当上面的绘图代GDI+的这两个属性函数分别用来设置和获取页面的当上面的绘图代码变成:graphics.SetPageScale((REAL)0.1);PennewPen(Color(255,0,0),3);代码中,REAL是一个浮点类型的定义。上述代码的结果如图2所示。TranslateTransformGDI+的TranslateTransform方法用来改变坐标的原点位置,例如TranslateTransform(100,50)是将坐标原点移到点(100,50)。画笔画笔是用来绘制各种直线和曲线的一种图形工具,GDI+的Pen类为画笔提供了丰富的方法。一般来说,我们可以通过其构造函数来指定画笔的颜色和宽度,其定义如下:Pen(constColor&color,REALwidth);其中,color是用来指定画笔颜色,width用来指定画笔宽度。REAL是一个float类型定义,而Color是GDI+的一个颜色类,它既可以指定一个ARGB颜色类型,也可以使用GDI+预定义的颜色值,甚至可以将COLORREF转换成Color类型的颜色。例如,下面的代码都是创建一个宽度为3,颜色为蓝色的画笔:PennewPen(Color(0,0,255),3);//当Color只有三个实参时,颜色Alpha分量值为255。PennewPen(Color::Blue,3);COLORREFcrRef=RGB(0,0,255);Colorcolor;color.SetFromCOLORREF(crRef);PennewPen(color,3);除了颜色外,GDI+的Pen类还提供SetDashStyle和SetDashPattern方法来设置画笔的预定义风格和自定义类型。其中,预定义风格可以有:DashStyleSolid(实线)、DashStyleDash(虚线)、DashStyleDot(点线)、DashStyleDashDot(点划线)、DashStyleDashDotDot(双点划线)和DashStyleCustom(自定义类型)。例如下列代码,其结果如图7.6所示:Graphicsgraphics(pDC->m_hDC);Penpen(Color(255,0,0,255),15);pen.SetDashStyle(DashStyleDash);graphics.DrawLine(&pen,0,50,400,150);pen.SetDashStyle(DashStyleDot);graphics.DrawLine(&pen,0,80,400,180);pen.SetDashStyle(DashStyleDashDot);graphics.DrawLine(&pen,0,110,400,210);但是,在工程应用中,预定义风格的画笔有时并不能满足实际的需求,而必须自己定义一些线型,这需要通过SetDashPattern函数来实现。SetDashPattern的原型如下:其中,dashArray是一个包含短划和间隔长度的数组,count表示数组的大小。注意,dashArray中的短划长度和间隔长度是成对出现的,例如下列代码是使用自定义类型的画笔,其结果如图7.7所示。2,//短划长为22,//间隔为215,//短划长为152);//间隔为2Penpen(Color(255,0,0,0),5);pen.SetDashPattern(dashVals,4);graphics.DrawLine(&pen,5,20,405,200);需要说明的是,GDI+的Pen类还提供SetStartCap和SetEndCap方法来设置一条直线的起始端和终止端的样式。例如下面的代码,其结果如图7.8所示。Graphicsgraphics(pDC->m_hDC);Penpen(Color(255,0,0,255),15);pen.SetStartCap(LineCapFlat);pen.SetEndCap(LineCapSquare);graphics.DrawLine(&pen,50,50,250,50);pen.SetStartCap(LineCapRound);pen.SetEndCap(LineCapRoundAnchor);graphics.DrawLine(&pen,50,100,250,100);pen.SetStartCap(LineCapDiamondAnchor);pen.SetEndCap(LineCapArrowAnchor);graphics.DrawLine(&pen,50,150,250,150);画刷和渐变画刷用于指定填充的特性,GDI+为填充色和阴影线画刷提供了SolidBrush和HatchBrush类。通过它们的构造函数直接可以创建一个画刷,其构造函数的原型如下:HatchBrush(HatchStylehatchStyle,constColor&foreColor,constColor&backColor);其中,foreColor和backColor用来指定阴影线颜色和填充的背景颜色,背景色可以不指定。hatchStyle用来指定阴影线的样式,它可以是这样的一些预定义样式:HatchStyleHorizontal(水平线)、HatchStyleVertical(垂直线)、HatchStyleForwardDiagonal(上斜线)、HatchStyleBackwardDiagonal(下斜线)、HatchStyleCross(十字线)以及HatchStyleDiagonalCross(交叉线)等。当然,还有许多样式如HatchStyle30Percent(30%填充)、HatchStyleSolidDiamond(实心菱形)等,这里不一一列举。由于在前面的示例中,对这种简单的画刷的使用已介绍过,因而这里着重讨论渐变画刷的创建和使用。GDI+提供了LinearGradientBrush和PathGradientBrush类分别用来创建一^直线渐变和路径渐变画刷。直线渐变是指在一个矩形区域使用两种颜色进行过渡(渐变),过渡方向可以是水平、垂直以及对角线方向。LinearGradientBrush构造函数的原型如下:Color&colorl,Color&color2);LinearGradientBrush(Rect&rect,Color&colorl,Color&color2,REALangle,BOOLisAngleScalable);LinearGradientBrush(Rect&rect,Color&color1,Color&color2,LinearGradientModemode);其中,point1和point2分别用来指定矩形区域的左上角和右下角点坐标,color1和color2分别用来指定渐变起始和终止的颜色°rect用来指定一个矩形区域的大小和位置,angle用来指定渐变的方向角度,正值为顺时针。isAngleScalable是一个即将废除的参数。mode用来指定渐变的方法,它可以是LinearGradientModeHorizontal(水平方向)、LinearGradientModeVertical(垂直方向)、LinearGradientModeForwardDiagonal(从左下到右上的对角线方向)和LinearGradientModeBackwardDiagonal(从左上到右下的对角线方向)。需要说明的是,Point和Rect是GDI+新的数据类型,它们和MFC的CPoint和CRect类的功能基本一样,但它们相互之间不能混用。路径渐变画刷是用渐变颜色来填充一个封闭的路径。一个路径既可以由一系列的直线和曲线构成,也可以由其它对象来构造。路径渐变是一种中心颜色渐变模式,它从路径的中心点向四周进行颜色渐变。PathGradientBrush构造函数的原型如下:PathGradientBrush(constPoint*points,INTcount,WrapModewrapMode);其中,path用来指定一个路径指针,points和count分别用来指定组成路径的一系列直线端点的数组及其大小,wrapMode是一个可选项,用来指定填充的包围模式。一个包围模式用来决定是否在区域内部、在区域外部以及所有区域都填充。默认时,其值为WrapModeClamp,即在区域内部填充。下面的代码说明了上述两种渐变画刷的使用方法:m_hDC);GraphicsPathpath;//构造一个路径path.AddEllipse(50,50,200,100);//使用路径构造一个画刷PathGradientBrushpthGrBrush(&path);//将路径中心颜色设为蓝色pthGrBrush.SetCenterColor(Color(255,0,0,255));//设置路径周围的颜色为蓝芭,但alpha值为0Colorcolors[]={Color(0,0,0,255));INTcount=1;pthGrBrush.SetSurroundColors(colors,&count);graphics.FillRectangle(&pthGrBrush,50,50,200,100);LinearGradientBrushlinGrBrush(Point(300,50),Point(500,150),Color(255,255,0,0),//红色Color(255,0,0,255));//蓝色graphics.FillRectangle(&linGrBrush,300,50,200,100);结果如图7.9所示。需要说明的是,画笔和画刷还可使用一个图片来创建。例如下列代码,其结果如图7.10所示。m_hDC);Imageimage(Limagejpg);TextureBrushtBrush(&image);PentexturedPen(&tBrush,10);graphics.DrawLine(&texturedPen,25,25,325,25);tBrush.SetWrapMode(WrapModeTileFlipXY);graphics.FillRectangle(&tBrush,25,100,300,200);
图形几何变换图形变换一般是对图形的几何信息经过几何变换后产生新的图形。常见二维图形的变换有平移、比例、对称、旋转、错切等。图形几何变换最有效的手段是采用矩阵变换,GDI+就有这样的矩阵类Matrix,它为我们提供了许多变换的方法,如Invert(转置)、Multiply(矩阵相乘)、Rotate(旋转)等。例如下面的代码就是Matrix::Rotate一个例子,其结果如图7.11所示。m_hDC);Penpen(Color(255,0,0,255));Matrixmatrix;matrix.Translate(40,0);//先平移matrix.Rotate(30,MatrixOrderAppend);//后旋转graphics.SetTransform(&matrix);graphics.DrawEllipse(&pen,0,0,100,50);需要说明的是,代码中的MatrixOrderAppend用来指明第二个矩阵(若有)的操作次序是后置的,即matrixlOPmatrix2,OP表示某种操作;若为MatrixOrderPrepend则表示matrix2OPmatrixl。而SetTransform则指定一个矩阵对点坐标进行变换,新的坐标点(x*,y*)结果可用下列公式来表示:厂mumi2口、m22 0[x*y*1]=[xy1]l血w1J=[m11x+m21y+dxm12x+m22y+dy1]式中,dx和dy用来指定x和y方向的平移量,若dx=dy=0,则:当m21=m12=0,m11=-1,m22=1时,有x*=-x,y*=y,产生与y轴对称的反射图形;当m21=m12=0,m11=1,m22=-1时有x*=x,y*=-y,产生与x轴对称的反射图形;当m21=m12=0,m11=m22=-1时有x*=-x,y*=-y,产生与原点对称的反射图形;当m21=m12=1,m11=m22=0时有x*=y,y*=x,产生与直线y=x对称的反射图形;当m21=m12=-1,m11=m22=0时有x*=-y,y*=-x,产生与直线y=-x对称的反射图形;而当m11=m22=cosq,m21=-m12=sinq时则进行旋转变换。例如下列代码,其结果如图7.12所示。m_hDC);Penpen(Color::Blue,3);graphics.DrawLine(&pen,150,50,200,80);pen.SetColor(Color::Gray);Matrixmatrix(-1,0,0,1,150,50);//使用第一种情况graphics.SetTransform(&matrix);graphics.DrawLine(&pen,0,0,50,30);其中,Matrix的构造函数有如下定义:需要说明的是,除了使用Matrix进行图形变换外,Graphics本身提供相应的变换方法,如RotateTransform(旋转变换)、ScaleTransform(比例变换)和TranslateTransform(平移变换)等。基本绘图函数在前面许多示例中,我们已经用到如DrawLine等基本绘图函数。除此之外,还有许多这样的函数,并且每个绘图函数都有其重载形式,这给我们带来了许多方便。表7.1列出这些基本绘图函数。表1GDI+常用基本绘图函数
绘图函数功能描述DrawArc绘制一条圆弧曲线,范围由起止角大小决定,大小由矩形或长宽值指定DrawBezier绘制一条由一系列型值顶点决定的三次Bezier曲线DrawBeziers绘制一系列的三次Bezier曲线DrawClosedCurve绘制一条封闭的样条曲线DrawCurve绘制一条样条曲线DrawEllipse绘制一条椭圆轮廓线,大小由矩形或长宽值指定DrawLine绘制一条直线DrawPath绘制由GraphicsPath定义的路径轮廓线DrawPie绘制一条扇形(饼形)轮廓线DrawPolygon绘制一个多边形的轮廓线DrawRectangle绘制一个矩形FillEllipse填充一^椭圆区域FillPath填充一个由路径指定的区域FillPie填充一个扇形(饼形)区域FillPolygon填充一个多边形区域FillRectangle填充一个矩形区域FillRectangles用同一个画刷填充一系列矩形区域FillRegion填充—区域(Region)的内部下面的代码是通过路径用两条样条曲线构造一个复杂的区域,然后填充它,其结果如图7.13所示。m_hDC);Penpen(Color::Blue,3);Pointpoint1(50,200);Pointpoint2(100,150);Pointpoint3(160,180);Pointpoint4(200,200);Pointpoint5(230,150);Pointpoint6(220,50);Pointpoint7(190,70);Pointpoint8(130,220);PointcurvePoints[8]={pointl,point2,point3,point4,point5,point6,point7,point8);Point*pcurvePoints=curvePoints;GraphicsPathpath;path.AddClosedCurve(curvePoints,8,0.5);PathGradientBrushpthGrBrush(&path);pthGrBrush.SetCenterColor(Color(255,0,0,255));Colorcolors[]={Color(0,0,0,255));INTcount=1;pthGrBrush.SetSurroundColors(colors,&count);graphics.DrawClosedCurve(&pen,curvePoints,8,0.5);graphics.FillPath(&pthGrBrush,&path);几何算法矢量减法设二维矢量P=(x1,y1),Q=(x2,y2)则矢量减法定义为:P-Q=(x1-x2,y1-y2)显然有性质P-Q=-(Q-P)如不加说明,下面所有的点都看作矢量,两点的减法就是矢量相减;矢量叉积设矢量P=(x1,y1),Q=(x2,y2)则矢量叉积定义为:PxQ=x1*y2-x2*y1 得到的是一个标量显然有性质PxQ=-(QxP)Px(-Q)=-(PxQ)如不加说明,下面所有的点都看作矢量,点的乘法看作矢量叉积;叉乘的重要性质:>若PxQ>0,则P在Q的顺时针方向>若PxQ<0,则P在Q的逆时针方向>若PxQ=0,则P与Q共线,但可能同向也可能反向判断点在线段上设点为Q,线段为P1P2,判断点Q在该线段上的依据是:(Q-P1)x(P2-P1)=0且Q在以P1,P2为对角顶点的矩形内判断两线段是否相交我们分两步确定两条线段是否相交:. 快速排斥试验设以线段P1P2为对角线的矩形为R,设以线段Q1Q2为对角线的矩形为T,如果R和T不相交,显然两线段不会相交;, 跨立试验如果两线段相交,则两线段必然相互跨立对方,如图1所示。在图1中,P1P2跨立Q1Q2,则矢量(P1-Q1)和(P2-Q1)位于矢量(Q2-Q1)的两侧,即(P1-Q1)x(Q2-Q1)*(P2-Q1)x(Q2-Q1)<0上式可改写成(P1-Q1)x(Q2-Q1)*(Q2-Q1)x(P2-Q1)>0当(P1-Q1)x(Q2-Q1)=0时,说明(P1-Q1)和(Q2-Q1)共线,但是因为已经通过快速排斥试验,所以P1一定在线段Q1Q2上;同理,(Q2-Q1)x(P2-Q1)=0说明P2一定在线段Q1Q2上。所以判断P1P2跨立Q1Q2的依据是:(P1-Q1)x(Q2-Q1)*(Q2-Q1)x(P2-Q1)>0同理判断Q1Q2跨立P1P2的依据是:(Q1-P1)x(P2-P1)*(P2-P1)x(Q2-P1)>0至此已经完全解决判断线段是否相交的问题。判断线段和直线是否相交如果线段P1P2和直线Q1Q2相交,则P1P2跨立Q1Q2,即:(P1-Q1)x(Q2-Q1)*(Q2-Q1)x(P2-Q1)>0判断矩形是否包含点只要判断该点的横坐标和纵坐标是否夹在矩形的左右边和上下边之间。判断线段、折线、多边形是否在矩形中因为矩形是个凸集,所以只要判断所有端点是否都在矩形中就可以了。判断矩形是否在矩形中只要比较左右边界和上下边界就可以了。判断圆是否在矩形中圆在矩形中的充要条件是:圆心在矩形中且圆的半径小于等于圆心到矩形四边的距离的最小值。判断点是否在多边形中以点P为端点,向左方作射线L,由于多边形是有界的,所以射线L的左端一定在多边形外,考虑沿着L从无穷远处开始自左向右移动,遇到和多边形的第一个交点的时候,进入到了多边形的内部,遇到第二个交点的时候,离开了多边形,……所以很容易看出当L和多边形的交点数目C是奇数的时候,P在多边形内,是偶数的话P在多边形外。但是有些特殊情况要加以考虑。如果L和多边形的顶点相交,有些情况下交点只能计算一个,有些情况下交点不应被计算(自己画个图就明白了);如果L和多边形的一条边重合,这条边应该被忽略不计。为了统一起见,我们在计算射线L和多边形的交点的时候,1。对于多边形的水平边不作考虑;2。对于多边形的顶点和L相交的情况,如果该顶点是其所属的边上纵坐标较大的顶点,则计数,否则忽略;3。对于P在多边形边上的情形,直接可判断P属于多边行。由此得出算法的伪代码如下:count—0;以P为端点,作从右向左的射线L;fOr多边形的每条边sdoifP在边s上thenreturntrue;ifs不是水平的thenifs的一个端点在L上且该端点是s两端点中纵坐标较大的端点thencount—count+1elseifs和L相交thencount—count+1;ifcountmod2=1thenreturntrueelsereturnfalse;其中做射线L的方法是:设P'的纵坐标和P相同,横坐标为正无穷大(很大的一个正数),则P和P'就确定了射线L。这个算法的复杂度为O(n)。判断线段是否在多边形内线段在多边形内的一个必要条件是线段的两个端点都在多边形内;如果线段和多边形的某条边内交(两线段内交是指两线段相交且交点不在两线段的端点),因为多边形的边的左右两侧分属多边形内外不同部分,所以线段一定会有一部分在多边形外。于是我们得到线段在多边形内的第二个必要条件:线段和多边形的所有边都不内交;线段和多边形交于线段的两端点并不会影响线段是否在多边形内;但是如果多边形的某个顶点和线段相交,还必须判断两相邻交点之间的线段是否包含与多边形内部。因此我们可以先求出所有和线段相交的多边形的顶点,然后按照X-Y坐标排序,这样相邻的两个点就是在线段上相邻的两交点,如果任意相邻两点的中点也在多边形内,则该线段一定在多边形内。证明如下:命题1:如果线段和多边形的两相邻交点P1,P2的中点P'也在多边形内,则P1,P2之间的所有点都在多边形内。证明:假设P1,P2之间含有不在多边形内的点,不妨设该点为Q,在P1,P'之间,因为多边形是闭合曲线,所以其内外部之间有界,而P1属于多边行内部,Q属于多边性外部,P'属于多边性内部,P1-Q-P完全连续,所以P1Q和QP'一定跨越多边形的边界,因此在P1,P'之间至少还有两个该线段和多边形的交点,这和P1P2是相邻两交点矛盾,故命题成立。证毕由命题1直接可得出推论:推论2:设多边形和线段PQ的交点依次为P1,P2,Pn,其中Pi和Pi+1是相邻两交点,线段PQ在多边形内的充要条件是:P,Q在多边形内且对于i=1,2,,n-1,Pi,Pi+1的中点也在多边形内。在实际编程中,没有必要计算所有的交点,首先应判断线段和多边形的边是否内交,倘若线段和多边形的某条边内交则线段一定在多边形外;如果线段和多边形的每一条边都不内交,则线段和多边形的交点一定是线段的端点或者多边形的顶点,只要判断点是否在线段上就可以了。至此我们得出算法如下:if线端PQ的端点不都在多边形内thenreturnfalse;点集pointSet初始化为空;for多边形的每条边sdoif线段的某个端点在s上then将该端点加入pointSet;elseifs的某个端点在线段PQ上then将该端点加入pointSet;elseifs和线段PQ相交 //这时候可以肯定是内交thenreturnfalse;将pointSet中的点按照X-Y坐标排序,X坐标小的排在前面,对于X坐标相同的点,Y坐标小的排在前面;forpointSet中每两个相邻点pointSet[i],pointSet[i+1]doifpointSet[i],pointSet[i+1]的中点不在多边形中thenreturnfalse;returntrue;这个算法的复杂度也是O(n)。其中的排序因为交点数目肯定远小于多边形的顶点数目n,所以最多是常数级的复杂度,几乎可以忽略不计。判断折线在多边形内只要判断折线的每条线段是否都在多边形内即可。设折线有m条线段,多边形有n个顶点,则复杂度为O(m*n)。判断多边形是否在多边形内只要判断多边形的每条边是否都在多边形内即可。判断一个有m个顶点的多边形是否在一个有n个顶点的多边形内复杂度为O(m*n)。判断矩形是否在多边形内将矩形转化为多边形,然后再判断是否在多边形内。判断圆是否在多边形内只要计算圆心到多边形的每条边的最短距离,如果该距离大于等于圆半径则该圆在多边形内。计算圆心到多边形每条边最短距离的算法在后文阐述。判断点是否在圆内计算圆心到该点的距离,如果小于等于半径则该点在圆内。判断线段、折线、矩形、多边形是否在圆内因为圆是凸集,所以只要判断是否每个顶点都在圆内即可。判断圆是否在圆内设两圆为01,02,半径分别为r1,r2,要判断02是否在01内。先比较r1,r2的大小,如果r1<r2则02不可能在01内;否则如果两圆心的距离大于r1-r2,则02不在01内;否则02在01内。计算点到线段的最近点如果该线段平行于X轴(Y轴),则过点point作该线段所在直线的垂线,垂足很容易求得,然后计算出垂足,如果垂足在线段上则返回垂足,否则返回离垂足近的端如果该线段不平行于X轴也不平行于Y轴,则斜率存在且不为0。设线段的两端点为pt1和pt2,斜率为:k=(pt2.y-pt1.y)/(pt2.x-pt1.x);该直线方程为:y=k*(x-pt1.x)+pt1.y其垂线的斜率为-1/k,垂线方程为:y=(-1/k)*(x-point.x)+point.y联立两直线方程解得:x=(kA2*pt1.x+k*(point.y-pt1.y)+point.x)/(kA2+1)y=k*(x-pt1.x)+pt1.y;然后再判断垂足是否在线段上,如果在线段上则返回垂足;如果不在则计算两端点到垂足的距离,选择距离垂足较近的端点返回。计算点到折线、矩形、多边形的最近点只要分别计算点到每条线段的最近点,记录最近距离,取其中最近距离最小的点即可。计算点到圆的最近距离如果该点在圆心,则返回UNDEFINED连接点P和圆心0,如果PO平行于X轴,则根据P在O的左边还是右边计算出最近点的横坐标为centerPoint.x-radius或centerPoint.x+radius,如图4(a)所示;如果PO平行于Y轴,则根据P在O的上边还是下边计算出最近点的纵坐标为centerPoint.y+radius或centerPoint.y-radius,如图4(b)所示。如果PO不平行于X轴和Y轴,则PO的斜率存在且不为0,如图4(c)所示。这时直线PO斜率为k=(P.y-O.y)/(P.x-O.x)直线PO的方程为:y=k*(x-P.x)+P.y设圆方程为:(x-O.x)A2+(y-O.y)A2=rA2,联立两方程组可以解出直线PO和圆的交点,取其中离P点较近的交点即可。计算两条共线的线段的交点对于两条共线的线段,它们之间的位置关系有图5所示的几种情况。图5(a)中两条线段没有交点;图5(b)和(d)中两条线段有无穷焦点;图5(c)中两条线段有一个交点。设linel是两条线段中较长的一条,line2是较短的一条,如果linel包含了line2的两个端点,则是图5(d)的情况,两线
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 云南蝴蝶泉导游词
- DB12T 481-2013 洗染业皮具护理服务规范
- 七夕节促销活动策划
- 高等数学教程 上册 第4版 测试题及答案 高数2-测试一 - 答案
- 影响货币供给量的因素有哪些
- 阳江职业技术学院附属实验学校八年级上学期语文第一次月考试卷
- 三年级数学(上)计算题专项练习附答案
- 胶管采购合同(2篇)
- 南京工业大学浦江学院《商务谈判》2023-2024学年第一学期期末试卷
- 江苏盱眙经济开发区圣山路及新海大道道路改造工程施工组织设计
- 三年级数学(上)计算题专项练习附答案集锦
- 历史期中复习课件七年级上册复习课件(部编版2024)
- 7.2.2 先天性行为和学习行为练习 同步练习
- 2024-2025学年八年级物理上册 4.2光的反射说课稿(新版)新人教版
- 《现代管理原理》章节测试参考答案
- 电子元器件有效贮存期、超期复验及装机前的筛选要求
- 2024秋期国家开放大学专科《高等数学基础》一平台在线形考(形考任务一至四)试题及答案
- 怀感恩与爱同行 主题班会课件
- 停车收费系统购买合同范本
- 农村环境长效保洁服务投标方案(技术方案)
- 厂区升级改造项目方案
评论
0/150
提交评论