精华内容
下载资源
问答
  • 五上多边形面积知识点归纳总结与参考题.doc
  • 五上多边形面积知识点归纳总结与参考题1.doc
  • 最新人教版五年级上册数学第六单元《多边形面积》知识点归纳总结--.pdf
  • Unity3D 知识点总结

    千次阅读 2017-09-08 14:08:40
    工作原理:从光源处向物体的所有可见面投射光线,将这些面投影到场景中得到投影面,再将这些投影面与场景中的其他平面求交得出阴影多边形,保存这些阴影多边形信息,然后再按视点位置对场景进行相应处理得到所要求的...

     

    1.什么是渲染管道?

    是指在显示器上为了显示出图像而经过的一系列必要操作。 渲染管道中的很多步骤,都要将几何物体从一个坐标系中变换到另一个坐标系中去。

    主要步骤有:

    本地坐标->视图坐标->背面裁剪->光照->裁剪->投影->视图变换->光栅化。

     

    2.如何优化内存?

    有很多种方式,例如

    1.压缩自带类库;

    2.将暂时不用的以后还需要使用的物体隐藏起来而不是直接Destroy掉;

    3.释放AssetBundle占用的资源;

    4.降低模型的片面数,降低模型的骨骼数量,降低贴图的大小;

    5.使用光照贴图,使用多层次细节(LOD),使用着色器(Shader),使用预设(Prefab)。

     

    3.动态加载资源的方式?

    1.Resources.Load();

    2.AssetBundle

    1.通过Resources模块,调用它的load函数:可以直接load并返回某个类型的Object,前提是要把这个资源放在Resource命名的文件夹下,Unity不关有没有场景引用,都会将其全部打入到安装包中。Resources.Load();

    2.通过bundle的形式:即将资源打成 asset bundle 放在服务器或本地磁盘,然后使用WWW模块get 下来,然后从这个bundle中load某个object。AssetBundle

    3.通过AssetDatabase.loadasset :这种方式只在editor范围内有效,游戏运行时没有这个函数,它通常是在开发中调试用的

    【AssetDatabase 资源数据库】

    区别:Resources的方式需要把所有资源全部打入安装包,这对游戏的分包发布(微端)和版本升级(patch)是不利的,所以unity推荐的方式是不用它,都用bundle的方式替代,把资源达成几个小的bundle,用哪个就load哪个,这样还能分包发布和patch,但是在开发过程中,不可能没更新一个资源就打一次bundle,所以editor环境下可以使用AssetDatabase来模拟,这通常需要我们封装一个dynamic resource的loader模块,在不同的环境下做不同实现。 动态资源的存放有时我需要存放一些自己的文件在磁盘上,例如我想把几个bundle放在初始的安装里, unity有一个streaming asset的概念,用于提供存储接口的访问。我们需要在编辑器建立一个StreamingAssets名字的文件夹,把需要我们放在客户磁盘上的动态文件放在这个文件夹下面,这样安装后,这些文件会放在用户磁盘的指定位置,这个位置可以通过Application.streamingAssetsPath来得到。

     

    4.什么是协同程序?

    在主线程运行时同时开启另一段逻辑处理,来协助当前程序的执行。换句话说,开启协程就是开启一个线程。可以用来控制运动、序列以及对象的行为。

     

    5.你用过哪些插件?

    一 界面制作 推荐:NGUI

    二 2D游戏制作 推荐:2D Toolkit /工具包,工具箱

    三 可视化编程 推荐:PlayMaker

    四 插值插件 推荐:iTween,HOTween

    五 路径搜寻 推荐:Simple Path

    六 美术及动画制作 推荐:RageSpline,Smooth Moves

    七 画面增强 推荐:Bitmap2Material,Strumpy Shader Editor

    八 摄像机管理 推荐:Security Camera

    九 资源包 推荐:Nature Pack

    十、造路插件EasyRoads3D

     

    6.使用Unity3d实现2d游戏,有几种方式?

    1.使用本身的GUI;

    2.把摄像机的Projection(投影)值调为Orthographic(正交投影),不考虑z轴;

    3.使用2d插件,如:2DToolKit;

     

    7.Unity3d中的碰撞器和触发器的区别?

    触发器只是碰撞器身上的一个属性,碰撞器是触发器的载体。

    碰撞器有碰撞的效果,IsTrigger=false,可以调用OnCollisionEnter/Stay/Exit函数;

    触发器没有碰撞效果,IsTrigger=true,可以调用OnTriggerEnter/Stay/Exit函数。

    a.如果不想让碰撞检测影响物体移动但是又想检测到碰撞这时用到触发器(Trigger)

    b.触发器用来检测一个物件是否经过空间中的某个区域

     

    8.物体发生碰撞的必要条件

    两个物体都必须带有碰撞器(Collider),其中一个物体还必须带有Rigidbody刚体。

     

    8.1 CharacterController和Rigidbody的区别?

    CharacterController自带胶囊碰撞器,里面包含有刚体的属性;

    Rigidbody就是刚体,使物体带有刚体的特征。

    [CharacterController:角色控制器]Rigidbody具有完全真实物理的特性,而CharacterController可以说是受限的Rigidbody,具有一定的物理效果但不是完全真实的

     

    9.在物体发生碰撞的整个过程中,有几个阶段,分别列出对应的函数三个阶段

    1.OnCollisionEnter(进入碰撞)

    2.OnCollisionStay (逗留碰撞)

    3.OnCollisionExit(当退出碰撞)

     

    10.Unity3d的物理引擎中,有几种施加力的方式,分别描述出来

    rigidbody.AddForce/AddForceAtPosition,都在rigidbody系列函数中。

     

    11.什么叫做链条关节?

    Hinge Joint,可以模拟两个物体间用一根链条连接在一起的情况,能保持两个物体在一个固定距离内部相互移动而不产生作用力,但是达到固定距离后就会产生拉力。

     

    12.物体自身旋转使用的函数?

    Transform.Rotate()

     

    13.物体围绕某点旋转使用的函数?

    Transform.RotateAround()

     

     

    14.Unity3d提供了一个用于保存和读取数据的类(PlayerPrefs),请列出保存和读取整形数据的函数

    PlayerPrefs.SetInt()

    PlayerPrefs.GetInt()

     

    15.Unity3d提供了几种光源类型,分别是哪几种?

    四种。

    平行光:Directional Light

    点光源:Point Light

    聚光灯:Spot Light

    区域光源:Area Light

     

    16.Unity3d脚本从唤醒到销毁有着一套比较完整的生命周期,请列出系统自带的几个重要的方法。

    Awake—>Start—>Update—>FixedUpdate—>LateUpdate—>OnGUI—>Reset—>OnDisable—>OnDestroy

     

    17.物理更新一般放在哪个系统函数里?

    FixedUpdate,每固定帧绘制时执行一次,和Update不同的是FixedUpdate是渲染帧执行,如果你的渲染效率低下的时候FixedUpdate调用次数就会跟着下降。FixedUpdate比较适用于物理引擎的计算,因为是跟每帧渲染有关。Update就比较适合做控制。

     

    18.移动摄像机的动作放在哪个系统函数中,为什么放在这个函数中?

    LateUpdate,在每帧执行完毕调用,它是在所有Update结束后才调,比较适合用于命令脚本的执行。官网上例子是摄像机的跟随,都是在所有Update操作完才跟进摄像机,不然就有可能出现摄像机已经推进了,但是视角里还未有角色的空帧出现。

     

    19.当游戏中需要频繁创建一个物体时,我们需要怎样做能够节省内存?

    使用预制物体对象Prefab,然后复制创建。

     

    20.在场景中放置多个Camera并同时处于活动状态会发生什么?

    游戏界面可以看到很多摄像机的混合。

     

    21.请描述Prefab的作用,并描述如何在移动设备的环境下恰当的使用它?

    Prefab在实例化的时候用到,主要用于经常会用到的物体,属性方便修改。

     

    22.请简述Unity3d下如何安全的在不同工程间迁移asset数据,请列举出三种方法?

    1.可以把assets目录和Library目录一起迁移

    2.导出包

    3.用Unity带的assets Server功能

     

    23.请描述游戏动画有哪几种,以及其原理?

    主要有关节动画、骨骼动画、单一网格模型动画(关键帧动画)。

    a.关节动画:把角色分成若干独立部分,一个部分对应一个网格模型,部分的动画连接成一 个整体的动画,角色比较灵活,Quake2中使用这种动画;

    b.骨骼动画,广泛应用的动画方式,集成了以上两个方式的优点,骨骼按角色特点组成一定的层次结构,有关节相连,可做相对运动,皮肤作为单一网格蒙在骨骼之外,决定角色的外观;

    c.单一网格模型动画由一个完整的网格模型构成,在动画序列的关键帧里记录各个顶点的原位置及其改变量,然后插值运算实现动画效果,角色动画较真实。

     

    24.请描述为什么Unity3d中会发生在组件上出现数据丢失的情况

    一般是组件上绑定的物体对象被删除了

     

    25.alpha blend工作原理

    Alpha Blend 实现透明效果,不过只能针对某块区域进行alpha操作,透明度可设。

     

    26.写出光照计算中的diffuse的计算公式

    计算公式为: Idiffuse = Dintensity*Dcolor*N.L ; (Dintensity表示漫反射强度,

    Dcolor 表示漫反射光颜色,

    N 为该点的法向量,

     L 为光源向量 其中N与L点乘,如果结果小于等于0,则漫反射为0。

     

    27.Lod是什么,优缺点是什么?

    LOD(Level of detail)多层次细节,是最常用的游戏优化技术。它按照模型的位置和重要程度决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。

     

    28.两种阴影判断的方法、工作原理。

    A.阴影由两部分组成:本影与半影

    a.本影:景物表面上那些没有被光源直接照射的区域(全黑的轮廓分明的区域)

    b.半影:景物表面上那些被某些特定光源直接照射但并非被所有特定光源直接照射的区域(半明半暗区域)

    求阴影区域的方法:做两次消隐过程

    一次对每个光源进行消隐,求出对于光源而言不可见的区域L;

    一次对视点的位置进行消隐,求出对于视点而言可见的面S;

    shadow area= L ∩ S

    B.阴影分为两种:自身阴影和投射阴影

    自身阴影:因物体自身的遮挡而使光线照射不到它上面的某些可见面

    工作原理:利用背面剔除的方法求出,即假设视点在点光源的位置。

    投射阴影:因不透明物体遮挡光线使得场景中位于该物体后面的物体或区域受不到光照照射而形成的阴影

    工作原理:从光源处向物体的所有可见面投射光线,将这些面投影到场景中得到投影面,再将这些投影面与场景中的其他平面求交得出阴影多边形,保存这些阴影多边形信息,然后再按视点位置对场景进行相应处理得到所要求的视图(利用空间换时间,每次只需依据视点位置进行一次阴影计算即可,省去了一次消隐过程)若是动态光源此方法就无效了。

     

    29.Vertex Shader是什么,怎么计算?

    顶点着色器

    顶点着色器是一段执行在GPU上的程序,用来取代fixed pipeline中的transformation和lighting,Vertex Shader主要操作顶点。

    Vertex Shader对输入顶点完成了从local space到homogeneous space(齐次空间)的变换过程,homogeneous space即projection space的下一个space。在这其间共有world transformation, view transformation和projection transformation及lighting几个过程。

     

    30.MipMap是什么,作用?

    MipMapping:在三维计算机图形的贴图渲染中有常用的技术,为加快渲染进度和减少图像锯齿,贴图被处理成由一系列被预先计算和优化过的图片组成的文件,这样的贴图被称为MipMap。

     

    31.机试:二选一

    1.用代码实现第三角色控制器

    2.实现吊机吊物体的功能

    【吊机吊物体需要节点挂接和坐标系转换】

     

    32.反向旋转动画的方法是什么?

    【反转动画,讲动画的速度调到-1,碰撞时,被碰撞物体与碰撞物体有collider组件,碰撞物体有刚体组件,或角色碰撞得包含角色组件 OR 改变animation.speed】

     

    33.碰撞检测需要物体具备什么属性?

    能检测碰撞发生的方式有两种,一种是利用碰撞器,另一种则是利用触发器

    【Physics.OverlapSphere相交球检测碰撞,碰撞检测需要包围盒】

     

    34.获取、增加、删除组件的命令分别是什么?

    获取:GetComponent

    增加:AddComponent

    删除:Destroy

     

    35.Animation.CrossFade命令作用是:(C)

     A.动画放大        B.动画转换   C.动画的淡入为其他动画

     

    36.Application.loadLevel命令为:(A)

    A加载关卡   B.异步加载关卡   C.加载动作

     

    37.调试记录到控制台的命令是什么?

    Debug.Log();

     

    39.编辑器类存放路径是什么?

    工程目录下的Assets/Editor文件夹下。

     

    40.使用原生GUI创建一个可以拖动的窗口命令是什么?

    GUI.DragWindow();

     

    41.localPosition与Position的使用区别?

    localPosition:自身位置,相对于父级的变换的位置。 、Position:在世界坐标transform的位置

     

    42.写一个计时器工具,从整点开始计时,格式为:00:00:00

     

    43.写出Animation的五个方法

    AddClip 添加剪辑、

    Blend 混合、

    Play 播放、

    Stop 停止、

    Sample 采样

     

    44.怎么拿到一个对象上脚本的方法

    GameObject.GetComponent<>();

     

    45.请简述向量的点乘,向量的叉乘以及向量归一化的几何意义?

    点乘的几何意义是:计算两个向量之间的夹角,以及在某一方向上的投影;

    叉乘的几何意义是:创建垂直于平面,三角形,或者多边形的向量;

     

    46.Unity3D是否支持写成多线程?如果支持的话要注意什么?

    支持:如果同时你要处理很多事情或者与Unity的对象互动小可以用thread,否则使用coroutine.

    注意:C#中有lock这个关键字,以确保只有一个线程可以在特定时间内访问特定的对象

     

    47.Unity3D中的协程(Coroutine)和C#线程之间的区别是什么?

    Unity3d没有多线程的概念,不过unity也给我们提供了StartCoroutine(协同程序)和LoadLevelAsync(异步加载关卡)后台加载场景的方法。 StartCoroutine为什么叫协同程序呢,所谓协同,就是当你在StartCoroutine的函数体里处理一段代码时,利用yield语句等待执行结果,这期间不影响主程序的继续执行,可以协同工作。而LoadLevelAsync则允许你在后台加载新资源和场景,所以再利用协同,你就可以前台用loading条或动画提示玩家游戏未卡死,同时后台协同处理加载的事宜asynchronous[e??s??kr?n?s].synchronous同步

     

    48.请简述四元数的作用以及四元数相对于欧拉角的优点

    A.四元数一般定义如下:q=w+xi+yj+zk其中 w,x,y,z是实数。同时,有: i*i=-1 j*j=-1 k*k=-1

    B.四元数也可以表示为: q=[w,v]

    有多种方式可表示旋转,如 axis/angle、欧拉角(Euler angles)、矩阵(matrix)、四元组等。 相对于其它方法,四元组有其本身的优点:

    a.四元数不会有欧拉角存在的 gimbal lock 问题[万向节死锁]

    b.四元数由4个数组成,旋转矩阵需要9个数

    c.两个四元数之间更容易插值

    d.四元数、矩阵在多次运算后会积攒误差,需要分别对其做规范化(normalize)和正交化 (orthogonalize),对四元数规范化更容易 e.与旋转矩阵类似,两个四元组相乘可表示两次旋转

     

    49.请简述OnBecameVisible及OnBecameInvisible的发生时机,以及他们执行的意义?

    当renderer(渲染器)在任何相机上都不可见时调用:OnBecameInvisible

    当renderer(渲染器)在任何相机上可见时调用:OnBecameVisible

     

    50.动画层(Animation Layers)的作用是什么?

    动画层作为一个具有层级动画编辑概念的工具,可以用来制作和处理任何类型的动画

     

    51.请说出4种面向对象的设计原则,并分别简述它们的含义。

    1) 单一职责原则 (The Single Responsiblity Principle,简称SRP):一个类,最好只做一件事,只有一个引起它的变化.

    2) 开放-封闭原则 (The Open-Close Principle,简称OCP):对于扩展是开放的,对于更改是封闭的

    3) Liskov 替换原则(The Liskov Substitution Principle,简称LSP):子类必须能够替换其基类

    4) 依赖倒置原则(The Dependency Inversion Pricinple,简称DIP):依赖于抽象

    5) 接口隔离原则 (The Interface Segregation Principle,简称ISP):使用多个小的专门的接口,而不要使用一个大的总接口。

     

    52.Material和Physic Material区别?

    PhysicMaterial 物理材质:物理材质描述,如何处理物体碰撞(摩擦,弹性)。

    Material材质(材质类)为了获得一个对象使用的材质,可以使用 Renderer.materia属性:

     

     

    53.法线贴图 、CG动画

    A.法线贴图:是在原物体的凹凸表面的每个点上均作法线,通过RGB颜色通道来标记法线的方向,你可以把它理解成与原凹凸表面平行的另一个不同的表面,但实际上它又只是一个光滑的平面。

    B.CG动画:原为Computer Graphics的英文缩写。随着以计算机为主要工具进行视觉设计和生产的一系列相关产业的形成,国际上习惯将利用计算机技术进行视觉设计和生产的领域通称为CG。它既包括技术也包括艺术,几乎囊括了当今电脑时代中所有的视觉艺术创作活动,如平面印刷品的设计、网页设计、三维动画、影视特效、多媒体技术、以计算机辅助设计为主的建筑设计及工业造型设计等。 NGUI(NUGUI1、NGUI2)

     

    54. 如何销毁一个UnityEngine.Object及其子类?

    使用Destroy()方法;

     

    55、请描述游戏动画有哪几种,以及其原理。

    主要有关节动画、单一网格模型动画(关键帧动画)、骨骼动画。

    a、关节动画把角色分成若干独立部分,一个部分对应一个网格模型,部分的动画连接成一个整体的动画,角色比较灵活Quake2([kwe?k]vi.发抖,颤抖;)中使用了这种动画;

    b、 单一网络模型动画由一个完整的网格模型构成,在动画序列的关键帧里记录各个顶点的原位置及其改变量,然后插值运算实现动画效果,角色动画较真实。

    c、骨骼动画,广泛应用的动画方式,集成了以上两个方式的优点,骨骼按角色特点组成一定的层次结构,由关节相连,可做相对运动,皮肤作为单一网格蒙在骨骼之外,决定角色的外观。皮肤网格每一个顶点都会受到骨骼的影响,从而实现完美的动画

     

    56、下面哪种做法可以打开Unity的Asset Store

    Windows -> Asset Store

     

    57、Mecanim系统中,Body Mask的作用是?

    指定身体的某一部分是否参与渲染

     

    58、以下哪种操作步骤可以打开Unity编辑器的Lightmapping视图?

    Windows –> Lightmapping

     

    59、关于光照贴图

    A:使用光照贴图比使用实时光源渲染要快

    B:可以降低游戏内存消耗

    C、多个物体可以使用同一张光照贴图

     

    60、关于Vector3的API,以下说法正确的是?

    Vector3.forward与Vector3(0,0,1)是一样的意思;

     

    61、 什么是导航网格( NavMesh)?

    一种用于实现自动寻路的网格

     

    62、什么是局部坐标,什么是世界坐标?

    世界坐标是不会变的,一直以世界坐标轴的XYZ为标准。局部坐标其实就是自身的坐标,会随着物体的旋转而变化的。

     

    63、itween插件的作用是什么,itween作用于世界坐标还是局部坐标,请列举出3个其常用方法?

    iTween是一个动画库,作者创建它的目的就是最小的投入实现最大的产出。让你做开发更轻松,用它可以轻松实现各种动画,晃动,旋转,移动,褪色,上色,控制音频等等“

    方法:

    a、MoveTo 物体移动 ;

    b、ColorTo:随着时间改变对象的颜色组;

    c、LookTo:随时间旋转物体让其脸部朝向所提供的Vector3或Transform位置

     

    64、请简述NGUI中Panel和Anchor的作用

    Anchor包含UIAnchor脚本。UIAnchor的功能是把对象锚定在屏幕的边缘(左上,左中,左下,上,中,下,右上,右中,右下),或缩放物体使其匹配屏幕的尺寸Panel对象有UIPanel脚本,UIPanel是一个容器,它将包含所有UI小部件,并负责将所包含的部件组合优化、承载,以减少绘制命令的调用。

     

    65、Unity摄像机有几种工作方式,分别是什么?

    perspective透视摄像机和orthographic正交摄像机

     

    66、LayerMask.NameToLayer()这个方法有什么作用?

    LayerMask的使用是按位操作的,LayerMask.NameToLayer(“Players”) 返回该Layer的编号。

     

    67、请描述MeshRender中material和shader的区别?

    Shader(着色器)实际上就是一小段程序,它负责将输入的Mesh(网格)以指定的方式和输入的贴图或者颜色等组合作用,然后输出。绘图单元可以依据这个输出来将图像绘制到屏幕上。输入的贴图或者颜色等,加上对应的Shader,以及对Shader的特定的参数设置,将这些内容(Shader及输入参数)打包存储在一起,得到的就是一个Material(材质)

    Shader大体上可以分为两类:

    表面着色器(Surface Shader) 、

    片段着色器(Fragment Shader)

     

    68、什么是矢量图

    矢量图:计算机中显示的图形一般可以分为两大类——矢量图和位图。矢量图使用直线和曲线来描述图形,这些图形的元素是一些点、线、矩形、多边形、圆和弧线等等,它们都是通过数学公式计算获得的。例如一幅花的矢量图形实际上是由线段形成外框轮廓,由外框的颜色以及外框所封闭的颜色决定花显示出的颜色。由于矢量图形可通过公式计算获得,所以矢量图形文件体积一般较小。矢量图形最大的优点是无论放大、缩小或旋转等不会失真;最大的缺点是难以表现色。

     

    69. 上机题:用鼠标实现在场景中拖动物体,用鼠标滚轮实现缩放(用一个Cube即可)。

     

    70、 以下哪个函数在游戏进入新场景后会被马上调用?

    MonoBehaviour.OnLevelWasLoaded

     

    71、Unity3D方法执行的顺序:

    1、Awake( ),2、Start( )(激活时的初始化代码)

    3、Update( )【FixUpdate、LateUpdate】、

    4、OnGUI(渲染模块)

    5、然后是卸载模块(TearDown),这里主要有两个方法OnDisable( )与OnDestroy( )

     

    72.数学函数

    Mathf.Round;四舍五入;  Mathf.Clamp 限制 ;   Mathf.Lerp 插值;

     

    展开全文
  • 线性代数知识点总结

    千次阅读 2019-11-24 14:18:40
    线性代数知识点总结 本文秉承着“将书读薄”的思想将《线性代数》和《程序员的数学——线性代数》中的知识点进行凝练总结,以便以后时常复习。 —————————————————————————————— ...

    线性代数知识点总结

    本文秉承着“将书读薄”的思想将《线性代数》和《程序员的数学——线性代数》中的知识点进行凝练总结,以便以后时常复习。
    ———————————————————————————————————

    1.矩阵

    1.1 矩阵的几何意义:

    矩 阵 = 映 射 矩阵 = 映射 =
    矩阵表示一种映射关系

    1. m*n维矩阵表示从n维空间到m维空间的映射
    2. 映射相同则矩阵相同
    3. 矩阵的乘积 = 映射的合成
    4. 矩阵的乘方 = 映射的迭代
    5. 矩阵的列向量表示各个坐标轴方向上的单位向量经过映射之后到达的目标点

    1.2 矩阵的运算关系

    加法
    数乘
    矩阵乘法
    线性空间:满足加法和数乘运算的空间

    1.3 不同形态的矩阵

    1.对角矩阵:除对角线元素外,其余元素均为零。表示的映射关系为——沿各个坐标轴方向的伸缩。
    2.单位矩阵:对角线元素为1,其余元素为零的矩阵。表示的映射关系为——什么都不做。
    3.逆矩阵 A A − 1 = A − 1 A = I AA^{-1} = A^{-1}A=I AA1=A1A=I,则 A A A A − 1 A^{-1} A1互为逆矩阵.

    1. ( A − 1 ) − 1 = A , ( A − 1 ) K = ( A K ) − 1 (A^{-1})^{-1}=A , (A^{-1})^{K}=(A^{K})^{-1} (A1)1=A,(A1)K=(AK)1
    2. ( A B ) − 1 = B − 1 A − 1 (AB)^{-1} = B^{-1}A^{-1} (AB)1=B1A1说明先 B B B A A A的映射要进行还原的话,需要先逆 A A A后逆 B B B
    3. 对角矩阵的逆 = 对角矩阵对角线元素分之1。

    4.分块矩阵:普通矩阵的一般性质同样适用于分块矩阵;分块矩阵不可以分得不均匀。

    5. x T y 和 x y T x^{T}y和xy^{T} xTyxyT: x 和 y x和y xy均表示列向量,则 x T y x^{T}y xTy的结果为数字, x y T xy^{T} xyT的结果为矩阵。(先横后竖为数字,先竖后横为矩阵)。

    6.伴随矩阵: A A ∗ = A ∗ A = ∣ A ∣ I AA^{*} = A^{*}A=|A|I AA=AA=AI
    7.转置矩阵: ( A B ) T = B T A T (AB)^T =B^TA^T (AB)T=BTAT , ( A − 1 ) T = ( A T ) − 1 (A^{-1})^T=(A^{T})^{-1} (A1)T=(AT)1

    1.4 矩阵的初等变换

    初等行变换:

    1. 两行对调
    2. 以数 k k k 乘以某一行所有元素
    3. 把某一行所有元素乘以数 k k k后加到另一行。
      初 等 变 换 = 初 等 行 变 换 + 初 等 列 变 换 初等变换 = 初等行变换+初等列变换 =+

    初等变换之后,原矩阵与变换后的矩阵等价,即 A A A~ B B B

    矩阵等价的性质:

    1. 反身性: A A A~ A A A
    2. 对称性: A A A~ B B B,则 B B B~ A A A
    3. 传递性: A A A~ B B B B B B ~ C C C,则 A A A~ C C C

    -------------------------- A A A~ B B B的充要条件是:存在n阶可逆矩阵 P P P和n阶可逆矩阵 Q Q Q,使得 P A Q = B PAQ = B PAQ=B--------------------------

    2.行列式

    2.1 行列式的几何意义

    矩阵表示的是一种映射关系;行列式表示经过对应矩阵的映射之后,多边形体积扩大率。
    行 列 式 = 体 积 扩 大 率 行列式 = 体积扩大率 =

    2.2 行列式的性质

    一般性质:

    1. d e t ( I ) = 1 det(I) = 1 det(I)=1
    2. d e t ( A B ) = d e t ( A ) d e t ( B ) det(AB)=det(A)det(B) det(AB)=det(A)det(B)
    3. d e t ( A − 1 ) = 1 d e t ( A ) det(A^{-1}) = \frac{1}{det(A)} det(A1)=det(A)1
    4. d e t ( A ) = 0 det(A) = 0 det(A)=0 时, A − 1 A^{-1} A1不存在
    5. d e t ( d i a g ( a 1 , a 2 , . . . a n ) ) = a 1 a 2 . . . a n det(diag(a_{1},a_{2},...a_{n})) = a_{1}a_{2}...a_{n} det(diag(a1,a2,...an))=a1a2...an

    特殊性质:

    1. 行列式的某一列乘以常数加到另一列,行列式值不变(底面积不变,高不变)
      在这里插入图片描述
    2. d e t ( A T ) = d e t ( A ) det(A^{T}) = det(A) det(AT)=det(A)
    3. d e t ( c a 1 , a 2 . . . a n ) = c ∗ d e t ( a 1 , a 2 . . . a n ) det(ca_{1},a_{2}...a_{n}) =c* det(a_{1},a_{2}...a_{n}) det(ca1,a2...an)=cdet(a1,a2...an)
      在这里插入图片描述
    4. d e t ( a 1 + a 1 ′ , a 2 . . . a n ) = d e t ( a 1 , a 2 . . . a n ) + d e t ( a 1 ′ , a 2 . . . a n ) det(a_{1}+a'_{1},a_{2}...a_{n}) =det(a_{1},a_{2}...a_{n})+det(a'_{1},a_{2}...a_{n}) det(a1+a1,a2...an)=det(a1,a2...an)+det(a1,a2...an)

    在这里插入图片描述

    2.3 行列式的计算方法

    3.线性方程组

    3.1 顺问题与逆问题

    顺问题:从原因 x x x出发去预测结果 y y y的问题。
    逆问题:已知结果 y y y去推测原因 x x x的问题。
    ------------------------------------------------------线性代数中主要解决的是逆问题--------------------------------------------

    3.2 良性问题

    1.问题定义:对于 y = A x y=Ax y=Ax问题, A A A可逆。由于 A A A可逆,则线性方程组有唯一解。

    2.求解方法

    1. 消元法(初中生方法)
    2. 用分块矩阵表示线性方程组
      A x = y Ax=y Ax=y    ⟹    \implies ( A ∣ y ) ( x − 1 ) = 0 (A|y)(\frac{x}{-1})=0 (Ay)(1x)=0    ⟹    \implies ( I ∣ s ) ( x − 1 ) = 0 (I|s)(\frac{x}{-1})=0 (Is)(1x)=0
      利用初等变换将 A A A变换为单位矩阵,则 y y y对应列 s s s为线性方程组的解
      *注:此过程中可以互换两行来选择主元,结果不变。

    3.2 恶性问题

    1.恶性问题的分类

    与良性问题不同,恶性问题分为多种情况。

    • 恶性问题1——线索不足
      y = A x y=Ax y=Ax x x x是n维向量,y是m维向量, m < n m<n m<n。该种恶性问题成为线索不足,此时A为矮矩阵
      这种情况下,线性方程组的解有无数种可能,即有无穷解。

    • 恶性问题2——线索过剩
      y = A x y=Ax y=Ax x x x是n维向量,y是m维向量, m > n m>n m>n。该种恶性问题成为线索过剩,此时A为长矩阵

    • 恶性问题3——奇异矩阵
      y = A x y=Ax y=Ax x x x是n维向量,y是m维向量, m = n m=n m=n,但矩阵 A A A为奇异矩阵。 这种情况下,线性方程组的无解。

    2.问题的恶性程度

    单射:对应相同的结果 y y y,引起它的原因 x x x是唯一的。
    满射:无论什么样的结果 y y y,都可以找到它相应的原因。
    双射:既是单射又是满射


    :对于矩阵 A A A,满足 A x = 0 Ax=0 Ax=0 x x x称为 A A A的核,记为 K e r A KerA KerA
    :对于矩阵 A A A y = A x y=Ax y=Ax构成的集合称为 A A A的像,记为 I m g A ImgA ImgA。像就是把原空间通过 A A A变换到目标空间中对应的领域。


    K e r A KerA KerA 包含原点    ⟺    \iff 单射
    I m g A ImgA ImgA 与目标空间全体一致    ⟺    \iff 满射

    3.维数定理
    K e r A + I m g A = n KerA +ImgA = n KerA+ImgA=n

    4.线索的实际个数——秩
    A A A m ∗ n m*n mn 维矩阵,将像 I m g A ImgA ImgA的维度命名为矩阵 A A A,记为 r a n k A rankA rankA

    • r a n k A rankA rankA=n(秩与原空间的维度相同)    ⟺    \iff A A A是单射
    • r a n k A rankA rankA=m(秩与目标空间的维度相同)    ⟺    \iff A A A是满射

    秩的性质:

    1. 0 ≤ r a n k A ≤ m a x m , n 0\leq rankA \leq max{m,n} 0rankAmaxm,n
    2. r a n k ( A ) = r a n k ( A T ) rank(A) = rank(A^{T}) rank(A)=rank(AT)
    3. A A A ~ B B B    ⟺    \iff r a n k ( A ) rank(A) rank(A) ~ r a n k ( B ) rank(B) rank(B)
    4. P , Q 可 逆 P,Q可逆 P,Q,则 r a n k ( P A Q ) = r a n k ( A ) rank(PAQ)=rank(A) rank(PAQ)=rank(A)
    5. m a x ( r a n k ( A ) , r a n k ( B ) ) ≤ r a n k ( A , B ) ≤ r a n k ( A ) + r a n k ( B ) max(rank(A),rank(B)) \leq rank(A,B) \leq rank(A)+rank(B) max(rank(A),rank(B))rank(A,B)rank(A)+rank(B)

    秩的求解方法

    3.3 恶性问题与良性问题的判定

    对于方阵 A A A,判定线性方程组 y = A x y =Ax y=Ax的条件是:方阵A是否可逆

    可逆性的等价条件:

    1. 对于任意n维向量 y y y,使得 y = A x y =Ax y=Ax成立的 x x x都只有一个
    2. A A A是可逆矩阵
    3. A A A对应的映射为非“压缩扁平化”映射。
    4. A A A对应的映射为单射
    5. 使得 A x = 0 Ax=0 Ax=0成立的仅有 x = 0 x=0 x=0一个值,即 A x = 0 Ax=0 Ax=0只有零解。
    6. A A A的列向量线性无关
    7. A A A的映射作用下,目标空间可以全部被覆盖,即 A A A对应的映射为满射。
    8. r a n k A = d i m r a n k A = n rankA = dim rankA=n rankA=dimrankA=n
    9. d e t A ≠ 0 detA \neq 0 detA=0
      10. A A A不含0的特征值

    3.4 恶性问题的对策

    3.5线性方程组解的结构

    • A x = 0 Ax=0 Ax=0有非零解    ⟺    \iff r a n k ( A ) < n rank(A)<n rank(A)<n
    • A x = y Ax=y Ax=y有解    ⟺    \iff r a n k ( A ) = r a n k ( A ∣ y ) ≤ n rank(A)=rank(A|y) \leq n rank(A)=rank(Ay)n
      r a n k ( A ) = r a n k ( A ∣ y ) = n rank(A)=rank(A|y) = n rank(A)=rank(Ay)=n时有唯一解
      r a n k ( A ) = r a n k ( A ∣ y ) < n rank(A)=rank(A|y) < n rank(A)=rank(Ay)<n时有无穷解

    对于 A x = 0 Ax=0 Ax=0

    1. x 1 = ξ 1 x_{1}=\xi_{1} x1=ξ1 x 2 = ξ 2 x_{2}=\xi_{2} x2=ξ2 A x = 0 Ax=0 Ax=0的解,则 x = ξ 1 + ξ 2 x=\xi_{1}+\xi_{2} x=ξ1+ξ2也是 A x = 0 Ax=0 Ax=0的解。
    2. x 1 = ξ 1 x_{1}=\xi_{1} x1=ξ1 A x = 0 Ax=0 Ax=0的解,则 x = k ξ 1 x=k\xi_{1} x=kξ1也是 A x = 0 Ax=0 Ax=0的解。
    3. r a n k ( A ) = r rank(A)= r rank(A)=r,则 A x = 0 Ax=0 Ax=0的解集 s s s的秩为 r a n k ( s ) = n − r rank(s)=n-r rank(s)=nr

    对于 A x = y Ax=y Ax=y

    1. x 1 = ξ 1 x_{1}=\xi_{1} x1=ξ1 x 2 = ξ 2 x_{2}=\xi_{2} x2=ξ2 A x = y Ax=y Ax=y的解,则 x = ξ 1 − ξ 2 x=\xi_{1}-\xi_{2} x=ξ1ξ2也是 A x = 0 Ax=0 Ax=0的解。
    2. x 1 = ξ 1 x_{1}=\xi_{1} x1=ξ1 A x = y Ax=y Ax=y的解, x 2 = ξ 2 x_{2}=\xi_{2} x2=ξ2 A x = 0 Ax=0 Ax=0的解,则 A x = y Ax=y Ax=y的解包括 x = ξ 1 + ξ 2 x=\xi_{1}+\xi_{2} x=ξ1+ξ2

    ----------------- A x = y Ax=y Ax=y的通解: A x = 0 Ax=0 Ax=0的通解+ A x = y Ax=y Ax=y的特解--------------------------

    4.LU分解

    给定矩阵A,将 A A A分解为下三角矩阵 L L L(对角新元素为1)乘以上三角矩阵 U U U 的形式,称为 L U 分 解 LU分解 LU

    4.1 LU分解的应用

    1. 利用LU分解求解行列式
      A = L U A=LU A=LU    ⟹    \implies d e t ( A ) = d e t ( L U ) = d e t ( L ) ∗ d e t ( U ) = d e t ( U ) = U 对 角 线 元 素 乘 积 det(A)=det(LU)=det(L)*det(U)=det(U)=U对角线元素乘积 det(A)=det(LU)=det(L)det(U)=det(U)=U线
    2. 利用LU分解求解线性方程组
      对于线性方程组中的良性问题,通过LU分解,则有:
      A x = L U x = L ( U x ) = L z = y Ax=LUx=L(Ux)=Lz=y Ax=LUx=L(Ux)=Lz=y
    3. 利用LU分解求解矩阵的逆
      本质上是求解线性方程组但是只分解一次。

    4.稳定性

    考虑问题:对于 x ( t ) = A x ( t − 1 ) x(t) = Ax(t-1) x(t)=Ax(t1),是否对于任何初始化 x ( 0 ) x(0) x(0) x ( t ) x(t) x(t)的各个分量都不超过一定的范围(不失控)。

    4.1 问题的起源


    x ( t ) = P y ( t ) x(t)=Py(t) x(t)=Py(t),则:

    x ( t ) = A x ( t − 1 ) x(t) = Ax(t-1) x(t)=Ax(t1)    ⟹    \implies y ( t ) = P − 1 x ( t ) = P − 1 A x ( t − 1 ) = P − 1 A P y ( t − 1 ) y(t)=P^{-1}x(t)=P^{-1}Ax(t-1)=P^{-1}APy(t-1) y(t)=P1x(t)=P1Ax(t1)=P1APy(t1)

    y ( t ) = P − 1 A P y ( t − 1 ) y(t)=P^{-1}APy(t-1) y(t)=P1APy(t1)

    Λ = P − 1 A P \Lambda = P^{-1}AP Λ=P1AP 是对角阵,则可以判定系统是否会失控

    ---------------引出问题:如何选取合适的可逆矩阵 P P P,使 P − 1 A P P^{-1}AP P1AP是对角阵-----------------

    P = ( p 1 , p 2 . . . p n ) P=(p_{1},p_{2}...p_{n}) P=(p1,p2...pn) Λ = d i a g ( λ 1 , λ 2 . . . λ n ) \Lambda = diag({\lambda_{1},\lambda_{2}...\lambda_{n}}) Λ=diag(λ1,λ2...λn);则有

    P − 1 A P = Λ P^{-1}AP = \Lambda P1AP=Λ    ⟹    \implies A P = P Λ AP = P\Lambda AP=PΛ    ⟹    \implies A(p_{1},p_{2}…p_{n})= ( p 1 , p 2 . . . p n ) d i a g ( λ 1 , λ 2 . . . λ n ) (p_{1},p_{2}...p_{n})diag(\lambda_{1},\lambda_{2}...\lambda_{n}) (p1,p2...pn)diag(λ1,λ2...λn)

    即:

    A p i = λ i p i , 其 中 i ∈ ( 1 , n ) Ap_{i}=\lambda_{i}p_{i} ,其中 i \in (1,n) Api=λipi,i(1,n)

    ----------------问题转化为:求解向量 p i p_{i} pi λ i \lambda_{i} λi,使其满足 A p i = λ i p i Ap_{i}=\lambda_{i}p_{i} Api=λipi,即求解特征值和特征向量--------------------

    在可以对角化的前提下:

    1. ∣ λ 1 ∣ , ∣ λ 2 ∣ . . . ∣ λ n ∣ |\lambda_{1}|,|\lambda_{2}|...|\lambda_{n}| λ1,λ2...λn之中若有一个大于1,则系统不稳定,有失控的风险
    2. ∣ λ 1 ∣ ∣ λ 2 ∣ . . . ∣ λ n ∣ ≤ 1 |\lambda_{1}||\lambda_{2}|...|\lambda_{n}| \leq 1 λ1λ2...λn1,则没有失控的风险

    4.2 特征值和特征向量

    A p = λ p Ap=\lambda p Ap=λp
    其中 λ \lambda λ为特征值, p p p为特征向量。

    1.特征值的几何意义
    p p p经过矩阵A的映射之后,长度会有伸缩变化,但是方向不会变。长度变换率即为特征值。

    2.特征值性质

    1. 上下三角矩阵的特征值为对角线元素
    2. A A A P − 1 A P P^{-1}AP P1AP 相似,相似矩阵具有相同的特征值。 P − 1 p P^{-1}p P1p是矩阵 P − 1 A P P^{-1}AP P1AP的特征向量。
    3. 行列式的值 = 特征值的乘积
    4. 对角线元素之和 = 特征值之和
    5. d e t ( P − 1 A P ) = d e t ( P − 1 ) d e t ( A ) d e t ( P ) = d e t ( A ) det(P^{-1}AP)=det(P^{-1})det(A)det(P)=det(A) det(P1AP)=det(P1)det(A)det(P)=det(A)
    6. 不相等的特征值对应的特征向量线性无关

    3.特征值的计算

    A p = λ p    ⟹    ( λ I − A ) p = 0 Ap=\lambda p \implies (\lambda I-A)p=0 Ap=λp(λIA)p=0

    计算特征值的过程即为求解特征方程的过程

    结论:n阶方程 A A A的特征方程,在包含重根的情况下恰好有n个

    4.特征向量的计算

    1. 有重根的情况
    2. 无重根的情况

    4.3 对称矩阵的对角化

    1. λ 1 \lambda_{1} λ1 λ 2 \lambda_{2} λ2是对称矩阵 A A A的特征值,若 λ 1 ≠ λ 2 \lambda_{1} \neq \lambda_{2} λ1=λ2,则 λ 1 \lambda_{1} λ1 λ 2 \lambda_{2} λ2对应的特征向量正交。
    2. A A A为n阶对称矩阵,则必有正交矩阵 P P P,使 P T A P = P − 1 A P = Λ P^TAP=P^{-1}AP=\Lambda PTAP=P1AP=Λ,其中 Λ \Lambda Λ是以 A A A的特征值为对角线元素的对角阵
    3. A A A为n阶对称矩阵, λ \lambda λ是特征方程的 k k k重根,则 R ( A − λ I ) = n − k R(A-\lambda I)=n-k R(AλI)=nk λ \lambda λ 的 k 个特征向量线性无关。

    4.4 不可对角化的情况

    当矩阵 A A A不可进行对角化时,系统稳定与否的判定条件:

    1. A A A的特征值中,只要有一个满足 ∣ λ ∣ > 1 |\lambda|>1 λ>1,就有失控的危险。
    2. 若所有的特征值 λ \lambda λ都满足 ∣ λ ∣ < 1 |\lambda|<1 λ<1,则不会失控。
    3. 若所有的特征值 λ \lambda λ都满足 ∣ λ ∣ ≤ 1 |\lambda| \leq 1 λ1,但其中有 ∣ λ ∣ = 1 |\lambda| = 1 λ=1的特征值,则仅凭特征值无法判断。

    5.二次型及其标准型

    5.1定义:

    二次型
    y = x T A x y = x^{T}Ax y=xTAx
    其中 A A A为对称阵

    *注:给定一个二次型能唯一确定一个对称矩阵,反之成立

    合同: A , B A,B AB为 n 阶矩阵,若有可逆矩阵 C C C,使 B = C T A C B =C^{T}AC B=CTAC,则称 A 和 B A和B AB合同。
    **合同的性质:

    1. ** R ( A ) = R ( B ) R(A)=R(B) R(A)=R(B)
    2. A对称,则B对称

    结论:任意给定二次型 f = ∑ i , j = 1 n a i j x i x i f = \sum^{n}_{i,j=1}a_{ij}x_{i}x_{i} f=i,j=1naijxixi,总有正交变换 x = P y x=Py x=Py,使 f f f化为标准型 f = λ 1 y 1 2 + λ 2 y 2 2 . . . λ n y n 2 f=\lambda_1 y^{2}_{1}+\lambda_2 y^{2}_{2}...\lambda_n y^{2}_{n} f=λ1y12+λ2y22...λnyn2。其中 λ \lambda λ A A A的特征值。

    5.2二次型的正定与负定

    二次型正定的充要条件:

    1. 标准型的n个系数全为正
    2. A A A的特征值全为正
    3. A A A的各阶主子式均为正

    二次型负定的充要条件:奇数阶主子式为正,偶数阶主子式为负

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 打印高考立体几何知识点总结 精品文档 精品文档 收集于网络如有侵权请联系管理员删除 收集于网络如有侵权请联系管理员删除 精品文档 收集于网络如有侵权请联系管理员删除 立体几何知识点总结 一 空间几何体 一 空间...
  • 计算几何知识点总结 来源于网络整理 一、引言  计算机的出现使得很多原本十分繁琐的工作得以大幅度简化,但是也有一些在人们直观看来很容易的...

                                                     计算几何知识点总结                                                                                来源于网络整理

    一、引言 

      计算机的出现使得很多原本十分繁琐的工作得以大幅度简化,但是也有一些在人们直观看来很容易的问题却需要拿出一套并不简单的通用解决方案,比如几何问题。作为计算机科学的一个分支,计算几何主要研究解决几何问题的算法。在现代工程和数学领域,计算几何在图形学、机器人技术、超大规模集成电路设计和统计等诸多领域有着十分重要的应用。在本文中,我们将对计算几何常用的基本算法做一个全面的介绍,希望对您了解并应用计算几何的知识解决问题起到帮助。
    二、目录
    本文整理的计算几何基本概念和常用算法包括如下内容:
    1. 矢量的概念
    2. 矢量加减法
    3. 矢量叉积
    4. 折线段的拐向判断
    5. 判断点是否在线段上
    6. 判断两线段是否相交
    7. 判断线段和直线是否相交
    8. 判断矩形是否包含点
    9. 判断线段、折线、多边形是否在矩形中
    10. 判断矩形是否在矩形中
    11. 判断圆是否在矩形中
    12. 判断点是否在多边形中
    13. 判断线段是否在多边形内
    14. 判断折线是否在多边形内
    15. 判断多边形是否在多边形内
    16. 判断矩形是否在多边形内
    17. 判断圆是否在多边形内
    18. 判断点是否在圆内
    19. 判断线段、折线、矩形、多边形是否在圆内
    20. 判断圆是否在圆内
    21. 计算点到线段的最近点
    22. 计算点到折线、矩形、多边形的最近点
    23. 计算点到圆的最近距离及交点坐标
    24. 计算两条共线的线段的交点
    25. 计算线段或直线与线段的交点
    26. 求线段或直线与折线、矩形、多边形的交点
    27. 求线段或直线与圆的交点
    28. 凸包的概念
    29. 凸包的求法
    三、算法介绍
    1.矢量的概念:
      如果一条线段的端点是有次序之分的,我们把这种线段成为有向线段(directed segment)。如果有向线段p1p2的起点p1在坐标原点,我们可以把它称为矢量(vector)p2。
    2.矢量加减法:
       设二维矢量P = ( x1, y1 ),Q = ( x2 , y2 ),则矢量加法定义为: P + Q = ( x1 + x2 , y1 + y2 ),同样的,矢量减法定义为: P - Q = ( x1 - x2 , y1 - y2 )。显然有性质 P + Q = Q + P,P - Q = - ( Q - P )。
    3.矢量叉积:
      计算矢量叉积是与直线和线段相关算法的核心部分。设矢量P = ( x1, y1 ),Q = ( x2, y2 ),则矢量叉积定义为由(0,0)、p1、p2和p1+p2所组成的平行四边形的带符号的面积,即:P × Q = x1*y2 - x2*y1,其结果是一个标量。显然有性质 P × Q = - ( Q × P ) 和 P × ( - Q ) = - ( P × Q )。一般在不加说明的情况下,本文下述算法中所有的点都看作矢量,两点的加减法就是矢量相加减,而点的乘法则看作矢量叉积。
      叉积的一个非常重要性质是可以通过它的符号判断两矢量相互之间的顺逆时针关系:
      若 P × Q > 0 , 则P在Q的顺时针方向。
      若 P × Q < 0 , 则P在Q的逆时针方向。
      若 P × Q = 0 , 则P与Q共线,但可能同向也可能反向。
    4.折线段的拐向判断:
      折线段的拐向判断方法可以直接由矢量叉积的性质推出。对于有公共端点的线段p0p1和p1p2,通过计算(p2 - p0) × (p1 - p0)的符号便可以确定折线段的拐向:
      若(p2 - p0) × (p1 - p0) > 0,则p0p1在p1点拐向右侧后得到p1p2。
      若(p2 - p0) × (p1 - p0) < 0,则p0p1在p1点拐向左侧后得到p1p2。
      若(p2 - p0) × (p1 - p0) = 0,则p0、p1、p2三点共线。
    具体情况可参考下图:
    5.判断点是否在线段上:
      设点为Q,线段为P1P2 ,判断点Q在该线段上的依据是:( Q - P1 ) × ( P2 - P1 ) = 0 且 Q 在以 P1,P2为对角顶点的矩形内。前者保证Q点在直线P1P2上,后者是保证Q点不在线段P1P2的延长线或反向延长线上,对于这一步骤的判断可以用以下过程实现:
      

    ON-SEGMENT(pi,pj,pk)//保证k点在线段内部
      if min(xi,xj) <= xk <= max(xi,xj) and min(yi,yj) <= yk <= max(yi,yj)
      then return true;
      else return false;


    特别要注意的是,由于需要考虑水平线段和垂直线段两种特殊情况,min(xi,xj)<=xk<=max(xi,xj)和min(yi,yj)<=yk<=max(yi,yj)两个条件必须同时满足才能返回真值。
    6.判断两线段是否相交:
      我们分两步确定两条线段是否相交:
      (1)快速排斥试验
        设以线段 P1P2 为对角线的矩形为R, 设以线段 Q1Q2 为对角线的矩形为T,如果R和T不相交,显然两线段不会相交。
      (2)跨立试验
        如果两线段相交,则两线段必然相互跨立对方。若P1P2跨立Q1Q2 ,则矢量 ( P1 - Q1 ) 和( P2 - Q1 )位于矢量( Q2 - Q1 ) 的两侧,即( P1 - Q1 ) × ( Q2 - Q1 ) * ( P2 - Q1 ) × ( Q2 - Q1 ) < 0。上式可改写成( P1 - Q1 ) × ( Q2 - Q1 ) * ( Q2 - Q1 ) × ( P2 - Q1 ) > 0。当 ( P1 - Q1 ) × ( Q2 - Q1 ) = 0 时,说明 ( P1 - Q1 ) 和 ( Q2 - Q1 )共线,但是因为已经通过快速排斥试验,所以 P1 一定在线段 Q1Q2上;同理,( Q2 - Q1 ) ×(P2 - Q1 ) = 0 说明 P2 一定在线段 Q1Q2上。所以判断P1P2跨立Q1Q2的依据是:( P1 - Q1 ) × ( Q2 - Q1 ) * ( Q2 - Q1 ) × ( P2 - Q1 ) >= 0。同理判断Q1Q2跨立P1P2的依据是:( Q1 - P1 ) × ( P2 - P1 ) * ( P2 - P1 ) × ( Q2 - P1 ) >= 0。具体情况如下图所示:
      在相同的原理下,对此算法的具体的实现细节可能会与此有所不同,除了这种过程外,大家也可以参考《算法导论》上的实现。
    7.判断线段和直线是否相交:
      有了上面的基础,这个算法就很容易了。如果线段P1P2和直线Q1Q2相交,则P1P2跨立Q1Q2,即:( P1 - Q1 ) × ( Q2 - Q1 ) * ( Q2 - Q1 ) × ( P2 - Q1 ) >= 0。
    8.判断矩形是否包含点:
      只要判断该点的横坐标和纵坐标是否夹在矩形的左右边和上下边之间。
    9.判断线段、折线、多边形是否在矩形中:
      因为矩形是个凸集,所以只要判断所有端点是否都在矩形中就可以了。
    10.判断矩形是否在矩形中:
      只要比较左右边界和上下边界就可以了。
    11.判断圆是否在矩形中:
      很容易证明,圆在矩形中的充要条件是:圆心在矩形中且圆的半径小于等于圆心到矩形四边的距离的最小值。
    12.判断点是否在多边形中:
      判断点P是否在多边形中是计算几何中一个非常基本但是十分重要的算法。以点P为端点,向左方作射线L,由于多边形是有界的,所以射线L的左端一定在多边形外,考虑沿着L从无穷远处开始自左向右移动,遇到和多边形的第一个交点的时候,进入到了多边形的内部,遇到第二个交点的时候,离开了多边形,……所以很容易看出当L和多边形的交点数目C是奇数的时候,P在多边形内,是偶数的话P在多边形外。
      但是有些特殊情况要加以考虑。如图下图(a)(b)(c)(d)所示。在图(a)中,L和多边形的顶点相交,这时候交点只能计算一个;在图(b)中,L和多边形顶点的交点不应被计算;在图(c)和(d) 中,L和多边形的一条边重合,这条边应该被忽略不计。如果L和多边形的一条边重合,这条边应该被忽略不计。
      为了统一起见,我们在计算射线L和多边形的交点的时候,1。对于多边形的水平边不作考虑;2。对于多边形的顶点和L相交的情况,如果该顶点是其所属的边上纵坐标较大的顶点,则计数,否则忽略;3。对于P在多边形边上的情形,直接可判断P属于多边行。由此得出算法的伪代码如下:

     

    count ← 0;
    以P为端点,作从右向左的射线L; 
    for 多边形的每条边s
    do if P在边s上 
    then return true;
    if s不是水平的
    then if s的一个端点在L上
    if 该端点是s两端点中纵坐标较大的端点
    then count ← count+1
    else if s和L相交
    then count ← count+1;
    if count mod 2 = 1 
    then return true;
    else return false;


    其中做射线L的方法是:设P'的纵坐标和P相同,横坐标为正无穷大(很大的一个正数),则P和P'就确定了射线L。 
      判断点是否在多边形中的这个算法的时间复杂度为O(n)。
      另外还有一种算法是用带符号的三角形面积之和与多边形面积进行比较,这种算法由于使用浮点数运算所以会带来一定误差,不推荐大家使用。 
    13.判断线段是否在多边形内: 
      线段在多边形内的一个必要条件是线段的两个端点都在多边形内,但由于多边形可能为凹,所以这不能成为判断的充分条件。如果线段和多边形的某条边内交(两线段内交是指两线段相交且交点不在两线段的端点),因为多边形的边的左右两侧分属多边形内外不同部分,所以线段一定会有一部分在多边形外(见图a)。于是我们得到线段在多边形内的第二个必要条件:线段和多边形的所有边都不内交。 
      线段和多边形交于线段的两端点并不会影响线段是否在多边形内;但是如果多边形的某个顶点和线段相交,还必须判断两相邻交点之间的线段是否包含于多边形内部(反例见图b)。 
      因此我们可以先求出所有和线段相交的多边形的顶点,然后按照X-Y坐标排序(X坐标小的排在前面,对于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的端点不都在多边形内 
    then return false;
    点集pointSet初始化为空;
    for 多边形的每条边s
    do if 线段的某个端点在s上
    then 将该端点加入pointSet;
    else if s的某个端点在线段PQ上
    then 将该端点加入pointSet;
    else if s和线段PQ相交 // 这时候已经可以肯定是内交了
    then return false;
    将pointSet中的点按照X-Y坐标排序;
    for pointSet中每两个相邻点 pointSet[ i ] , pointSet[ i+1]
    do if pointSet [ i] , pointSet[ i+1] 的中点不在多边形中
    then return false;
    return true;


    这个过程中的排序因为交点数目肯定远小于多边形的顶点数目n,所以最多是常数级的复杂度,几乎可以忽略不计。因此算法的时间复杂度也是O(n)。 
    14.判断折线是否在多边形内: 
      只要判断折线的每条线段是否都在多边形内即可。设折线有m条线段,多边形有n个顶点,则该算法的时间复杂度为O(m*n)。 
    15.判断多边形是否在多边形内: 
      只要判断多边形的每条边是否都在多边形内即可。判断一个有m个顶点的多边形是否在一个有n个顶点的多边形内复杂度为O(m*n)。 
    16.判断矩形是否在多边形内: 
      将矩形转化为多边形,然后再判断是否在多边形内。 
    17判断圆是否在多边形内: 
      只要计算圆心到多边形的每条边的最短距离,如果该距离大于等于圆半径则该圆在多边形内。计算圆心到多边形每条边最短距离的算法在后文阐述。 
    18.判断点是否在圆内: 
      计算圆心到该点的距离,如果小于等于半径则该点在圆内。 
    19.判断线段、折线、矩形、多边形是否在圆内: 
      因为圆是凸集,所以只要判断是否每个顶点都在圆内即可。 
    20.判断圆是否在圆内: 
      设两圆为O1,O2,半径分别为r1, r2,要判断O2是否在O1内。先比较r1,r2的大小,如果r1<r2则O2不可能在O1内;否则如果两圆心的距离大于r1 - r2 ,则O2不在O1内;否则O2在O1内。 
    21.计算点到线段的最近点: 
      如果该线段平行于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 = ( k^2 * pt1.x + k * (point.y - pt1.y ) + point.x ) / ( k^2 + 1) ,y = k * ( x - pt1.x) + pt1.y;然后再判断垂足是否在线段上,如果在线段上则返回垂足;如果不在则计算两端点到垂足的距离,选择距离垂足较近的端点返回。 
    22.计算点到折线、矩形、多边形的最近点: 
      只要分别计算点到每条线段的最近点,记录最近距离,取其中最近距离最小的点即可。 
    23.计算点到圆的最近距离及交点坐标: 
      如果该点在圆心,因为圆心到圆周任一点的距离相等,返回UNDEFINED。 
      连接点P和圆心O,如果PO平行于X轴,则根据P在O的左边还是右边计算出最近点的横坐标为centerPoint.x - radius 或 centerPoint.x + radius。如果PO平行于Y轴,则根据P在O的上边还是下边计算出最近点的纵坐标为 centerPoint.y -+radius或 centerPoint.y - radius。如果PO不平行于X轴和Y轴,则PO的斜率存在且不为0,这时直线PO斜率为k = ( P.y - O.y )/ ( P.x - O.x )。直线PO的方程为:y = k * ( x - P.x) + P.y。设圆方程为(x - O.x ) ^2 + ( y - O.y ) ^2 = r ^2,联立两方程组可以解出直线PO和圆的交点,取其中离P点较近的交点即可。 
    24.计算两条共线的线段的交点: 
      对于两条共线的线段,它们之间的位置关系有下图所示的几种情况。图(a)中两条线段没有交点;图 (b) 和 (d) 中两条线段有无穷焦点;图 (c) 中两条线段有一个交点。设line1是两条线段中较长的一条,line2是较短的一条,如果line1包含了line2的两个端点,则是图(d)的情况,两线段有无穷交点;如果line1只包含line2的一个端点,那么如果line1的某个端点等于被line1包含的line2的那个端点,则是图(c)的情况,这时两线段只有一个交点,否则就是图(b)的情况,两线段也是有无穷的交点;如果line1不包含line2的任何端点,则是图(a)的情况,这时两线段没有交点。 
    25.计算线段或直线与线段的交点: 
      设一条线段为L0 = P1P2,另一条线段或直线为L1 = Q1Q2 ,要计算的就是L0和L1的交点。
     1. 首先判断L0和L1是否相交(方法已在前文讨论过),如果不相交则没有交点,否则说明L0和L1一定有交点,下面就将L0和L1都看作直线来考虑。 
     2. 如果P1和P2横坐标相同,即L0平行于Y轴 
      a) 若L1也平行于Y轴, 
        i. 若P1的纵坐标和Q1的纵坐标相同,说明L0和L1共线,假如L1是直线的话他们有无穷的交点,假如L1是线段的话可用"计算两条共线线段的交点"的算法求他们的交点(该方法在前文已讨论过);
        ii. 否则说明L0和L1平行,他们没有交点; 
      b) 若L1不平行于Y轴,则交点横坐标为P1的横坐标,代入到L1的直线方程中可以计算出交点纵坐标; 
     3. 如果P1和P2横坐标不同,但是Q1和Q2横坐标相同,即L1平行于Y轴,则交点横坐标为Q1的横坐标,代入到L0的直线方程中可以计算出交点纵坐标; 
     4. 如果P1和P2纵坐标相同,即L0平行于X轴 
      a) 若L1也平行于X轴, 
        i. 若P1的横坐标和Q1的横坐标相同,说明L0和L1共线,假如L1是直线的话他们有无穷的交点,假如L1是线段的话可用"计算两条共线线段的交点"的算法求他们的交点(该方法在前文已讨论过);
        ii. 否则说明L0和L1平行,他们没有交点; 
      b) 若L1不平行于X轴,则交点纵坐标为P1的纵坐标,代入到L1的直线方程中可以计算出交点横坐标; 
     5. 如果P1和P2纵坐标不同,但是Q1和Q2纵坐标相同,即L1平行于X轴,则交点纵坐标为Q1的纵坐标,代入到L0的直线方程中可以计算出交点横坐标; 
     6. 剩下的情况就是L1和L0的斜率均存在且不为0的情况 
      a) 计算出L0的斜率K0,L1的斜率K1 ; 
      b) 如果K1 = K2 
        i. 如果Q1在L0上,则说明L0和L1共线,假如L1是直线的话有无穷交点,假如L1是线段的话可用"计算两条共线线段的交点"的算法求他们的交点(该方法在前文已讨论过);
        ii. 如果Q1不在L0上,则说明L0和L1平行,他们没有交点。
      c) 联立两直线的方程组可以解出交点来
      这个算法并不复杂,但是要分情况讨论清楚,尤其是当两条线段共线的情况需要单独考虑,所以在前文将求两条共线线段的算法单独写出来。另外,一开始就先利用矢量叉乘判断线段与线段(或直线)是否相交,如果结果是相交,那么在后面就可以将线段全部看作直线来考虑。需要注意的是,我们可以将直线或线段方程改写为ax+by+c=0的形式,这样一来上述过程的部分步骤可以合并,缩短了代码长度,但是由于先要求出参数,这种算法将花费更多的时间。 
    26.求线段或直线与折线、矩形、多边形的交点: 
      分别求与每条边的交点即可。 
    27.求线段或直线与圆的交点: 
      设圆心为O,圆半径为r,直线(或线段)L上的两点为P1,P2。 
      1. 如果L是线段且P1,P2都包含在圆O内,则没有交点;否则进行下一步。 
      2. 如果L平行于Y轴, 
       a) 计算圆心到L的距离dis;
       b) 如果dis > r 则L和圆没有交点;
       c) 利用勾股定理,可以求出两交点坐标,但要注意考虑L和圆的相切情况。
      3. 如果L平行于X轴,做法与L平行于Y轴的情况类似; 
      4. 如果L既不平行X轴也不平行Y轴,可以求出L的斜率K,然后列出L的点斜式方程,和圆方程联立即可求解出L和圆的两个交点; 
      5. 如果L是线段,对于2,3,4中求出的交点还要分别判断是否属于该线段的范围内。 
    28.凸包的概念: 
      点集Q的凸包(convex hull)是指一个最小凸多边形,满足Q中的点或者在多边形边上或者在其内。下图中由红色线段表示的多边形就是点集Q={p0,p1,...p12}的凸包。 
    29.凸包的求法: 
      现在已经证明了凸包算法的时间复杂度下界是O(n*logn),但是当凸包的顶点数h也被考虑进去的话,Krikpatrick和Seidel的剪枝搜索算法可以达到O(n*logh),在渐进意义下达到最优。最常用的凸包算法是Graham扫描法和Jarvis步进法。本文只简单介绍一下Graham扫描法,其正确性的证明和Jarvis步进法的过程大家可以参考《算法导论》。 
      对于一个有三个或以上点的点集Q,Graham扫描法的过程如下: 
      

    令p0为Q中Y-X坐标排序下最小的点 
      设<p1,p2,...pm>为对其余点按以p0为中心的极角逆时针排序所得的点集(如果有多个点有相同的极角,除了距p0最远的点外全部移除
      压p0进栈S
      压p1进栈S
      压p2进栈S
    for i ← 3 to m
    do while 由S的栈顶元素的下一个元素、S的栈顶元素以及pi构成的折线段不拐向左侧
    对S弹栈
    压pi进栈S
    return S;

     


      此过程执行后,栈S由底至顶的元素就是Q的凸包顶点按逆时针排列的点序列。需要注意的是,我们对点按极角逆时针排序时,并不需要真正求出极角,只需要求出任意两点的次序就可以了。而这个步骤可以用前述的矢量叉积性质实现。 
    四、结语 
      尽管人类对几何学的研究从古代起便没有中断过,但是具体到借助计算机来解决几何问题的研究,还只是停留在一个初级阶段,无论从应用领域还是发展前景来看,计算几何学都值得我们认真学习、加以运用,希望这篇文章能带你走进这个丰富多彩的世界。

    目录 
    ㈠ 点的基本运算 
    1. 平面上两点之间距离 1 
    2. 判断两点是否重合 1 
    3. 矢量叉乘 1 
    4. 矢量点乘 2 
    5. 判断点是否在线段上 2 
    6. 求一点饶某点旋转后的坐标 2 
    7. 求矢量夹角 2 
    ㈡ 线段及直线的基本运算 
    1. 点与线段的关系 3 
    2. 求点到线段所在直线垂线的垂足 4 
    3. 点到线段的最近点 4 
    4. 点到线段所在直线的距离 4 
    5. 点到折线集的最近距离 4 
    6. 判断圆是否在多边形内 5 
    7. 求矢量夹角余弦 5 
    8. 求线段之间的夹角 5 
    9. 判断线段是否相交 6 
    10.判断线段是否相交但不交在端点处 6 
    11.求线段所在直线的方程 6 
    12.求直线的斜率 7 
    13.求直线的倾斜角 7 
    14.求点关于某直线的对称点 7 
    15.判断两条直线是否相交及求直线交点 7 
    16.判断线段是否相交,如果相交返回交点 7 
    ㈢ 多边形常用算法模块 
    1. 判断多边形是否简单多边形 8 
    2. 检查多边形顶点的凸凹性 9 
    3. 判断多边形是否凸多边形 9 
    4. 求多边形面积 9 
    5. 判断多边形顶点的排列方向,方法一 10 
    6. 判断多边形顶点的排列方向,方法二 10 
    7. 射线法判断点是否在多边形内 10 
    8. 判断点是否在凸多边形内 11 
    9. 寻找点集的graham算法 12 
    10.寻找点集凸包的卷包裹法 13 
    11.判断线段是否在多边形内 14 
    12.求简单多边形的重心 15 
    13.求凸多边形的重心 17 
    14.求肯定在给定多边形内的一个点 17 
    15.求从多边形外一点出发到该多边形的切线 18 
    16.判断多边形的核是否存在 19 
    ㈣ 圆的基本运算 
    1 .点是否在圆内 20 
    2 .求不共线的三点所确定的圆 21 
    ㈤ 矩形的基本运算 
    1.已知矩形三点坐标,求第4点坐标 22 
    ㈥ 常用算法的描述 22 
    ㈦ 补充 
    1.两圆关系: 24 
    2.判断圆是否在矩形内: 24 
    3.点到平面的距离: 25 
    4.点是否在直线同侧: 25 
    5.镜面反射线: 25 
    6.矩形包含: 26 
    7.两圆交点: 27 
    8.两圆公共面积: 28 
    9. 圆和直线关系: 29 
    10. 内切圆: 30 
    11. 求切点: 31 
    12. 线段的左右旋: 31 
    13.公式: 32 

     

     

    /* 需要包含的头文件 */ 
    #include <cmath > 
    
    /* 常用的常量定义 */ 
    const double INF = 1E200 
    const double EP = 1E-10 
    const int MAXV = 300 
    const double PI = 3.14159265 
    
    /* 基本几何结构 */ 
    struct POINT 
    { 
        double x; 
        double y; 
        POINT(double a=0, double b=0) { x=a; y=b;} //constructor 
    }; 
    struct LINESEG 
    { 
        POINT s; 
        POINT e; LINESEG(POINT a, POINT b) { s=a; e=b;} 
        LINESEG() { } 
    }; 
    struct LINE // 直线的解析方程 a*x+b*y+c=0 为统一表示,约定 a >= 0 
    { 
        double a; 
        double b; 
        double c; LINE(double d1=1, double d2=-1, double d3=0) {a=d1; b=d2; c=d3;} 
    }; 
    
    
    /********************\ 
    * 点的基本运算 * 
    \********************/ 
    double dist(POINT p1,POINT p2) // 返回两点之间欧氏距离 
    { 
       return( sqrt( (p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y) ) ); 
    } 
    bool equal_point(POINT p1,POINT p2) // 判断两个点是否重合 
    { 
       return ( (abs(p1.x-p2.x)<EP)&&(abs(p1.y-p2.y)<EP) ); 
    } 
    
    
    /****************************************************************************** 
    r=multiply(sp,ep,op),得到(sp-op)*(ep-op)的叉积 
    r>0:ep在矢量opsp的逆时针方向; 
    r=0:opspep三点共线; 
    r<0:ep在矢量opsp的顺时针方向 
    *******************************************************************************/ 
    double multiply(POINT sp,POINT ep,POINT op) 
    { 
       return((sp.x-op.x)*(ep.y-op.y)-(ep.x-op.x)*(sp.y-op.y)); 
    } 
    
    
    /******************************************************************************* 
    r=dotmultiply(p1,p2,op),得到矢量(p1-op)和(p2-op)的点积,如果两个矢量都非零矢量 
    r<0:两矢量夹角为锐角;r=0:两矢量夹角为直角;r>0:两矢量夹角为钝角 
    *******************************************************************************/ 
    double dotmultiply(POINT p1,POINT p2,POINT p0) 
    { 
        return ((p1.x-p0.x)*(p2.x-p0.x)+(p1.y-p0.y)*(p2.y-p0.y)); 
    } 
    /* 判断点p是否在线段l上,条件:(p在线段l所在的直线上)&& (点p在以线段l为对角线的矩形内) */ 
    bool online(LINESEG l,POINT p) 
    { 
       return((multiply(l.e,p,l.s)==0) &&( ( (p.x-l.s.x)*(p.x-l.e.x)<=0 )&&( (p.y-l.s.y)*(p.y-l.e.y)<=0 ) ) ); 
    } 
    // 返回点p以点o为圆心逆时针旋转alpha(单位:弧度)后所在的位置 
    POINT rotate(POINT o,double alpha,POINT p) 
    { 
        POINT tp; 
        p.x-=o.x; 
        p.y-=o.y; 
        tp.x=p.x*cos(alpha)-p.y*sin(alpha)+o.x; 
        tp.y=p.y*cos(alpha)+p.x*sin(alpha)+o.y; 
        return tp; 
    } 
    
    
    /* 返回顶角在o点,起始边为os,终止边为oe的夹角(单位:弧度) 
    角度小于pi,返回正值 
    角度大于pi,返回负值 
    可以用于求线段之间的夹角 
    */ 
    double angle(POINT o,POINT s,POINT e) 
    { 
    double cosfi,fi,norm; 
    double dsx = s.x - o.x; 
    double dsy = s.y - o.y; 
    double dex = e.x - o.x; 
    double dey = e.y - o.y; 
    
    
    cosfi=dsx*dex+dsy*dey; 
    norm=(dsx*dsx+dey*dey)*(dex*dex+dey*dey); 
    cosfi /= sqrt( norm ); 
    
    
    if (cosfi >= 1.0 ) return 0; 
    if (cosfi <= -1.0 ) return -3.1415926; 
    
    
    fi=acos(cosfi); 
    if (dsx*dey-dsy*dex>0) return fi; // 说明矢量os 在矢量 oe的顺时针方向 
    return -fi; 
    }
    
    
    /*****************************\ 
    * * 
    * 线段及直线的基本运算 * 
    * * 
    \*****************************/ 
    
    
    /* 判断点与线段的关系,用途很广泛 
    本函数是根据下面的公式写的,P是点C到线段AB所在直线的垂足 
    
    
    AC dot AB 
    r = --------- 
    ||AB||^2 
    (Cx-Ax)(Bx-Ax) + (Cy-Ay)(By-Ay) 
    = ------------------------------- 
    L^2 
    r has the following meaning: 
    r=0 P = A 
    r=1 P = B 
    r<0 P is on the backward extension of AB 
    r>1 P is on the forward extension of AB 
    0<r<1 P is interior to AB 
    */ 
    double relation(POINT p,LINESEG l) 
    { 
        LINESEG tl; 
        tl.s=l.s; 
        tl.e=p; 
        return dotmultiply(tl.e,l.e,l.s)/(dist(l.s,l.e)*dist(l.s,l.e)); 
    } 
    
    
    // 求点C到线段AB所在直线的垂足 P 
    POINT perpendicular(POINT p,LINESEG l) 
    { 
        double r=relation(p,l); 
        POINT tp; 
        tp.x=l.s.x+r*(l.e.x-l.s.x); 
        tp.y=l.s.y+r*(l.e.y-l.s.y); 
        return tp; 
    } 
    /* 求点p到线段l的最短距离,并返回线段上距该点最近的点np 
    注意:np是线段l上到点p最近的点,不一定是垂足 */ 
    double ptolinesegdist(POINT p,LINESEG l,POINT &np) 
    { 
        double r=relation(p,l); 
        if(r<0) 
        { 
           np=l.s; 
           return dist(p,l.s); 
        } 
        if(r>1) 
        { 
           np=l.e; 
           return dist(p,l.e); 
        } 
        np=perpendicular(p,l); 
        return dist(p,np); 
    } 
    
    
    // 求点p到线段l所在直线的距离,请注意本函数与上个函数的区别 
    double ptoldist(POINT p,LINESEG l) 
    { 
        return abs(multiply(p,l.e,l.s))/dist(l.s,l.e); 
    } 
    
    
    /* 计算点到折线集的最近距离,并返回最近点. 
    注意:调用的是ptolineseg()函数 */ 
    double ptopointset(int vcount,POINT pointset[],POINT p,POINT &q) 
    { 
        int i; 
        double cd=double(INF),td; 
        LINESEG l; 
        POINT tq,cq;  
        for(i=0;i<vcount-1;i++) 
        { 
           l.s=pointset[ i ]; 
           l.e=pointset[i+1]; 
           td=ptolinesegdist(p,l,tq); 
           if(td<cd) 
           { 
              cd=td; 
              cq=tq; 
           } 
        } 
        q=cq; 
        return cd; 
    } 
    /* 判断圆是否在多边形内.ptolineseg()函数的应用2 */ 
    bool CircleInsidePolygon(int vcount,POINT center,double radius,POINT polygon[]) 
    { 
        POINT q; 
        double d; 
        q.x=0; 
        q.y=0; 
        d=ptopointset(vcount,polygon,center,q); 
        if(d<radius||fabs(d-radius)<EP) 
            return true; 
        else 
           return false; 
    } 
    
    
    /* 返回两个矢量l1和l2的夹角的余弦(-1 --- 1)注意:如果想从余弦求夹角的话,注意反余弦函数的定义域是从 0到pi */ 
    double cosine(LINESEG l1,LINESEG l2) 
    { 
        return (((l1.e.x-l1.s.x)*(l2.e.x-l2.s.x) + 
         (l1.e.y-l1.s.y)*(l2.e.y-l2.s.y))/(dist(l1.e,l1.s)*dist(l2.e,l2.s))) ); 
    } 
    // 返回线段l1与l2之间的夹角 单位:弧度 范围(-pi,pi) 
    double lsangle(LINESEG l1,LINESEG l2) 
    { 
        POINT o,s,e; 
        o.x=o.y=0; 
        s.x=l1.e.x-l1.s.x; 
        s.y=l1.e.y-l1.s.y; 
        e.x=l2.e.x-l2.s.x; 
        e.y=l2.e.y-l2.s.y; 
        return angle(o,s,e); 
    } 
    // 如果线段u和v相交(包括相交在端点处)时,返回true 
    bool intersect(LINESEG u,LINESEG v) 
    { 
        return( (max(u.s.x,u.e.x)>=min(v.s.x,v.e.x))&& //排斥实验 
        (max(v.s.x,v.e.x)>=min(u.s.x,u.e.x))&& 
        (max(u.s.y,u.e.y)>=min(v.s.y,v.e.y))&& 
        (max(v.s.y,v.e.y)>=min(u.s.y,u.e.y))&& 
        (multiply(v.s,u.e,u.s)*multiply(u.e,v.e,u.s)>=0)&& //跨立实验 
        (multiply(u.s,v.e,v.s)*multiply(v.e,u.e,v.s)>=0)); 
    } 
    
    
    
    
    // (线段u和v相交)&&(交点不是双方的端点) 时返回true 
    bool intersect_A(LINESEG u,LINESEG v) 
    { 
       return((intersect(u,v))&& 
        (!online(u,v.s))&& 
        (!online(u,v.e))&& 
        (!online(v,u.e))&& 
        (!online(v,u.s))); 
    } 
    
    
    // 线段v所在直线与线段u相交时返回true;方法:判断线段u是否跨立线段v 
    bool intersect_l(LINESEG u,LINESEG v) 
    { 
         return multiply(u.s,v.e,v.s)*multiply(v.e,u.e,v.s)>=0; 
    } 
    
    // 根据已知两点坐标,求过这两点的直线解析方程: a*x+b*y+c = 0 (a >= 0) 
    LINE makeline(POINT p1,POINT p2) 
    { 
        LINE tl; 
        int sign = 1; 
        tl.a=p2.y-p1.y;
    	if(tl.a<0) 
        { 
            sign = -1; 
            tl.a=sign*tl.a; 
        } 
        tl.b=sign*(p1.x-p2.x); 
        tl.c=sign*(p1.y*p2.x-p1.x*p2.y); 
        return tl; 
    } 
    
    // 根据直线解析方程返回直线的斜率k,水平线返回 0,竖直线返回 1e200 
    double slope(LINE l) 
    { 
        if(abs(l.a) < 1e-20)return 0; 
        if(abs(l.b) < 1e-20)return INF; 
        return -(l.a/l.b); 
    } 
    
    
    // 返回直线的倾斜角alpha ( 0 - pi) 
    double alpha(LINE l) 
    { 
        if(abs(l.a)< EP)return 0; 
        if(abs(l.b)< EP)return PI/2; 
        double k=slope(l); 
        if(k>0) 
           return atan(k); 
        else 
           return PI+atan(k); 
    } 
    
    
    // 求点p关于直线l的对称点 
    POINT symmetry(LINE l,POINT p) 
    { 
        POINT tp; 
        tp.x=((l.b*l.b-l.a*l.a)*p.x-2*l.a*l.b*p.y-2*l.a*l.c)/(l.a*l.a+l.b*l.b); 
        tp.y=((l.a*l.a-l.b*l.b)*p.y-2*l.a*l.b*p.x-2*l.b*l.c)/(l.a*l.a+l.b*l.b); 
        return tp; 
    } 
    
    
    // 如果两条直线 l1(a1*x+b1*y+c1 = 0), l2(a2*x+b2*y+c2 = 0)相交,返回true,且返回交点p 
    bool lineintersect(LINE l1,LINE l2,POINT &p) // 是 L1,L2 
    { 
        double d=l1.a*l2.b-l2.a*l1.b; 
        if(abs(d)<EP) // 不相交 
           return false; 
        p.x = (l2.c*l1.b-l1.c*l2.b)/d; 
        p.y = (l2.a*l1.c-l1.a*l2.c)/d; 
        return true; 
    } 
    
    
    // 如果线段l1和l2相交,返回true且交点由(inter)返回,否则返回false 
    bool intersection(LINESEG l1,LINESEG l2,POINT &inter) 
    { 
         LINE ll1,ll2; 
         ll1=makeline(l1.s,l1.e); 
         ll2=makeline(l2.s,l2.e); 
         if(lineintersect(ll1,ll2,inter)) 
         { 
             return online(l1,inter); 
        } 
        else 
             return false; 
    }
    可以应付大部分zoj上的几何题Sample TextSample Text
    
    
    zoj上的计算几何题
    Vol I 
    1010 by pandahyx 
    1032 by javaman 
    1037 by Vegetable Bird 
    1041 by javaman 
    1081 by Vegetable Bird 
    1090 by Vegetable Bird 
    
    
    Vol II 
    1104 by javaman 
    1123 by javaman 
    1139 by Vegetable Bird 
    1165 by javaman 
    1199 by Vegetable Bird 
    
    
    Vol V 
    1426 by Vegetable Bird 
    1439 by Vegetable Bird 
    1460 by Vegetable Bird 
    1472 by Vegetable Bird 
    
    
    Vol VI 
    1597 by Vegetable Bird 
    
    
    Vol VII 
    1608 by Vegetable Bird 
    1648 by Vegetable Bird 
    
    
    Vol XII 
    2102 by pandahyx 
    2107 by pandahyx 
    2157 by pandahyx 
    
    
    Vol XIII 
    2234 by pandahyx 
    
    
    Vol XIV 
    2318 by ahyangyi 
    2394 by qherlyt 
    
    
    Vol XV 
    2403 by Vegetable Bird




     

    展开全文
  • ASP.NET知识点总结

    千次阅读 2020-03-03 13:08:25
    ASP.NET知识点总结1、ASP.Net的特色与优势2、几对概念3、解决方案构成4、系统对象与状态管理5、控件的分类6、站点地图7、系统导航8、母版页9、系统框架10、数据绑定11、数据源控件12、数据绑定控件GridView数据查询...

    1、ASP.Net的特色与优势

    • 与浏览器无关
    • 遵循W3C的XHTML标准
    • 方便设置断点,易于调试
    • 编译后执行,运行效率高
    • 代码、微软中间语言MSIL、JIT(调用那部分编译那部分,启动时间更短)、机器语言
    • 丰富的控件库
    • 代码后置,逻辑分明

    2、几对概念

    • .aspx和aspx.cs
    • Web服务器和应用程序服务器
    • 代码内置和代码后置

    3、解决方案构成

    文件、新建网站自动生成一个文件夹和三个文件

    • App_Data文件夹 存放数据
    • Web.Config文件 站点配置文件
    • Default.aspx文件 默认页面
    • Default.aspx.cs文件 默认页面的代码后置文件

    4、系统对象与状态管理

    • Page对象:页面执行期内

    • Request对象:页面请求期

    • 属性:Get请求发送的数据QueryString、Post方法发送的数据Form、环境变量ServerVariables、以上三种方法的集合Params

    • Request.ServerVariables[“HTTP_USER_AGENT”]获取当前客户端浏览器的版本;

    • Request.ServerVariables[“HTTP_ACCEPT_LANGUAGE”]获取当前客户端浏览器使用的语言;
      页面传值
      页内数据传递:
      if(!Page.IsPostBack){ 赋值}
      跨页数据传递:
      目的:if(Page.PreviousPage != null)
      If(PreviousPage .IsCrossPagePostBack)
      { PreviousPage.Findcontrol(“控件ID”); 取值}
      Response对象:页面执行期
      方法:
      Write()
      End()
      Redirect()

    • Server对象:
      方法:
      HtmlEncode () 、
      HtmlDecode () 、
      MapPath () 、
      UrlEncode () 、
      UrlDecode () 、
      Execute () 、
      Transfer ()
      Application对象:整个应用程序运行期
      属性:All、AllKeys、Count、Item
      方法:Add()、Clear () 、Get () 、Set () 、Lock () 、UnLock ()

    • Session对象:用户会话期
      属性:SessionID、Timeout、IsNewSession
      方法:Clear () 、Abandon ()
      Cookie对象:保持客户端的共享信息方式
      新建

    HttpCookie co = new HttpCookie(“cook”);
    co[“name”] = value;
    co[“time”] = value;
    co.Expires = DateTime.Now.AddDays(3);
    Response.Cookies.Add(co);
    

    取值

    HttpCookie co = Request.Cookies[“cook”];
    co[“name”]  ;
    co[“time”]  ;
    

    5、控件的分类

    控件分类:HTML服务器控件、Web服务器控件
    HTML服务器控件
    HTML标签,在ASP中称为HTML控件,服务器不处理
    可以转换为HTML服务器控件
    在HTML控件上加上runat=“server”属性,都可以转换
    Web服务器控件
    以<asp:开头, runat=“server”虽然是默认属性,但是必须写
    所有的服务器控件都继承自System.Web.UI.Control类
    所有的HTML服务器控件位于System.Web.UI.HtmlControls命名空间中
    所以的Web服务器控件位于System.Web.UI.WebControls命名空间中

    • 基础控件

    Label控件
    属性:ID、Text、Visible、ForeColor
    Button控件
    属性:Text、PostBackUrl
    事件:Click
    TextBox控件
    属性:AutoPostBack、Text、TextMode、Wrap
    事件:TextChanged

    6、站点地图

    站点地图 Web.sitemap
    XML格式
    根节点siteMap
    一个站点地图只能有一个siteMap元素
    siteMapNode对应于页面的节点,一个节点描述一个页面
    title描述页面
    url文件在解决方案中的位置
    description说明性文本

    Web.sitemap

    <?xml version="1.0" encoding="utf-8" ?>
    <siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
        <siteMapNode url="~/Default.aspx" title="首页"  description="">
    	
            <siteMapNode url="BookList.aspx" title="图书浏览"  description="" />
            <siteMapNode url="Cart.aspx" title="购物车"  description="" />
            <siteMapNode url="Search.aspx" title="图书搜索"  description="" />
            <siteMapNode url="" title="用户管理"  description="" >
            		<siteMapNode url="~/Membership/UserRegister.aspx" title="用户注册"  description="" />
             	<siteMapNode url="~/Membership/UserLogin.aspx" title="用户登录"  description="" />
            </siteMapNode>
    		
        </siteMapNode>
    </siteMap>
    

    7、系统导航

    SiteMapPath控件 面包屑导航
    PathSeparator ParentLevelsDisplayed
    TreeView导航控件
    TextField NavigateUrlField
    Menu控件
    静态显示的级数StaticDisplayLevels、支持的最多级别数MaximumDynamicDisplayLevels、布局类型Orientation

    8、母版页

    网页典型布局
    栏式结构
    区域结构
    母版页的特点
    有利于站点的修改与维护,降低开发人员的工作强度
    提供高效的内容整合能力
    有利于实现页面布局
    提供一种便于利用的对象模型
    Html页面加内容
    首行:

    <%@ Master Language="C#" AutoEventWireup="true" CodeFile="MasterPage.master.cs" Inherits="MasterPage" %>
    

    可编辑区

    <asp:ContentPlaceHolder ID="cphContent" runat="server">      </asp:ContentPlaceHolder>
    

    将现有页改为母版页
    在@Page标记中指定MasterPageFile位置
    去除多余的html标签
    去除form标记
    创建asp:ContentPlaceHodler标签,并放入对应的内容
    指定相应的ContentPlaceHolerID

    母版在不同层级使用时图像路径问题

    在配置文件

    <appSettings>
        <add key="WebRoot" value="/Web/“   />
     </appSettings>
    

    在全局变量、接收配置文件

     void Application_Start(object sender, EventArgs e) 
    {
            // 在应用程序启动时运行的代码
            this.Application.Lock();
            this.Application["webRoot"] =    ConfigurationManager.AppSettings["webRoot"];
            this.Application.UnLock();
     }
    

    在母版

    <IMG src="<%=this.Application["webRoot"] %>Images/index-top.jpg“>
    

    Global.asax

    <%@ Application Language="C#" %>
    <script runat="server">
        void Application_Start(object sender, EventArgs e) 
        {
            // 在应用程序启动时运行的代码
            this.Application.Lock();
            this.Application["webRoot"] = ConfigurationManager.AppSettings["webRoot"];
            this.Application.UnLock();
        }    
        void Application_End(object sender, EventArgs e) 
        {
            //  在应用程序关闭时运行的代码
        }        
        void Application_Error(object sender, EventArgs e) 
        { 
            // 在出现未处理的错误时运行的代码
        }
        void Session_Start(object sender, EventArgs e) 
        {
            // 在新会话启动时运行的代码
        }
        void Session_End(object sender, EventArgs e) 
        {
            // 在会话结束时运行的代码。 
            // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为
            // InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer 
            // 或 SQLServer,则不会引发该事件。
        }       
    </script>
    

    9、系统框架

    • 三层
      数据访问层
      业务逻辑层
      表示层

    • 三层的优势
      适应变化、利于维护
      适用协作开发
      主流趋势

    • 模型层
      项目的命名
      实体类:传递数据的载体
      实体类标识为[可序列化的][Serializable]
      类的命名规范、数据表名、单数
      外键处理方式、主键表对应的实体类型(外键对象)

    • 数据访问层
      项目的命名
      CRUD:Create、Retrieve、Update、Delete
      DBHelper类

    DBHelper.cs

    public static readonly string CONSTR = ConfigurationManager.ConnectionStrings["SQL_CONSTR"].ConnectionString;
    private static SqlConnection CreateConnection(string connectionString)
     {
                SqlConnection con = new SqlConnection(connectionString);
                con.Open();
                return con;
    }
     public static int ExcuteCommand(string connectionString, string sql, SqlParameter[] values)
     {
                using (SqlConnection con = CreateConnection(connectionString))
                {
                    SqlCommand command = new SqlCommand(sql, con);
                    if (values != null) command.Parameters.AddRange(values);
                    return command.ExecuteNonQuery();
                }
     }
     public static SqlDataReader GetReader(string connectionString, string sql, SqlParameter[] values)
    {
                SqlCommand command = new SqlCommand(sql, DBHelper.CreateConnection(DBHelper.CONSTR));
                if (values != null) command.Parameters.AddRange(values);
                return command.ExecuteReader(CommandBehavior.CloseConnection);
    }
     public static object GetScalar(string connectionString, string sql, SqlParameter[] values)
    {
                using (SqlConnection con = CreateConnection(connectionString))
                {
                    SqlCommand command = new SqlCommand(sql, con);
                    if (values != null) command.Parameters.AddRange(values);
                    return command.ExecuteScalar();
                }
    }
    
    • 业务逻辑层
      项目的命名
      方法
      表示层
      网站
      文件夹存放位置
      方法的命名与定义规范
      CRUD增查改删:Create、Retrieve、Update、Delete
      c: AddUser(User user);
      r: GetAllUsers(); GetUserById(int id); GetUserByLoginId(string loginId); GetUserBySql(string sql);
      u: ModifyUser(User user);
      d: DeleteUser(user user); DeleteUserById(int id); DeleteUserByLoginId(string loginId);

    10、数据绑定

    数据绑定的两种方式

    • 编码指定数据源
      指定数据对象
      数据绑定控件ID.DataSource = 类.方法();
      数据绑定控件ID.DataBind();
      指定数据源ID
      数据绑定控件ID.DataSourceID = 数据源控件ID ;

    • 使用数据源控件
      数据绑定的两种方法
      Eval方法
      Eval是只读的方法(单向数据绑定),不想让用户修改的数据用它。

    <%#   Eval(“ISBN”).ToString().Trim()  %>
    

    Eval有一个重载的方法,可以实现格式化Eval(“date”,”{ 0 : dd / MM / yyyy}”)
    Bind方法
    Bind支持读/写更能(双向数据绑定),该方法常与输入控件一起使用,如TextBox控件

    <%#  Bind(“Title’)  %>
    
    • 指定数据源ID的方式和指定数据对象的方式有什么区别
      语法不同,指定数据源ID后即可完成绑定,但是指定数据对象后还需要使用绑定方法DataBind()才能完成数据绑定
      指定数据源ID方式可以使用数据源的功能,如更新、删除等,但指定数据对象的方式只能提供绑定的显示

    11、数据源控件

    • 普通数据源控件
      SqlDataSource
      AccessDataSource
      ObjectDataSource
    • 层次化数据源控件
      XmlDataSource
      SiteMapDataSource

    12、数据绑定控件

    • 普通绑定控件
      AdRotator
      ListControl
      DropDownList 下拉菜单控件
      CheckBoxList、RadioButtonList、ListBox、BulletList
      CompositeDataBoundControl
      GridView 通过表格方式实现数据的展示,编辑、分页、排序
      DetailsView 显示单条记录的详细信息,添加、删除、修改
      FormView
    • 层次化绑定控件
      TreeView
      Menu
      所以的数据绑定控件共有的重要属性:DataSourceID,用于绑定数据源控件

    GridView数据查询与展示、删除

    显示一个列表(ObjectDataSource)
    将GridView控件拖入页面,新建数据源,选择业务类,选择对应的Select方法
    分页:设AllowPaging为ture
    外键列的处理:<%# Eval(“CategoryId.Name”) %>
    CategoryId是实体类中的外键类型字段,Name是实体类对应的数据表中的外键列对应的主键表中的Id的Name。CategoryId.Id是外键列中的实际值。
    删除
    设定Delete×××ByID(int id)的删除方法?
    从代码中删除一句 OldValuesParameterFormatString="original_{0}“
    设定GridView的DataKeysName为id,启用删除,就能使用删除了,别忘了处理主外键关系
    GridView中行的DataKeysName与取值
    DataKeyNames=“FID”?? 绑定一个值
    GridView1.DataKeys[e.Row.RowIndex].Value.ToString();
    DataKeyNames=“FID,FName”?? 绑定两个值
    GridView1.DataKeys[e.Row.RowIndex].Values[0].ToString();
    GridView1.DataKeys[e.Row.RowIndex].Values[1].ToString();

    DetailsView 展示

    • 设置数据源
      选定SelectMethod
      外键的处理如下(三个模版中绑定的内容不同):
    <asp:TemplateField HeaderText="出版社" SortExpression="PublisherId">
    <EditItemTemplate>
    <asp:DropDownList ID="ddlPublisher" runat="server" DataSourceID="odsPublisher" DataTextField="Name"
    DataValueField="Id" Width="219px" SelectedValue='<%# Eval("PublisherId.Id") %>'></asp:DropDownList>
    <asp:ObjectDataSource ID="odsPublisher" runat="server" OldValuesParameterFormatString="original_{0}"
    SelectMethod="GetAllPublisher" TypeName="Accp.BLL.PublisherManager"></asp:ObjectDataSource>
     </EditItemTemplate>
    <InsertItemTemplate>
     <asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("PublisherId") %>'></asp:TextBox>
     </InsertItemTemplate>
    <ItemTemplate>
    <asp:Label ID="Label2" runat="server" Text='<%# Eval("PublisherId.Name") %>'></asp:Label>
    </ItemTemplate>
    </asp:TemplateField>
    

    非外键的,处理如下(三个模版中绑定的内容相同) :

    <asp:TemplateField HeaderText="标题" SortExpression="Title">
    <EditItemTemplate>
    <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("Title") %>' Width="345px"></asp:TextBox>
     </EditItemTemplate>
     <InsertItemTemplate>
    <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("Title") %>'></asp:TextBox>
     </InsertItemTemplate>
    <ItemTemplate>
    <asp:Label ID="Label1" runat="server" Text='<%# Eval("Title") %>'></asp:Label>
    </ItemTemplate>
    </asp:TemplateField>
    
    • DetailsView 更新

    在业务逻辑层写更新方法
    配置数据源的UpdateMethod
    和非外键的UpdateParameters

    <UpdateParameters>
    <asp:Parameter Name="title" Type="String" />
    <asp:Parameter Name="unitPrice" Type="Decimal" />
    <asp:Parameter Name="publishDate" Type="DateTime" />
    <asp:Parameter Name="toc" Type="String" />
    <asp:Parameter Name="id" Type="Int32" />
     </UpdateParameters>
    

    外键的,在DetailsView1_ItemUpdating方法写:

    if (this.DetailsView1.CurrentMode == DetailsViewMode.Edit)
     {
    	DropDownList ddlPublisher = this.DetailsView1.FindControl("ddlPublisher") as DropDownList;
    	if (ddlPublisher != null)
    	{
    		this.odsBook.UpdateParameters.Add("publisherId", ddlPublisher.SelectedValue);
    	}
     }
    

    业务逻辑层更新方法

    public static int ModifyBook(string title, decimal unitPrice, int publisherId, DateTime publishDate, string toc, int id)
    {
    	Book book = BookService.GetBook(id);
    	book.Title = title;
    	book.UnitPrice = unitPrice;
    	book.PublisherId.Id = publisherId;
    	book.PublishDate = publishDate;
    	book.TOC = toc;
    	int result = BookService.UpdateBook(book);
    	return result;
    }
    
    • GridView 7种数据绑定列的类型

    BoundField 显示普通文本
    DataFormatString属性,设置显示格式,需设HtmlCode属性为false
    TemplateField 模版,灵活,直接添加、转换而来
    HeaderTemplate
    FooterTemplate
    ItemTemplate
    AlternatingTemplate
    EditItemTemplate
    Buttonfield 按钮,通过CommandName设置命令
    CommandField 创建命令按钮,自动生成命令
    HyperLinkField 将绑定的数据以超链接的形式显示
    ImageField 绑定图片路径,在表中显示图片列
    CheckBoxField 显示bool类型的数据

    多选

    使用JavaScript、CheckBox

    <asp:CheckBox onclick="setSelectAll(this);" />
    
    function setSelectAll(obj)
    {
    	var boxes=document.getElementsByTagName("input");
    	 for(var i=0;i<boxes.length;i++)
    	 {
    		 if (boxes[i].type=="checkbox")
    		{
    		 	boxes[i].checked=obj.checked;
    		}
    	}
    }
    

    取值

    string ids = String.Empty;
    foreach (GridViewRow row in this.GridView1.Rows)
    {
    	if (row.RowType == DataControlRowType.DataRow)
    	{
    		CheckBox box = row.FindControl("cbSelect") as CheckBox;
    		if (box != null && box.Checked)
    		{
    			string key = this.GridView1.DataKeys[row.RowIndex].Value.ToString();
    			ids = String.IsNullOrEmpty(ids) ? key : ids + "," + key;
    		}
    	}
    }
    

    光棒效果

    光棒效果
    GridView的行绑定事件RowDataBound()

    if (e.Row.RowType == DataControlRowType.DataRow)
    {
    	e.Row.Attributes.Add("onmouseover", "currColor = this.style.backgroundColor;this.style.backgroundColor='#6699ff';");
    	e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor = currColor;");
    }
    

    13、数据验证控件

    RequiredFieldvalidator必须填字段验证器
    ControlToValidate
    Text
    ErrorMessage
    CompareValidator范围验证器
    ControlToValidate
    ControToCompare
    Type
    Operator
    ValueToCompare
    RangeValidator范围验证器
    ControlToValidate
    MaximumValue
    MinimumValue
    Type

    • RegularExpressionValidator正则表达式验证器
      非负整数 ^\d+$
      正整数 1* [0-9] [0-9 ]*$
      中文字符 [\u4e00-\u9fa5]
      双字节字符(包括汉字在内) [^\x00-\xff]
      货币(非负数) \d+(.\d\d)?
      货币(整数或负数)(-)? \d+(.\d\d)?
      CustomValidator自定义验证器
      ControToValidate
      ClientValidationFunction
      OnServerValidate
      ValidationSummary验证摘要
      ShowMessageBox
      ShowSummary

    • 日期输入

    Calendar控件、日历
    SelectedDate属性
    VisibleDate属性
    TitleFormat属性
    SelectionChanged事件
    缺陷:每次日历的显示、隐藏、用户的选择日期都会造成循环
    JS版日历
    My97DatePicker
    在使用该日期控件的文件中加入JS库(仅这一个文件即可,其他文件会自动引入,请勿删除或改名)
    代码如下
    οnfοcus=“new WdatePicker(this,’%Y-%M-%D’,true,‘default’);”

    14、文件上载

    FileUpload控件、上传文件。 onchang=“checkImg(this)” js控制上传文件的格式
    DetailsView1_ItemUpdated() //将选择的图片上传到服务部

    if (this.DetailsView1.CurrentMode == DetailsViewMode.Edit)
    {
    	FileUpload fileUpload = this.DetailsView1.FindControl("FileUpload1") as FileUpload;
    	if (fileUpload.PostedFile != null && fileUpload.PostedFile.FileName.Length > 0)
    	{
    		string path = "~/BookCovers/";
    		string isbn = this.DetailsView1.Rows[5].Cells[1].Text;
    		path = path + isbn + ".jpg";
    		fileUpload.SaveAs(this.Server.MapPath(path));
    	}
     }
    

    15、其他服务器控件

    MultiView控件、多视图
    为View控件提供容器
    ImageMap控件、热点区域
    ImageUrl
    图片地址
    HotSpotMode
    获取或设置菜单热点区域的默认行为方式。分为设置(NotSet)、定向操作(Navigate)、回转操作(PostBack)、无任何操作(Inactive)4种方式
    HotSpots
    设置HotSpot对象集合。HotSpot是一个抽象类,它包括CircleHotSpot(圆现热区)、RectangleHotSpot(方形热区)、PolygonHotSpot(多边形热区)三个子类
    HyperLink 控件
    基于超链接的一个扩展,便于动态的改变链接的地址
    NavigateUrl 设置或获取超链接所指向的URL地址
    ImageUrl 可设置为图片形式的链接
    Text 要为该链接显示的文本

    DataList 查询与展示

    属性
    RepeatDirection项的分布方向
    RepeatColumns要用于该布局的列的数目
    模版
    项模版 ItemTemplate(放一表格进去)、AlternatingItemTemplate、SelectedItemTemplate、EditItemTemplate
    页眉页脚 HeaderTemplate、FooterTemplate
    分割符模版 SeparatorTemplate

    protected void Page_Load(object sender, EventArgs e)
    {
    	if (!this.IsPostBack)
    	{
    		this.PageSize = 3;
    		this.CurrentPageIndex = 1;
    		this.Order = "Id";
    		this.FillPageData();
    	}
    }
    protected void FillPageData()
    {
    	PageResult<Book> pageResult = new PageResult<Book>();
    	pageResult.PageSize = this.PageSize;
    	pageResult.CurrentPageIndex = this.CurrentPageIndex;
    	pageResult.Order = this.Order;
    	pageResult = BookManager.GetBookByPage(pageResult);
    	this.DataList1.DataSource = pageResult.Data;  //代码绑定数据源
    	this.DataList1.DataBind();
    }
    

    16、基于SQL语句分页

    基于SQL语句分页:pageSize=3 currentPageIndex=3

    • 1、通用(SQL200/SQL2005)排除法not in 、top
      –公式
      select top pageSize * from 表
      where 主键 not in (select top ((currentPageIndex -1) * pageSize) 主键 from 表 order by 字段)
      order by 字段
      –实例
      select top 3 * from books
      where id not in(select top 6 id from books order by id)
      order by id
    • 2、(SQL2005)row_number()分析函数
      –公式
      select * from
      (select *,row_number() over(order by 字段) as rand from 表) as 新表
      where rank between (currentPageIndex -1) * pageSize +1 and currentPageIndex * pageSize
      order by 字段
      –实例
      select * from
      (select *,row_number() over(order by id) as rank from books) as newtable
      where rank between 7 and 9
      order by id
    • 3、(主键为数值时)max()
      select top 3 * from books
      where id > (select max(id) from (select top 6 id from books order by id) as newtable)
      order by id

    17、DataList 分页

    在模板层,建立一个分页类PageResult

    private int pageSize = 3;
    private int currentPageIndex = 1;
    private int recordCount = 0;
    private string order = "Id";
    private List<T> data = new List<T>();
    

    在表示层,建立分页属性

    protected int PageSize
    {
    	get { return Convert.ToInt32(this.ViewState["pageSize"]); }
    	set { this.ViewState["pageSize"] = value; }
    }
    protected int CurrentPageIndex
    {
    	get { return Convert.ToInt32( this.ViewState["currentPageIndex"] ); }
    	set {  this.ViewState["currentPageIndex"] = value; }
    }
    protected string Order
    {
    	get { return this.ViewState["order"] as string; }
    	set { this.ViewState["order"] = value; }
    }
    protected int PageCount
    {
    	get { return Convert.ToInt32 ( this.ViewState["pageCount"] ); }
    	set { this.ViewState["pageCount"] = value; }
    }
    

    ViewState
    页面级状态保持变量
    表示层,加载第某页数据的方法

    protected void FillPageData()
    {
    	PageResult<Book> pageResult = new PageResult<Book>();
    	pageResult.PageSize = this.PageSize;
    	pageResult.CurrentPageIndex = this.CurrentPageIndex;
    	pageResult.Order = this.Order;
    	pageResult = BookManager.GetBookByPage(pageResult);
    	this.DataList1.DataSource = pageResult.Data;
    	this.DataList1.DataBind();
    	this.PageCount = pageResult.PageCount;
    	string pageInfo = "第 {0} 页 / 共 {1} 页 记录数:{2}";
    	this.lblCurrentPage.Text = String.Format(pageInfo, this.CurrentPageIndex, this.PageCount, pageResult.RecordCount);
    	this.txtCurrentPage.Text = this.CurrentPageIndex.ToString();
    }
    

    DAL

    public static PageResult<Book> GetBookByPage(PageResult<Book> pageResult)
    {
    	int filter = (pageResult.CurrentPageIndex - 1) * pageResult.PageSize;
    	string sql1 = "select count(id) from Books";
    	string sql2 = "select top {0} * from Books where id not in(select top {1} id from Books order by {2}) order by {3}";
    	sql2 = String.Format(sql2, pageResult.PageSize, filter, pageResult.Order, pageResult.Order);
    	return GetPageDataBySql(sql1, sql2, pageResult);
    }
    private static PageResult<Book> GetPageDataBySql(string sql1, string sql2, PageResult<Book> pageResult)
    {
    	pageResult.RecordCount = Convert.ToInt32(DBHelper.ExecuteScalar(DBHelper.ConnectionStringLocalTransaction, CommandType.Text, sql1, null));
    	List<Book> data = GetBooks(sql2, null);
    	pageResult.Data = data;
    	return pageResult;
    }
    

    分页类PageResult

    [Serializable]
    public class PageResult<T>
    {
    	private int pageSize = 3;
    	private int currentPageIndex = 1;
    	private int recordCount = 0;
    	private string order = "Id";
    	private List<T> data = new List<T>();
    	public int PageCount {
    		get  {
    		return this.recordCount % this.pageSize == 0 ? this.recordCount / this.pageSize : this.recordCount / this.pageSize + 1;
     		}
        }
     	public List<T> Data {
    	get { return data; }
    	set { data = value; }
    	}
    	public string Order {
    		get { return order; }
    		set { order = value; }
    	}
    	public int RecordCount {
    		get { return recordCount; }
    		set { recordCount = value; }
    	}
    	public int CurrentPageIndex {
    		get { return currentPageIndex; }
    		set { currentPageIndex = value; }
    	}
    	public int PageSize {
    		get { return pageSize; }
    		set { pageSize = value; }
    	}
    }
    

    Repeater

    不自动生成任何HTML标签,效率高,没有默认的外观,完全通过模版控制,用于精确展示

    <div id="clsPage">
    <asp:Repeater ID="rptBooks" runat="server">
     <HeaderTemplate>
    	<ul class="clsUL">
    	<li class="clsLi1">书名</li>
    	<li class="clsLi2">作者</li>
    	<li class="clsLi3">出版社</li>
    	<li class="clsLi4">出版日期</li>
    	<li class="clsLi5">价格</li>
    	</ul>
    </HeaderTemplate>
    <ItemTemplate>
    	<ul class="clsUL1">
    	<li class="clsLi1"><%# Eval("ShortTitle") %></li>
    	<li class="clsLi2"><%# Eval("ShortAuthor") %></li>
    	<li class="clsLi3"><%# Eval("PublisherId.Name") %></li>
    	<li class="clsLi4"><%# Eval("PublishDate","{0:yyyy-MM-dd}") %></li>
    	<li class="clsLi5"><%# Eval("UnitPrice","{0:C}") %></li>
    	</ul>
    </ItemTemplate>
    <AlternatingItemTemplate>
    	<ul class=“clsUL2”>   //变换CSS样式
    	相同
    	</ul>
    </AlternatingItemTemplate>
    </asp:Repeater>
    </div>
    
    <style type="text/css">
    	body{margin:0px;font-size:12px;text-align:center}
    	#clsPage{width:960px;text-align:left;}
    	#clsPage .clsUL{margin:0px;padding:0px;display-style:none;}
    	#clsPage .clsUL .clsLi1{width:300px;float:left;line-height:30px;height:30px;font-weight:bold;}
    	#clsPage .clsUL .clsLi2{width:300px;float:left;line-height:30px;height:30px;font-weight:bold;}
    	#clsPage .clsUL .clsLi3{width:160px;float:left;line-height:30px;height:30px;font-weight:bold;}
    	#clsPage .clsUL .clsLi4{width:100px;float:left;line-height:30px;height:30px;font-weight:bold;}
    	#clsPage .clsUL .clsLi5{width:100px;float:left;line-height:30px;height:30px;font-weight:bold;}
    	//float控制不换行       
    	#clsPage .clsUL1{margin:0px;padding:0px;display-style:none;}
    	#clsPage .clsUL1 .clsLi1{width:300px;float:left;line-height:25px;height:25px;}
    	#clsPage .clsUL1 .clsLi2{width:300px;float:left;line-height:25px;height:25px;}
    	#clsPage .clsUL1 .clsLi3{width:160px;float:left;line-height:25px;height:25px;}
    	#clsPage .clsUL1 .clsLi4{width:100px;float:left;line-height:25px;height:25px;}
    	#clsPage .clsUL1 .clsLi5{width:100px;float:left;line-height:25px;height:25px;}
    	       
    	#clsPage .clsUL2{margin:0px;padding:0px;display-style:none;}
    	#clsPage .clsUL2 .clsLi1{width:300px;float:left;line-height:25px;height:25px;background-color:#cccccc}
    	#clsPage .clsUL2 .clsLi2{width:300px;float:left;line-height:25px;height:25px;background-color:#cccccc}
    	#clsPage .clsUL2 .clsLi3{width:160px;float:left;line-height:25px;height:25px;background-color:#cccccc}
    	#clsPage .clsUL2 .clsLi4{width:100px;float:left;line-height:25px;height:25px;background-color:#cccccc}
    	#clsPage .clsUL2 .clsLi5{width:100px;float:left;line-height:25px;height:25px;background-color:#cccccc}
     </style>
    
    protected void Page_Load(object sender, EventArgs e)
    {
    	if (!this.IsPostBack)
    	{
    		List<Book> lst = BookManager.GetBookByCategoryId(25);
    		this.rptBooks.DataSource = lst;
    		this.rptBooks.DataBind();
    	}
    }
    

    18、RSS发布

    RSS
    Really Simple Syndication
    简易信息聚合
    RSS发布就是提供一个Feed格式的文件,Feed文件就一个XML格式的文件
    Repeater控件可以轻松实现数据的绑定,又不会生成任何无用的代码,非常适合用于RSS的发布
    后置代码

    public string GetUrl(object id)
    {
    	return "http://" + this.Request.ServerVariables["HTTP_HOST"].ToString() + "/Web/BookDetail.aspx?bid=" + id;
    }
    

    利用Repeater在页面循环生成Feed文件

    <%@ Page Language="C#" AutoEventWireup="true" ContentType="text/xml" CodeFile="Rss.aspx.cs" Inherits="Rss" %>
    <asp:Repeater ID="Repeater1" runat="server" DataSourceID="odsBook">
    <HeaderTemplate>
     <rss version="2.0">
    <channel>
     <title>第三波书店</title>
     <link>www.accpsky.cn</link>
    <description>第三波网上书店</description>
     <copyright>Copyright 2009-2010 by zhlb</copyright>
    </HeaderTemplate>
    <ItemTemplate>
    <item>
    <title><%# Eval("Title") %></title>
     <author><%# this.Server.HtmlEncode(Eval("Author") as string) %></author>
    <description><%# this.Server.HtmlEncode(Eval("ContentDescription") as string)%></description>
    <link><%# GetUrl(Eval("Id")) %></link>
    <pubDate><%# Eval("PublishDate","{0:D}") %></pubDate>
    </item>
    </ItemTemplate>
    <FooterTemplate>
    </channel>
    </rss>
    </FooterTemplate>
    </asp:Repeater>        
    <asp:ObjectDataSource ID="odsBook" runat="server" OldValuesParameterFormatString="original_{0}"
    SelectMethod="GetBookByCategoryId" TypeName="Accp.BLL.BookManager">
    <SelectParameters>
    <asp:QueryStringParameter DefaultValue="25" Name="CategoryId" QueryStringField="cid"
    Type="Int32" />
     </SelectParameters>
     </asp:ObjectDataSource>
    

    19、数据展示控件的主要用途

    • GridView
      用于对于多行多列数据(或叫表格类数据)
    • DetailsView
      显示单条记录的详细信息
    • DataList
      单行多列、多行单列的数据
      用于创建模版化的列表数据,可以显示一行中有多列的内容,可用于任何重复结构当中的数据,如表格
    • Repeater
      单行多列、多行单列的数据
      不会自动生成任何用于布局的代码,用于内容的精确显示,效率高,配合DIV+CSS布局

    20、小技巧

    • 提示弹出小窗口
      this.ClientScript.RegisterStartupScript(this.btnRegister.GetType(),“提示”,“”);
    • 超长的字符省略不显示
    public string ShortContentDescription
    {
    	get
    	{
    		return this._contentDescription.Length > 150 ? this._contentDescription.Substring(0, 150) + “……" : this._contentDescription;
    	}
    }
    

    21、第三方控件

    富文本框控件
    FreeTextBox
    FCKeditor
    RichTextBox
    验证码控件
    Webvalidates
    生成验证码snCode.Create();
    验证snCode.CheckSN(输入的内容); 返回值为bool
    代码生成器CodeSmith
    分页控件AspNetPager

    22、用户控件

    用户控件
    Web用户控件,后缀.ascx
    系统控件与自编代码的联合体
    拖放.ascx文件,到其它页面,实现重用。
    .ascx文件,不能单独使用
    用户控件,可以包含其它用户控件,不能(嵌套)包含自己

    23、ASP.NET处理Http请求的两个核心机制

    HttpModule
    Http请求的必经之路
    可以附加信息、做一些额外的工作、终止一个请求,起Filter的作用
    HttpHandler
    Http请求的真正处理中心

    数字水印:指定Handler方式

    HttpHandler程序:一般处理程序,后缀.ashx

    public class BookCover : IHttpHandler {
    	public void ProcessRequest (HttpContext context) {
    		context.Response.ContentType = "image/jpeg";
    		//加水印代码
    	}
    	public bool IsReusable {
    		get {
    			return false;
    		}
    	}
    }
    

    页面中访问图片的路径修改为:
    BookCover.ashx?ISBN=数字

    数字水印:全局Handler方式

    修改配置文件

    <system.web>
    	<httpHandlers>
    		<add verb="*" path="*.jpg" type="CoverHandler"/>
    	</httpHandlers>
    </system.web>
    

    在App_Code目录底下创建Handler类CoverHandler.cs

    public class CoverHandler : IHttpHandler      {
    	private readonly string DEFAULTURL = "~/Images/default.jpg"; 
    	private readonly string WATERURL = "~/Images/WaterMark.jpg";
    	public void ProcessRequest(HttpContext context)    {   //一个请求的所有信息
    		Image imgCover = null; //新建一个图象,用于代替原图,作为封面显示
    		Image imgWater = Image.FromFile(context.Server.MapPath(WATERURL));  //水印图象
    		if (File.Exists(context.Request.PhysicalPath))        {  //如果原图象存在
    			imgCover = Image.FromFile(context.Request.PhysicalPath);  //把原图象赋给封面
    			Graphics g = Graphics.FromImage(imgCover);   //获取封面图片的画笔
    			g.DrawImage(imgWater, imgCover.Width - imgWater.Width, imgCover.Height - imgWater.Height, imgWater.Width, imgWater.Height);   //往封面上面画水印
    			g.Dispose();  //释放资源
    			imgWater.Dispose(); //释放资源
    		}
    		else
    		{
    			imgCover = Image.FromFile(context.Server.MapPath(DEFAULTURL));  //默认图象做封面
    		}
    		context.Response.ContentType = "image/jpeg";
    		imgCover.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
    		context.Response.Flush();  //向客户端发送当前所有缓冲的输出
    		imgCover.Dispose(); //释放资源
    		context.Response.End();  //结束请求
    	}           
    }
    

    24、数据库连接字符串加密、解密

    工具:aspnet_regiis.exe

    加密:

    aspnet_regiis.exe –pef section physical_directory –prov provider  或
    aspnet_regiis.exe –pe section –app virtual_dirctory –prov provider 
    

    section 指定表示要加密的配置节
    physical_directory 指定站点的物理路径
    virtual_dirctory 指定虚拟路径
    provider 指定加密提供程序DataProtectionConfigurationProvider
    解密

    aspnet_regiis.exe –pdf “connectionStrings” “路径”
    

    基于配置文件的身份验证

    站点根目录写入Web.config

    <system.web>
    	<authentication mode=“Forms”>      //身份验证
    		<forms name="book_userName" loginUrl="~/Admin/AdminLogin.aspx" timeout="60">
    			<credentials passwordFormat="Clear"> </credentials>
    		</forms>
    	</authentication>
    </system.web>
    

    受保护文件根目录Admin写入Web.config

     <system.web>
    	<authorization>             //授权 
    		<deny users=“?”/>        //拒绝匿名用户
    	</authorization>
    </system.web>
    

    登录

    if (登录方法,数据库合法用户)
    {
    	this.Session[“currUser”] = currUser;  // 保存登录状态
    	FormsAuthentication.SetAuthCookie(this.txtLoginId.Text, true);  //发票证
    	string returnUrl = this.Request.QueryString["ReturnUrl"] as string;  
    	if (String.IsNullOrEmpty(returnUrl))   //判断登录前是否有请求页
    	{
    		this.Response.Redirect(~/Admin/ManageAllUser1.aspx”);  //默认页
    	}
    	else
    	{
    		this.Response.Redirect(returnUrl);  //转向登录前请求页
    	}
    }
    

    25、自定义错误

    <system.web>
    	<customErrors mode="RemoteOnly"  defaultRedirect="~/error/DefaultError.aspx">
    		<error statusCode="404" redirect="~/error/404.aspx" />
    		<error statusCode="500" redirect="~/error/500.aspx" />
    	</customErrors>
    </system.web>
    

    mode
    On 启用
    Off 禁用
    RemoteOnly 只显示给远程访问

    26、web.config 配置节

    appSettings 应用程序设置
    作者、网站图片路径、数据库类型
    connectionStrings 连库字符串
    连库字符串
    自动附加数据库connectionString=“server=。;AttachDbFileName=|DataDirectory|NorthWnd.mdf;uid=sa;pwd="
    system.web 配置文件(默认的配置设置)以下所有的代码都应该放入其中
    httpRuntime
    配置 ASP.NET HTTP 运行库设置
    enable 程序启用状态
    executionTimeout 程序执行时间上限
    maxRequestLength 上传内容最大限制
    pages 标识特定于页的配置设置
    如是否启用会话状态、视图状态,是否检测用户的输入等
    该项默认是检测,如果你使用了不检测,一要对用户的输入进行编码或验证
    compilation 是否允许调试
    authentication 身份验证
    Windows
    Form
    Passport
    None
    customErrors
    为 ASP.NET 应用程序提供有关自定义错误信息的信息。不适用于 XML Web services 中发生的错误

    <configuration>
    	<appSettings>
    		<add key="author" value="zhlb" />
    		<add key="WebRoot" value="/Web/"/>
    	</appSettings>
    	<connectionStrings>
    		<add name="SQLConnString1" connectionString="Server=.;Database=MyBookShop;uid=sa;pwd=" />
    	</connectionStrings>
    	<system.web>
    		<httpRuntime enable="true" executionTimeout="90" maxRequestLength="4096"/>
    		<pages validateRequest="false" />
    		<compilation debug="true"/>
    		<authentication mode="Forms">
    		<forms name="book_userName" loginUrl="~/Admin/AdminLogin.aspx" timeout="60">
    			<credentials passwordFormat="Clear">
    			</credentials>
    		</forms>
    		</authentication>
    		<customErrors mode="RemoteOnly"  defaultRedirect="~/error/DefaultError.aspx">
    			<error statusCode="404" redirect="~/error/404.aspx" />
    			<error statusCode="500" redirect="~/error/500.aspx" />
    		</customErrors>        
    	</system.web>
    </configuration>
    

    只影响同级与下级,下级有配置文件的适用就近原则

    27、machine.config 配置管理

    路径,.netframework版本不同则目录不同,以2.0为例
    c:\Windwos\Microsof.NET\Framework\v2.0…\CONFIG
    Win2003服务器 Framework版本V2.0…
    Web站点管理工具
    打开:IDE的网站菜单下的ASP.NET配置
    4个选项卡:主页、安全、应用程序、提供程序
    侵入式
    MMC ASP.NET插件
    打开:ASP.NET站点属性的编辑配置
    非侵入式

    28、部署

    准备
    在web.config中关闭调试功能
    使用Release(发行版)的方式编译应用程序
    发布预编译站点
    又叫部署预编译
    选项
    允许更新预编译站点
    使用固定命名和单页程序集
    对预编译程序集启用强命名
    本地预编译,打包上传

    29、随笔

    <%@ 表示:引用
    <%= 表示:取值
    <%# 表示:绑定
    <%= 变量名%>
    <%# 要绑定的字段名%> 或者 <%# 调用后台的方法名%>
    <%%> <%%>可以加入判断语句或代码
    <%$ %>? 这个只能用在取Web.config的连接字符串


    1. 0-9 ↩︎

    展开全文
  • NOIp 数学知识点总结

    2018-10-24 07:43:00
    推荐阅读 NOIp 基础数论知识点总结: https://www.cnblogs.com/greyqz/p/number.html 排列组合 常用公式 排列:\[\displaystyle A_n^m=\frac{n!}{(n-m)!}\] 全排列:\(A_n^n=n!\) 组合:\[\displaystyle C_n^m=\frac...
  • 人教版初中数学知识点总结

    千次阅读 2017-03-19 17:13:55
    初中数学知识点总结
  • 打 印 高 考 立 体 几 何 知 识 点 总 结 精品文档 立体几何知识点总结 一 空间几何体 一空间几何体的类型 1 多面体 由若干个平面多边形围成的几何体围成多面体的各个多边形叫做多面体的面相邻 两个面的公共边叫做...
  • 很多同学都需要整理数学知识点,小编整理了一些初中数学重点知识,大家一起来看看吧。数学三角函数的中考考点1.正弦定理在任意△ABC中,角A、B、C所对的边长分别为a、b、c,三角形外接圆的半径为R,直径为D。则有:a...
  • java重要知识点总结

    2018-07-06 12:34:18
    主要详细知识点 常用算法考察 冒泡排序 快速排序 插入排序 希尔排序 归并排序 堆排序 桶排序 动态规划 最长公共子串 最长回文子串 数组的最大k个值 数字的最大连续子数组之和 左旋转字符串 字符串...
  • 图形学知识点总结

    2021-09-02 15:41:36
    (1)当扫描线与多边形顶点相交时,交点的取舍问题策略: 交点个数= 构成这个顶点的两条边 位于扫描线上方的条数 (2)左闭右开,下闭上开。 形状保持 中心偏移 半个像素 (3)算法的效率问题 对于某一条扫描线,需要与...
  • 前端知识点总结——H5

    千次阅读 2019-06-20 21:59:44
    前端知识点总结——H5 1.html5新特性 (1)新的语义标签 (2)增强型表单* (3)音频和视频 (4)Canvas绘图 (5)SVG绘图 (6)地理定位 (7)拖动API (8)Web Worker (9)Web Storage (10)Web Socket 2.增强型表单 1.新input type ...
  • GIS知识点总结

    2019-02-08 22:36:29
    作者:邹铭霞 概念:GIS以地理空间数据库为基础,在计算机软硬件的支持下,对空间相关的信息进行采集、管理...总结:GIS就是空间数据和属性数据的联合体 信息系统:具有处理、管理和分析数据功能的系统 信息系统的构...
  • 一、目录 本文整理的计算几何基本概念和常用算法包括如下内容: 1. 矢量的概念 2. 矢量加减法 3. 矢量叉积 4. 折线段的拐向判断 5. 判断是否在线段上 ...12. 判断是否在多边形中 13. 判断线段是否在...
  • 十、关于一般多边形的填充过程,对于一条扫描线可分为四个步骤 求交:计算扫描线与多边形的区别 排序:把所有交点按递增顺序进行排序 交点配对:每对交点就代表扫描线与多边形的一个相交区间 区间填色:把这些...
  • AI知识点总结

    千次阅读 2018-01-17 13:17:14
    多边形 : 按住鼠标不松手,按键盘的上下箭头可以修改边数 五角星 : 按住鼠标不松手,按键盘的上下箭头可以修改角数 获取正五角星,按住alt + shift 镜像 : 选图形; 镜像工具; 两个,确认对称轴 ...
  • HTML 知识点总结

    2017-07-25 20:19:00
    area shape(circle rect矩形 poly多边形) href title target... 表格 table 标签 border width height cellspacing 单元格之间的间隙 默认2 cellpadding 单元格和单元格内容之间的间隙 默认0 align ...
  • HTML知识点总结

    千次阅读 2016-12-13 22:37:13
    <html> 与 </html> 标签限定了文档的开始和结束,在它们之间是文档的头部和主体,文档的头部由 <head> 标签定义,而主体由 <body> 标签定义。     <head> 元素包含了所有的头部标签元素。在 元素中...
  • OpenGL ES知识点总结

    万次阅读 2018-01-25 15:25:52
    OpenGL ES是一个在移动平台上能够支持 OpenGL 最基本功能的精简规范, 没有四边形、多边形,无论多复杂的图形都是由、线和三角形组成的,也去除了glBegin/glEnd等方法。 1.2 应用 视频 图形 图片处理 2D/...
  • html知识点总结

    2017-03-26 12:49:00
     rect表示矩形,circle表示圆形,poly表示多边形 四、表格  语法:    <th></th>  <td></td>  ...    ...    使用创建表头  在表格标记中可以设置表格宽度width,高度...
  • java基础知识点总结

    2021-09-14 09:35:16
    】 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wnRLXF6x-1631583287485)(file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image006.png)] 四、标识符注意 1....
  • 数字图像处理及matlab实现知识点总结 5-10 杨杰

    万次阅读 多人点赞 2017-12-27 22:22:58
    1)空间域增强:处理,模板处理即领域处理 2)频率域增强:高低通滤波,同态滤波 1.空间域图像增强 1)处理 基于灰度变换 灰度线性变换 作用:对每一个像素灰度做线性拉伸 g(x,y)=af(x,y)+bg...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,305
精华内容 1,722
关键字:

多边形的知识点总结