精华内容
下载资源
问答
  • css绘制不规则图形

    千次阅读 2018-12-16 18:46:09
    CSS绘制不规则图形

    CSS绘制不规则图形

    在实际开发中,经常会遇到绘制图形(图标)的需求,比如:箭头图表、不规则图形、规则图形;


    常见方法

    • 对于图形的实现,可以大体上分为几种做法

    (1) 背景图片,请UI小姐姐帮你吧……此处略过;

    (2) CSS3的属性:圆角、透明度、变形、边框、伪类等属性实现;

    (3) 渐变属性:通常使用线性渐变实现切角;

    (4) 裁剪属性:

    (5) Canvas实现:

    • 比较
    方法 描述 适用性 优点 缺点
    背景图
    CSS3属性
    渐变属性
    图像裁剪
    Canvas

    一、背景图实现

    背景图存在的问题:

    • 占用资源较大,修改维护不方便,灵活性不足;

    二、CSS3属性:图形实现

    大体可以划分为:

    • 三角形系列:三角形、倒三角、左三角、右三角、左上三角、右上三角、左下三角、右下三角;
    • 圆形系列:圆形、椭圆、扇形、圆环、月牙、蛋形
    • 四边形系列:正方形、长方形、菱形、平行四边形、梯形、直角梯形
    • 多边形系列:五边形、钻石、六边形、八边形、
    • 特殊形状:心形、无穷大符号、食人豆、太极图
    • 星形系列:五角星、六角星、八角星、十二角星
    • 实际需求:对话框

    示例代码:

    width="100%" height="300" src="//jsfiddle.net/Bumphy/t6L3b9as/embedded/result,html,css/dark/" allowfullscreen="allowfullscreen">

    三、渐变属性

    渐变分为:径向渐变、线性渐变;

    关键是掌握三个要素:

    • 渐变线(gradient line)
    • 渐变线上的起始点(starting point)和结束点(ending point)
    • 在起始点和结束点上的颜色值

    推荐阅读:深入理解 CSS linear-gradient

    width="100%" height="300" src="//jsfiddle.net/Bumphy/nm8chkfj/5/embedded/result,html,css/dark/" allowfullscreen="allowfullscreen">

    四、图像裁剪

    谈到,图片裁剪,有两个属性,clipclip-path 。其实clip-pathclip的替代属性。

    由于clip属性已经被从web标准中移除了,所以这里就不介绍它了,无情地抛弃它了。

    如果对clip感兴趣,具体可以看这里

    这里,我们主要来了解一下clip-path属性。

    clip-path属性可以用于通过裁剪图片,来显示期望中的图片形状。

    先让我们来看几个例子:

    width="100%" height="300" src="//jsfiddle.net/Bumphy/pyd4suo2/embedded/result,html,css/dark/" allowfullscreen="allowfullscreen">
    • 适用性:所有元素;在SVG中,它适用于除defs元素和所有图形元素之外的容器元素;

    • 取值:

    /* Keyword values */
    clip-path: none;
    
    /* Image values */ 
    clip-path: url(resources.svg#c1);
    
    /* Box values */
    clip-path: fill-box;
    clip-path: stroke-box;
    clip-path: view-box;
    clip-path: margin-box
    clip-path: border-box
    clip-path: padding-box
    clip-path: content-box
    
    /* Geometry values */
    clip-path: inset(100px 50px);
    clip-path: circle(50px at 0 100px);
    clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%);
    
    /* Box and geometry values combined */
    clip-path: padding-box circle(50px at 0 100px);
    
    /* Global values */
    clip-path: inherit;
    clip-path: initial;
    clip-path: unset;
    

    这么多取值,完全分不清呀喂!!!没关系,来个示例肿么样?

    一个有意思的网站

    变形之css shapes

    CSS Shapes 标准定义了可以被 CSS 属性值使用的图形描述方法。

    标准目前主要有两个版本。当前标准为第一版,第二版还在迭代过程之中。

    该标准的第一个版本主要包含 3 个属性:shape-outsideshape-image-threshold以及shape-margin

    shape-outside可以实现内容能绕着不规则几何图形排列。

    取值:

    circle函数:定义一个正圆。可以指定半径和圆心位置。 对于半径,只能接受非负数,负数不允许。默认地,使用短边作为直径。 如果使用百分数,百分数的定义是 sqrt(width2+height2)/sqrt(2)。几何定义为:“对角线长度与单位面积对角线长度的比值”。 有两个快捷值可以设置:closest-side和farthest-side 圆心位置默认为中心,如果需要指定须以at引导的数据。此数据可以是百分数或这 center/left/right 的组合。 完整的参数形如:circle(100px at center 25%)

    ellipse函数:定义一个椭圆。和circle函数的参数大致一样。指定半径时候可以指定两个参数。椭圆函数的长轴和短轴只能在宽度方向和高度方向产生。如果指定的话,就是依次指定水平和垂直的半径。 完整的参数形如:ellipse(100px 200px at center 25%)

    inset函数:定义一个内部矩形。这个矩形可以把周围的内容放进去。参数有两个,一个是矩形的上右下左的百分比坐标,类似与margin的指定原则,但必须是百分数。第二个参数为这个矩形的 border 半径,以round引导。 完整的参数形如:ellipse(0% 66% 1% 1% round 50%)

    polygon函数:表示一个封闭的多边形区域。语法为:polygon(X1 X1, … , Xn Yn)。意思是由 N 个点构成的多边形。Xi 和 Yi 代表每个顶点所示的坐标,坐标可为像素值或者百分比。Xi,Yi与Xi+1,Yi+1即为相邻顶点的边。Xn,Yn与X1,Y1也是连接的。

    对于多边形,存在有多种填充逻辑,用于判定一个点在多边形的“内部”还是“外部”。目前标准支持两种,这与 SVG 标准一致。

    nonzero:按该规则,要判断一个点是否在图形内,从该点作任意方向的一条射线,然后检测射线与图形路径的交点情况。从 0 开始计数,路径从左向右穿过射线则计数加 1,从右向左穿过射线则计数减 1。得出计数结果后,如果结果是 0,则认为点在图形外部,否则认为在内部。

    evenodd:按该规则,要判断一个点是否在图形内,从该点作任意方向的一条射线,然后检测射线与图形路径的交点的数量。如果结果是奇数则认为点在内部,是偶数则认为点在外部。

    默认地,标准指定为nonzero。如果是evenodd可以在polygon函数中传第一个参数。

    在线工具

    shape-image-threshold
    这个属性一般和shape-outside联合使用,此时,shape-outside的属性应设置为一张图片。此时,shape-image-threshold 用于从图像中提取形状的阈值。形状由 alpha 值大于此阈值的像素定义。

    .el{
    	shape-outside: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/123941/css-shapes-9.jpg);
      	shape-image-threshold: 0.0;
    }
    

    此处需要注意:

    不能使用file:协议进行测试。
    注意同源策略。
    未来的协议可能会倾向使用图片数据的亮度来取代目前的 alpha 通道。为此会提供一个开关选项。未来同时兼容这两种值的时候,究竟是亮度还是 alpha 通道,取决于这个开关选项值的状态。

    shape-margin
    shape-margin表示在 CSS 形状的浮动区域周围添加空白区域来避免周围内容和形状区域重叠。下面的代码是一个使用的例子。

    .float {
        shape-outside: polygon(10px 10px, 90px 50px, 40px 50px, 90px 90px, 10px 90px);
        shape-margin: 10px;
    }
    

    shape-margin可以为:px、em、rem、百分比或者 calc()函数值。但必须为非负数。下面展示了几个可能的取值:

    shape-margin: 10px;
    shape-margin: 1em;
    shape-margin: 5%;
    shape-margin: calc(2em - 1px);
    

    引用
    形神兼备——谈谈CSS Shapes

    展开全文
  •  判断某个点是否在扇形或者不规则区域内,如果精度要求不高,可以使用三角形原理来判断。  如果精度要求很高,且效率要求很高(游戏开发) ,可以参考 ...

               请忽略排版....................



               判断某个点是否在扇形或者不规则区域内,如果精度要求不高,可以使用三角形原理来判断。

               如果精度要求很高,且效率要求很高(游戏开发) ,可以参考 http://www.cnblogs.com/miloyip/archive/2013/04/19/3029852.html

              

              这里要介绍安卓的一个很有效的方法,使用   Region这个类。  Region 有一个  contains方法,判断某个点是否在区域内。

             


             Region多数放 RectF 里面,可以多个,连续或者不连续,重叠或者不重叠都可以。主要还可以放 Path 在里面。

             关于 Path 的详细介绍  请参考官网 或者 http://blog.csdn.net/w124374860/article/details/44995057。

             这里主要用到 path 的 addArc方法



    addArc(RectF oval, float startAngle, float sweepAngle)方法:

    path.addArc方法用于绘制圆弧,这个圆弧取自RectF矩形的内接椭圆上的一部分,圆弧长度由后两个参数决定

    startAngle:起始位置的角度值

    sweepAngle:旋转的角度值


    原理就是  path先设置好起点。 moveTo -起点----->  然后 移动到 弧度的起点  lineTo -弧度起点-->  画圆弧 -addArc------> 然后lineTo起点(圆的中心)。

    然后将path添加到Region里面去,同时设置圆 半径大小位置的矩阵。

    最终得到Region 后判断某个点是否在区域里面,不多说,上代码。



    @Override  
        protected void onDraw(Canvas canvas) {
            try {
                // 画背景颜色   
                Paint bg = new Paint();   
                bg.setColor(Color.WHITE);   
                Rect bgR = new Rect(0, 0, width, height);   
                canvas.drawRect(bgR, bg);   
                float start = 0F;   
                Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);   
                for(int i = 0; i < circles.size(); i ++) {   
                    circleInfo info = circles.get(i);
                    float endPercentage=Float.parseFloat(NumberUtil.getLastTwoDecimalPlaces(1, String.valueOf((Float.parseFloat(info.bili)/100)*360))+"");
                    // 画大圆   
                    endPercentage = endPercentage-1;
                    RectF bigOval = new RectF(centerX - bigR, centerY - bigR,    
                            centerX + bigR, centerY + bigR);   
                    paint.setColor(colors[i]);   
                    canvas.drawArc(bigOval, start, endPercentage, true, paint);   
                    circles.get(i).startRange = start ;
                    circles.get(i).endRange = start +endPercentage;
                    circles.get(i).paint = paint;
                    circles.get(i).rectF = bigOval;
                    Region region = new Region();
                    Region region2 = new Region();
                    region2.set((int)(centerX - bigR), (int)(centerY - bigR),(int)(centerX + bigR), (int)(centerY + bigR));
                    Path path = new Path();
                    
                    path.moveTo(centerX, centerY);//添加原始点
                    float cx = endPercentage-start;
                    float nx = (float) (Math.sin(cx)*bigR);
                    float ny = (float) Math.sqrt(bigR*bigR+nx*nx);
                    path.lineTo(nx, ny);//移动到弧度起点
                    path.addArc(bigOval, start, endPercentage);//画弧度
                    path.lineTo(centerX, centerY);//弧度终点画线到原始点
                    
                    region.setPath(path, region2);
                    circles.get(i).region = region;//设置 region
                    
                    start+=endPercentage;
                    //画空白 1角度
                    Paint paintk = new Paint(Paint.ANTI_ALIAS_FLAG);
                    paintk.setColor(Color.TRANSPARENT);
                    canvas.drawArc(bigOval, start, start+1, true, paintk);
                    start = start+1;
                    System.out.println("角度   "+start);
                }   
                // 画小圆   
                RectF litterOval = new RectF(centerX - litterR, centerY - litterR,    
                        centerX + litterR, centerY + litterR);   
    //            paint.setColor(colors[i+2]);   
                paint.setColor(colorSmall);   
                canvas.drawArc(litterOval, 0, 360, true, paint);   
            } catch (Exception e) {
                e.printStackTrace();
            }
               
            super.onDraw(canvas);   
        } 


    以上做法同样适用于不规则图形或者其它类型。



    demo下载 地址






    有个地方有错误,                 circles.get(i).endRange = start +endPercentage;这里已经改过来了,demo没有改,懒得上传更新了,请注意







    展开全文
  • 本文借助easyx库函数(提供下载链接),很方便地用C语言实现了鼠标、按钮、进度条、坐标尺操作,为普通C程序的友好人机交互界面提供了一种简单便捷的方案。

    0.引言

    \qquad看了CSDN上很多关于C程序图形化界面的介绍,有的代码繁琐难解,不方便调试修改;有的不够详细。本文提供的代码简单、易于移植、容易理解,望急需使用C语言制作图形化界面的朋友采纳。
    \qquad对easyx尚不熟悉的朋友不需要担心,我敢打包票它只需10分钟就可以上手,而它为你节省的时间可能是3个小时甚至更多。关于easyx的简单应用请参考一篇我以前写的关于C程序可视化的博文。
    →【C语言实现动画控制】←
    \qquad本文的讲解是循序渐进的,读者应该重点关注每个步骤的理解,两步之间代码的变化,即可完全理解本文。

    1.素材准备

    1. easyx的下载链接如下:(本文使用的版本是2014冬至版)
      https://www.easyx.cn/downloads/
      注:使用easyx需要注意它兼容的编译器(下载的帮助文件会写),不同的easyx兼容的编译器不同,但总是和visual C++6兼容(和字符编码有关),本文以visual C++6编译器为例书写代码。
    2. easyx的最新英文帮助文档链接(下载2014冬至版会自带中文帮助文档):
      https://docs.easyx.cn/en-us/intro
    3. 如果你成功下载了easyx2014冬至版,那么解压后把头文件(easyx.h和graphic.h)和lib文件(amd64)分别放在VC文件夹默认的include文件夹和lib文件夹中。右键你的VC程序,选择打开文件所在位置,然后找到MFC文件夹,友情提供两个文件夹的位置截图。
      include
      lib
    4. 建议编译的C文件以cpp后缀保存。

    2.编程

    2.1.创建你的界面

    \qquad创建一个480×360的窗口,我们需要使用initgraph()函数,闲言少叙,让我们直接看一段代码:

    #include <graphics.h>              // 引用图形库头文件
    #include <conio.h>
    #include <stdio.h>
    #include <windows.h>				//用到了定时函数sleep()
    #include <math.h>
    
    int main()
    {
    	int i;
    	short win_width,win_height;//定义窗口的宽度和高度
    	win_width = 480;win_height = 360;
    	initgraph(win_width,win_height);//初始化窗口(黑屏)
    	for(i=0;i<256;i+=5)
    	{
    		setbkcolor(RGB(i,i,i));//设置背景色,原来默认黑色
    		cleardevice();//清屏(取决于背景色)
    		Sleep(15);//延时15ms
    	}
    	closegraph();//关闭绘图界面
    }
    
    

    \qquad这段代码很容易理解,运行这段程序,就会出现逐渐明亮的屏幕。因为不断刷新背景色为RGB(i,i,i)RGB(i,i,i)。C语言中的颜色使用十六进制表示的,RGB函数可以将0~255范围内的三个整数三原色转换成这个十六进制。
    \qquadcleardevice()函数用于清屏,是界面内所有元素都被清空,一般只会在初始化出现。
    \qquadSleep()是毫秒级延迟,当然界面变亮时间不一定是准确的15ms×255/5=0.765s,因为其他语句还需要执行时间。
    \qquadclosegraph():关闭绘图界面。注意,如果初始化了绘图界面但没有在主函数结束前关闭它,可能会引发一些莫名其妙的错误!所以这个函数一定要有!

    2.2.创建按钮

    \qquad我们尝试在界面创建几个按钮,按钮需要的操作是绘制矩形和打印文字。虽然看着简单,但是里面还是有点学问,为了方便大家理解,还是先放上代码和注释。

    #include <graphics.h>              // 引用图形库头文件
    #include <conio.h>
    #include <stdio.h>
    #include <windows.h>				//用到了定时函数sleep()
    #include <math.h>
    int r1[]={30,20,130,60};//输入按钮的矩形参数
    int r2[]={170,20,220,60};//运行按钮的矩形参数
    int r3[]={260,20,310,60};//退出按钮的矩形参数
    int main()
    {
    	int i;
    	short win_width,win_height;//定义窗口的宽度和高度
    	win_width = 480;win_height = 360;
    	initgraph(win_width,win_height);//初始化窗口(黑屏)
    	for(i=0;i<256;i+=5)
    	{
    		setbkcolor(RGB(i,i,i));//设置背景色,原来默认黑色
    		cleardevice();//清屏(取决于背景色)
    		Sleep(15);//延时15ms
    	}
    	RECT R1={r1[0],r1[1],r1[2],r1[3]};//矩形指针R1
    	RECT R2={r2[0],r2[1],r2[2],r2[3]};//矩形指针R2
    	RECT R3={r3[0],r3[1],r3[2],r3[3]};//矩形指针R3
    	LOGFONT f;//字体样式指针
    	gettextstyle(&f);					//获取字体样式
    	_tcscpy(f.lfFaceName,_T("宋体"));	//设置字体为宋体
    	f.lfQuality = ANTIALIASED_QUALITY;    // 设置输出效果为抗锯齿  
    	settextstyle(&f);                     // 设置字体样式
    	settextcolor(BLACK);				//BLACK在graphic.h头文件里面被定义为黑色的颜色常量
    	drawtext("输入参数",&R1,DT_CENTER | DT_VCENTER | DT_SINGLELINE);//在矩形区域R1内输入文字,水平居中,垂直居中,单行显示
    	drawtext("运行",&R2,DT_CENTER | DT_VCENTER | DT_SINGLELINE);//在矩形区域R2内输入文字,水平居中,垂直居中,单行显示
    	drawtext("退出",&R3,DT_CENTER | DT_VCENTER | DT_SINGLELINE);//在矩形区域R3内输入文字,水平居中,垂直居中,单行显示
    	setlinecolor(BLACK);
    	rectangle(r1[0],r1[1],r1[2],r1[3]);
    	rectangle(r2[0],r2[1],r2[2],r2[3]);
    	rectangle(r3[0],r3[1],r3[2],r3[3]);
    	system("pause");//暂停,为了显示
    	closegraph();
    	return 0;
    }
    

    在这里插入图片描述
    \qquad这里需要特别介绍的是矩形指针pRectpRect,它使用句柄RECT定义,并且不可以中途再次赋值。之所以要设置矩形指针了为了打印字体的时候以矩形为边界自动填充。它的格式是RECT r={X1,Y1,X2,Y2},X1和X2是矩形的左边和右边的横坐标,Y1和Y2是矩形的上边和下边的纵坐标,这一点和rectangle()绘制空心矩形函数参数排列一致。后面的DT_CENTER | DT_VCENTER | DT_SINGLELINE就是描述填充格式的常量。使用drawtext书写文字不需要再计算文字的坐标和设置大小,会方便很多。
    \qquadLOGFONT是字体样式指针,通过gettextstyle()函数来获取当前的字体类型,再通过settextstyle()函数加以设置。这里只修改了字体的名称和显示质量,还可以修改斜体、下划线等属性,更详细的部分请参考帮助文档。

    2.3.鼠标操作

    2.3.1.单击特效

    \qquad作为一个图形化界面的C程序,鼠标操作总不能少吧。在讲解程序前先别着急,简单为大家科普一下鼠标事件:
    \qquad鼠标是输入设备,只要发生以下的事件,就会暂存在鼠标消息列表中,我们的操作系统就会依次响应列表中的鼠标消息事件,常用的鼠标事件如下:

    • WM_MOUSEMOVE——鼠标移动
    • WM_MOUSEWHEEL——鼠标滚轮滚动
    • WM_LBUTTONDOWN——鼠标左键按下
    • WM_LBUTTONUP——鼠标左键弹起
    • WM_LBUTTONDBLCLK——鼠标左键双击
    • WM_RBUTTONDOWN——鼠标右键按下
    • WM_RBUTTONUP——鼠标右键弹起
    • WM_RBUTTONDBLCLK——鼠标左键双击
    • WM_MBUTTONDOWN——鼠标中键按下
    • WM_MBUTTONUP——鼠标中键弹起
    • WM_MBUTTONDBLCLK——鼠标中键双击
      \qquad我们只需要根据不断获取鼠标消息队列的消息并根据消息依次进行响应即可。

    \qquad相信大家已经迫不及待了,那么请看下面一个简单的程序。

    #include <graphics.h>              // 引用图形库头文件
    #include <conio.h>
    #include <stdio.h>
    #include <windows.h>				//用到了定时函数sleep()
    #include <math.h>
    int r1[]={30,20,130,60};//输入按钮的矩形参数
    int r2[]={170,20,220,60};//运行按钮的矩形参数
    int r3[]={260,20,310,60};//退出按钮的矩形参数
    int main()
    {
    	int i;
    	short win_width,win_height;//定义窗口的宽度和高度
    	win_width = 480;win_height = 360;
    	initgraph(win_width,win_height);//初始化窗口(黑屏)
    	for(i=0;i<256;i+=5)
    	{
    		setbkcolor(RGB(i,i,i));//设置背景色,原来默认黑色
    		cleardevice();//清屏(取决于背景色)
    		Sleep(15);//延时15ms
    	}
    	RECT R1={r1[0],r1[1],r1[2],r1[3]};//按钮1的矩形区域
    	RECT R2={r2[0],r2[1],r2[2],r2[3]};//按钮2的矩形区域
    	RECT R3={r3[0],r3[1],r3[2],r3[3]};//按钮2的矩形区域
    	LOGFONT f;
    	gettextstyle(&f);					//获取字体样式
    	_tcscpy(f.lfFaceName,_T("宋体"));	//设置字体为宋体
    	f.lfQuality = ANTIALIASED_QUALITY;    // 设置输出效果为抗锯齿  
    	settextstyle(&f);                     // 设置字体样式
    	settextcolor(BLACK);				//BLACK在graphic.h头文件里面被定义为黑色的颜色常量
    	drawtext("输入参数",&R1,DT_CENTER | DT_VCENTER | DT_SINGLELINE);//在矩形区域R1内输入文字,水平居中,垂直居中,单行显示
    	drawtext("运行",&R2,DT_CENTER | DT_VCENTER | DT_SINGLELINE);//在矩形区域R2内输入文字,水平居中,垂直居中,单行显示
    	drawtext("退出",&R3,DT_CENTER | DT_VCENTER | DT_SINGLELINE);//在矩形区域R3内输入文字,水平居中,垂直居中,单行显示
    	setlinecolor(BLACK);
    	rectangle(r1[0],r1[1],r1[2],r1[3]);
    	rectangle(r2[0],r2[1],r2[2],r2[3]);
    	rectangle(r3[0],r3[1],r3[2],r3[3]);
    	MOUSEMSG m;//鼠标指针
    	setrop2(R2_NOTXORPEN);//二元光栅——NOT(屏幕颜色 XOR 当前颜色)
    	while(true)
    	{
    		m = GetMouseMsg();//获取一条鼠标消息
    		if(m.uMsg==WM_LBUTTONDOWN)
    		{
    			for(i=0;i<=10;i++)
    			{
    				setlinecolor(RGB(25*i,25*i,25*i));//设置圆颜色
    				circle(m.x,m.y,2*i);
    				Sleep(25);//停顿2ms
    				circle(m.x,m.y,2*i);//抹去刚刚画的圆
    			}
    			FlushMouseMsgBuff();//清空鼠标消息缓存区
    		}
    	}
    	system("pause");//暂停,为了显示
    	closegraph();
    	return 0;
    }
    
    
    

    在这里插入图片描述
    \qquad每点击鼠标以下,应该可以看到鼠标点击处有一个逐渐扩大并淡出的圆(截图无法清晰,在画面的中右侧),当循环体内Sleep的视觉大于20ms后视觉效果很强。
    \qquad每响应一次鼠标左键单击事件,都会调用一次清空鼠标消息缓存区的函数FlushMouseMsgBuff(),如果没有这个函数会怎么样呢?如果我们快速连续地单击鼠标左键N次,那么特效就会播放N次,如果特效播放速度比单击的速度慢,那么即使你停下来了,程序仍然会接着播放单击特效,因为你的左键单击仍然在鼠标的消息队列m.uMsg中的鼠标消息没有响应完。
    \qquad这里需要解释的是一个二元光栅设置函数setrop2(),二元光栅是混合背景色和当前颜色的模式。我们这里采用的方式是同或(NOT XOR)的方式,若底色为白色(1),则当前颜色不变;若底色是黑色(0),则当前颜色反色。为什么需要采用这种方式呢?因为我们在第二次抹去原来的圆的时候不能采用白色,否则如果背景色原来就为黑(比如按钮和文字),就也会被抹成白色。而背景色与任意一个颜色同或两次都为其本身,即可起到还原背景色的效果。这里的背景色与cleardevice()前面那个背景色不同,这里的是指执行这一条绘画指令之前屏幕上的颜色。

    2.3.2.光标感应

    \qquad我们希望鼠标移到按钮上时按钮会有所变化,移开按钮时又会回到原样。这里我们采用一种简单的填充颜色的方法,就是按钮变色。我们需要解决一个问题就是按钮变色了但是按钮的文字不能被覆盖,那么我们还是需要使用到二元光栅。只是我们这次的模式改成了同或。
    \qquad为了方便起见,存放三个按钮的数组我们合并为了一个二维数组,在鼠标事件中更容易使用和分配任务。

    #include <graphics.h>              // 引用图形库头文件
    #include <conio.h>
    #include <stdio.h>
    #include <windows.h>				//用到了定时函数sleep()
    #include <math.h>
    int r[3][4]={{30,20,130,60},{170,20,220,60},{260,20,310,60}};//三个按钮的二维数组
    
    int button_judge(int x,int y)
    {
    	if(x>r[0][0] && x<r[0][2] && y>r[0][1] && y<r[0][3])return 1;
    	if(x>r[1][0] && x<r[1][2] && y>r[1][1] && y<r[1][3])return 2;
    	if(x>r[2][0] && x<r[2][2] && y>r[2][1] && y<r[2][3])return 3;
    	return 0;
    }
    int main()
    {
    	int i,event=0;
    	short win_width,win_height;//定义窗口的宽度和高度
    	win_width = 480;win_height = 360;
    	initgraph(win_width,win_height);//初始化窗口(黑屏)
    	for(i=0;i<256;i+=5)
    	{
    		setbkcolor(RGB(i,i,i));//设置背景色,原来默认黑色
    		cleardevice();//清屏(取决于背景色)
    		Sleep(15);//延时15ms
    	}
    	RECT R1={r[0][0],r[0][1],r[0][2],r[0][3]};
    	RECT R2={r[1][0],r[1][1],r[1][2],r[1][3]};
    	RECT R3={r[2][0],r[2][1],r[2][2],r[2][3]};
    	LOGFONT f;
    	gettextstyle(&f);					//获取字体样式
    	_tcscpy(f.lfFaceName,_T("宋体"));	//设置字体为宋体
    	f.lfQuality = ANTIALIASED_QUALITY;    // 设置输出效果为抗锯齿  
    	settextstyle(&f);                     // 设置字体样式
    	settextcolor(BLACK);				//BLACK在graphic.h头文件里面被定义为黑色的颜色常量
    	drawtext("输入参数",&R1,DT_CENTER | DT_VCENTER | DT_SINGLELINE);//在矩形区域R1内输入文字,水平居中,垂直居中,单行显示
    	drawtext("运行",&R2,DT_CENTER | DT_VCENTER | DT_SINGLELINE);//在矩形区域R2内输入文字,水平居中,垂直居中,单行显示
    	drawtext("退出",&R3,DT_CENTER | DT_VCENTER | DT_SINGLELINE);//在矩形区域R3内输入文字,水平居中,垂直居中,单行显示
    	setlinecolor(BLACK);
    	rectangle(r[0][0],r[0][1],r[0][2],r[0][3]);
    	rectangle(r[1][0],r[1][1],r[1][2],r[1][3]);
    	rectangle(r[2][0],r[2][1],r[2][2],r[2][3]);
    	MOUSEMSG m;//鼠标指针
    	
    	while(true)
    	{
    		m = GetMouseMsg();//获取一条鼠标消息
    
    		switch(m.uMsg)
    		{
    			case WM_MOUSEMOVE:
    				setrop2(R2_XORPEN);
    				setlinecolor(LIGHTCYAN);//线条颜色为亮青色
    				setlinestyle(PS_SOLID, 3);//设置画线样式为实现,10磅
    				setfillcolor(WHITE);//填充颜色为白色
    				if(button_judge(m.x,m.y)!=0)
    				{
    					if(event != button_judge(m.x,m.y))
    					{
    						event = button_judge(m.x,m.y);//记录这一次触发的按钮
    						fillrectangle(r[event-1][0],r[event-1][1],r[event-1][2],r[event-1][3]);//有框填充矩形(X1,Y1,X2,Y2)
    					}
    				}
    				else
    				{
    					if(event != 0)//上次触发的按钮未被修正为原来的颜色
    					{
    						fillrectangle(r[event-1][0],r[event-1][1],r[event-1][2],r[event-1][3]);//两次同或为原来颜色
    						event = 0;
    					}
    				}
    				break;
    			case WM_LBUTTONDOWN:
    				setrop2(R2_NOTXORPEN);//二元光栅——NOT(屏幕颜色 XOR 当前颜色)
    				for(i=0;i<=10;i++)
    				{
    					setlinecolor(RGB(25*i,25*i,25*i));//设置圆颜色
    					circle(m.x,m.y,2*i);
    					Sleep(30);//停顿30ms
    					circle(m.x,m.y,2*i);//抹去刚刚画的圆
    				}
    				break;
    				FlushMouseMsgBuff();//清空鼠标消息缓存区
    		}
    	}
    	system("pause");//暂停,为了显示
    	return 0;
    }
    
    

    在这里插入图片描述
    \qquad这里我们运用了两次设置二元光栅的函数setrop2,在鼠标的移动条件内(case MOUSEMOVE),我们使用的是屏幕颜色和当前颜色异或,这是为什么呢?因为fillrectangle()函数是画一个有框填充矩形,我们让这个有框填充矩形和原按钮的一样大。由于线条的颜色为亮青色,填充颜色为白色(1),白色的填充颜色和屏幕颜色异或,取的是屏幕颜色的反色。按钮的边框是黑色(0),它与亮青色异或,则会保留原来的亮青色。
    \qquad与同或一样,异或两次等于没有执行操作,所以可以还原到原屏幕画布的颜色。

    2.3.3.进度条

    \qquad既然涉及到进度条了,那么就应该涉及到正式程序了,这里我不想涉及太多的专业知识影响大家理解,但又不能让程序运行得太快以至于看不出进度条的变化,所以我设计了一个简单的弹性球轨迹作图程序。
    \qquad假设球半径为R,初始高度为h0h_0,初速度为0(自由落体),非弹性碰撞时能量损失率为α\alpha。计算部分子函数如下:

    int simulation()
    {
    	float dt = 0.01;//仿真间隔10ms
    	long int N = (long int)(sim_t/dt);//迭代次数
    	float *h=(float*)calloc(N,sizeof(float));//高度
    	float *v=(float*)calloc(N,sizeof(float));//速度(竖直方向)
    	long int i;//迭代变量
    	for(i=1;i<N;i++)
    	{
    		if(h[i-1]>R)//未发生碰撞
    		{
    			v[i]=v[i-1]-9.8*dt;//速度计算
    		}
    		else//发生碰撞,动能损失alpha,速度损失alpha的开方
    		{
    			v[i]=-sqrt(alpha)*v[i-1];	
    		}
    	}
    	free(h);
    	free(v);//释放内存
    	return 0;
    }
    

    \qquad当然,我们还需要绘图网格,定义绘图网格的函数如下:

    void init_figure()
    {
    	int i;
    	setrop2(R2_COPYPEN);//当前颜色
    	setlinecolor(BLACK);
    	setlinestyle(PS_SOLID);//实线
    	rectangle(30,100,420,330);//外框线
    	setlinestyle(PS_DOT);//点线
    	for(i=30+39;i<420;i+=39)
    	{
    		line(i,100,i,330);//竖直辅助线
    	}
    	for(i=100+23;i<330;i+=23)
    	{
    		line(30,i,420,i);//水平辅助线
    	}
    }
    

    \qquad注意,我们使用了rectangle()空心矩形函数绘制网格外框架,使用了line函数依次画出了辅助线。

    \qquad我们现在的目标就是将h的坐标转换到网格上去,绘制出球心的轨迹,这样似乎并不复杂,只需要对simulation()函数稍加修改即可。

    int simulation()
    {
    	float dt = 0.01;//仿真间隔10ms
    	float dy = 230/h0;//单位纵坐标
    	long int N = (long int)(sim_t/dt);//迭代次数
    	float *h=(float*)calloc(N,sizeof(float));//高度
    	float *v=(float*)calloc(N,sizeof(float));//速度(竖直方向)
    	long int i;//迭代变量
    	float process_duty;//进度
    	init_figure();//初始化图像网格
    	setrop2(R2_COPYPEN);//当前颜色
    	//计算步骤
    	h[0]=h0;v[0]=0;
    	for(i=1;i<N;i++)
    	{
    		if(h[i-1]>R)//未发生碰撞
    		{
    			v[i]=v[i-1]-9.8*dt;//速度计算
    		}
    		else//发生碰撞,动能损失alpha,速度损失alpha的开方
    		{
    			v[i]=-sqrt(alpha)*v[i-1];	
    		}
    		h[i]=h[i-1]+v[i]*dt;//高度计算
    		process_duty = (i+1)/(float)(N);
    		putpixel(30+(int)(process_duty*390),330-(int)(h[i]*dy),RED);//画点putpixel(X,Y,color*)
    		Sleep(dt*1000);//延时
    	}
    	free(h);
    	free(v);
    	return 0;
    }
    

    \qquad这里的新函数putpixel(X,Y,color*)是画像素点的函数,适合刻画不连续或不规则的移动轨迹。
    \qquad现在我们只剩下了刻画进度条的函数了,进度条的刷新很明显是应该放在for循环里面的,那么我们采用什么进度条的格式呢?进度条可以有圆形、扇形、长条连续型、长条不连续型等多种,我们这里采用的是环形进度条,将进度数字显示在环中心。请看以下的对simulation()函数改进的代码:

    //仿真运行
    int simulation()
    {
    	char t[3];//百分值的字符
    	char *out_text;//带百分号的百分字符
    	float dt = 0.01;//仿真间隔10ms
    	float dy = 230/h0;//单位纵坐标
    	long int N = (long int)(sim_t/dt);//迭代次数
    	float *h=(float*)calloc(N,sizeof(float));//高度
    	float *v=(float*)calloc(N,sizeof(float));//速度(竖直方向)
    	long int i;//迭代变量
    	float process_duty;//进度
    	RECT r={370,35,400,65};//百分值显示区域的矩形指针
    	init_figure();//初始化图像网格
    	setrop2(R2_COPYPEN);//当前颜色
    	setfillcolor(WHITE);
    	setlinecolor(WHITE);
    	fillrectangle(354,19,411,81);//覆盖原进度条区域
    	setlinestyle(PS_NULL);//无线条
    	setbkmode(TRANSPARENT);//设置文字填充背景为透明
    	//计算步骤
    	h[0]=h0;v[0]=0;
    	BeginBatchDraw();//开始缓存区
    	for(i=1;i<N;i++)
    	{
    		if(h[i-1]>R)//未发生碰撞
    		{
    			v[i]=v[i-1]-9.8*dt;//速度计算
    		}
    		else//发生碰撞,动能损失alpha,速度损失alpha的开方
    		{
    			v[i]=-sqrt(alpha)*v[i-1];	
    		}
    		setfillcolor(WHITE);
    		setlinecolor(WHITE);
    		fillrectangle(354,19,416,81);//覆盖原进度条区域
    		h[i]=h[i-1]+v[i]*dt;//高度计算
    		process_duty = (i+1)/(float)(N);
    		setlinestyle(PS_SOLID);
    		putpixel(30+(int)(process_duty*390),330-(int)(h[i]*dy),RED);
    		setfillcolor(BLUE);
    		setlinestyle(PS_NULL);
    		fillpie(355,20,415,80,0,process_duty*2*PI);
    		setfillcolor(WHITE);
    		fillcircle(385,50,20);
    		sprintf(t,"%d",(int)(process_duty*100.0));//整型转换为字符串
    		out_text = strcat(t,"%");//添加一个百分号
    		drawtext(out_text,&r,DT_CENTER | DT_VCENTER | DT_SINGLELINE);
    		Sleep(dt*1000);
    		FlushBatchDraw();//刷新缓存区
    	}
    	EndBatchDraw();//结束缓存区
    	free(h);
    	free(v);
    	return 0;
    }
    

    \qquad这里我们需要多加载一个头文件<string.h>。
    \qquad首先需要计算进度条的坐标,把环形进度条区域用白色矩形刷新掉,环形进度条需要一个扇形和圆形的组合,扇形的角度是0~360°。这里我们用到了fillpie(X1,Y1,X2,Y2,start_angle,end_angle),前四个参数为椭圆扇形的外接矩形坐标,后两个参数分别为起始角和终止角(弧度制)。每过一次迭代都重新计算终止角(起始角始终为0),即可起到扇形角度逐渐增长的效果,再用一个白色填充圆覆盖中心部分即可变成环形进度条。
    \qquadFlushBatchDraw()函数是刷新缓存区的函数,与BeginBatchDraw()EndBatchDraw()一起使用,如果我们绘图之后不想立即显示,而想批量绘图最后一起刷新画板,用缓存区的方法再合适不过了。

    3.完整代码及效果

    #include <graphics.h>              // 引用图形库头文件
    #include <conio.h>
    #include <stdio.h>
    #include <windows.h>				//用到了定时函数sleep()
    #include <math.h>
    #include <string.h>
    #define PI 3.1416
    int r[3][4]={{30,20,130,60},{170,20,220,60},{260,20,310,60}};//三个按钮的二维数组
    float alpha,R,h0,sim_t;//碰撞时的能量损失率,球的半径、初始高度、仿真时间
    //按钮判断函数
    int button_judge(int x,int y)
    {
    	if(x>r[0][0] && x<r[0][2] && y>r[0][1] && y<r[0][3])return 1;
    	if(x>r[1][0] && x<r[1][2] && y>r[1][1] && y<r[1][3])return 2;
    	if(x>r[2][0] && x<r[2][2] && y>r[2][1] && y<r[2][3])return 3;
    	return 0;
    }
    //初始化图像
    void init_figure()
    {
    	int i;
    	setrop2(R2_COPYPEN);//当前颜色
    	setlinecolor(BLACK);
    	setlinestyle(PS_SOLID);//实线
    	rectangle(30,100,420,330);//外框线
    	setlinestyle(PS_DOT);//点线
    	for(i=30+39;i<420;i+=39)
    	{
    		line(i,100,i,330);//竖直辅助线
    	}
    	for(i=100+23;i<330;i+=23)
    	{
    		line(30,i,420,i);//水平辅助线
    	}
    }
    //仿真运行
    int simulation()
    {
    	char t[3];//百分值的字符
    	char *out_text;
    	float dt = 0.01;//仿真间隔10ms
    	float dy = 230/h0;//单位纵坐标
    	long int N = (long int)(sim_t/dt);//迭代次数
    	float *h=(float*)calloc(N,sizeof(float));//高度
    	float *v=(float*)calloc(N,sizeof(float));//速度(竖直方向)
    	long int i;//迭代变量
    	float process_duty;//进度
    	RECT r={370,35,400,65};//百分值显示区域的矩形指针
    	init_figure();//初始化图像网格
    	setrop2(R2_COPYPEN);//当前颜色
    	setfillcolor(WHITE);
    	setlinecolor(WHITE);
    	fillrectangle(354,19,411,81);//覆盖原进度条区域
    	setlinestyle(PS_NULL);//无线条
    	setbkmode(TRANSPARENT);//设置文字填充背景为透明
    	//计算步骤
    	h[0]=h0;v[0]=0;
    	BeginBatchDraw();//开始缓存区
    	for(i=1;i<N;i++)
    	{
    		if(h[i-1]>R)//未发生碰撞
    		{
    			v[i]=v[i-1]-9.8*dt;//速度计算
    		}
    		else//发生碰撞,动能损失alpha,速度损失alpha的开方
    		{
    			v[i]=-sqrt(alpha)*v[i-1];	
    		}
    		setfillcolor(WHITE);
    		setlinecolor(WHITE);
    		fillrectangle(354,19,416,81);//覆盖原进度条区域
    		h[i]=h[i-1]+v[i]*dt;//高度计算
    		process_duty = (i+1)/(float)(N);
    		setlinestyle(PS_SOLID);
    		putpixel(30+(int)(process_duty*390),330-(int)(h[i]*dy),RED);
    		setfillcolor(BLUE);
    		setlinestyle(PS_NULL);
    		fillpie(355,20,415,80,0,process_duty*2*PI);
    		setfillcolor(WHITE);
    		fillcircle(385,50,20);
    		sprintf(t,"%d",(int)(process_duty*100.0));//整型转换为字符串
    		out_text = strcat(t,"%");//添加一个百分号
    		drawtext(out_text,&r,DT_CENTER | DT_VCENTER | DT_SINGLELINE);
    		Sleep(dt*1000);
    		FlushBatchDraw();//刷新缓存区
    	}
    	EndBatchDraw();//结束缓存区
    	free(h);
    	free(v);
    	return 0;
    }
    
    int main()
    {
    	int i,event=0;
    	char s[30];//输入字符串变量
    	short win_width,win_height;//定义窗口的宽度和高度
    	win_width = 480;win_height = 360;
    	initgraph(win_width,win_height);//初始化窗口(黑屏)
    	for(i=0;i<256;i+=5)
    	{
    		setbkcolor(RGB(i,i,i));//设置背景色,原来默认黑色
    		cleardevice();//清屏(取决于背景色)
    		Sleep(30);//延时30ms
    	}
    	RECT R1={r[0][0],r[0][1],r[0][2],r[0][3]};
    	RECT R2={r[1][0],r[1][1],r[1][2],r[1][3]};
    	RECT R3={r[2][0],r[2][1],r[2][2],r[2][3]};
    	LOGFONT f;//字体样式指针
    	gettextstyle(&f);					//获取字体样式
    	_tcscpy(f.lfFaceName,_T("宋体"));	//设置字体为宋体
    	f.lfQuality = ANTIALIASED_QUALITY;    // 设置输出效果为抗锯齿  
    	settextstyle(&f);                     // 设置字体样式
    	settextcolor(BLACK);				//BLACK在graphic.h头文件里面被定义为黑色的颜色常量
    	drawtext("输入参数",&R1,DT_CENTER | DT_VCENTER | DT_SINGLELINE);//在矩形区域R1内输入文字,水平居中,垂直居中,单行显示
    	drawtext("运行",&R2,DT_CENTER | DT_VCENTER | DT_SINGLELINE);//在矩形区域R2内输入文字,水平居中,垂直居中,单行显示
    	drawtext("退出",&R3,DT_CENTER | DT_VCENTER | DT_SINGLELINE);//在矩形区域R3内输入文字,水平居中,垂直居中,单行显示
    	setlinecolor(BLACK);
    	rectangle(r[0][0],r[0][1],r[0][2],r[0][3]);
    	rectangle(r[1][0],r[1][1],r[1][2],r[1][3]);
    	rectangle(r[2][0],r[2][1],r[2][2],r[2][3]);
    	MOUSEMSG m;//鼠标指针
    	
    	while(true)
    	{
    		m = GetMouseMsg();//获取一条鼠标消息
    
    		switch(m.uMsg)
    		{
    			case WM_MOUSEMOVE:
    				setrop2(R2_XORPEN);
    				setlinecolor(LIGHTCYAN);//线条颜色为亮青色
    				setlinestyle(PS_SOLID, 3);//设置画线样式为实现,10磅
    				setfillcolor(WHITE);//填充颜色为白色
    				if(button_judge(m.x,m.y)!=0)
    				{
    					if(event != button_judge(m.x,m.y))
    					{
    						event = button_judge(m.x,m.y);//记录这一次触发的按钮
    						fillrectangle(r[event-1][0],r[event-1][1],r[event-1][2],r[event-1][3]);//有框填充矩形(X1,Y1,X2,Y2)
    					}
    				}
    				else
    				{
    					if(event!=0)//上次触发的按钮未被修正为原来的颜色
    					{
    						fillrectangle(r[event-1][0],r[event-1][1],r[event-1][2],r[event-1][3]);//两次同或为原来颜色
    						event = 0;
    					}
    				}
    				break;
    			case WM_LBUTTONDOWN:
    				setrop2(R2_NOTXORPEN);//二元光栅——NOT(屏幕颜色 XOR 当前颜色)
    				for(i=0;i<=10;i++)
    				{
    					setlinecolor(RGB(25*i,25*i,25*i));//设置圆颜色
    					circle(m.x,m.y,2*i);
    					Sleep(20);//停顿30ms
    					circle(m.x,m.y,2*i);//抹去刚刚画的圆
    				}
    				//按照按钮判断左键单击后的操作
    				switch(button_judge(m.x,m.y))
    				{
    					//复原按钮原型
    					case 1:
    						InputBox(s,30,"请输入碰撞时的能量损失率、球的半径、初始高度、仿真时间");
    						sscanf(s,"%f%f%f%f",&alpha,&R,&h0,&sim_t);//将输入字符串依次扫描到全局变量里面
    						FlushMouseMsgBuffer();//单击事件后清空鼠标消息
    						break;
    					case 2:
    						simulation();//仿真运行
    						FlushMouseMsgBuffer();//单击事件后清空鼠标消息
    						break;
    					case 3:
    						closegraph();//关闭绘图环境
    						exit(0);//正常退出
    					default:
    						FlushMouseMsgBuffer();//单击事件后清空鼠标消息
    						//printf("\r\n(%d,%d)",m.x,m.y);//打印鼠标坐标,方便调试时确定区域
    						break;
    				}
    				break;
    		}
    	}
    	return 0;
    }
    
    

    在这里插入图片描述
    在这里插入图片描述
    希望本文对您有帮助,谢谢阅读。

    展开全文
  • 一般图纸设计中的时候,在CAD中有时我们想得到直线或曲线的等分点,有时我们想沿直线或曲线等距或等分排列图形,这个时候该怎么办呢?但其实在CAD很早的版本就提供了定数等分和定距等分的功能,可能只是大家没有发现...

    一般图纸设计中的时候,在CAD中有时我们想得到直线或曲线的等分点,有时我们想沿直线或曲线等距或等分排列图形,这个时候该怎么办呢?但其实在CAD很早的版本就提供了定数等分和定距等分的功能,可能只是大家没有发现而已,按照常理大家认为这个功能应该归到“修改”命令中,但CAD的这两个功能隐藏在“绘图”菜单中,而且作为“点”对象的两个子功能,也就是在等分的同时通常会生成点对象,那下面就给大家演示一下具体教程。
    第一步:在你的电脑桌面上快速运行迅捷CAD编辑器,并在软件界面中快速新建或者【ctrl+n】一张CAD空白图纸。
    这里写图片描述

    第二步:在CAD图纸新建好之后,在上方的界面中找到【绘图】,在标注指示下,快速的画好一一段曲线,方便进行下一步的操作。
    这里写图片描述

    第三步:曲线绘制完成完成之后,下面的命令框中输入DIV.并选择相应的属性即可。这里写图片描述

    第四步:然后我们直接点击图中的线段,在弹出的窗口设置中,点击相对应的的属性就可以自动的进行等分了。
    这里写图片描述

    操作方法是不是很简单,其实上面的提示说明都是很详细得了,只要跟着具体的提示,就不会出现相应的问题了,上面的操作演示方法还有很多,还有疑问的话,点击【相关教程】就会有相应的问题解答哦。快来试一试吧。

    展开全文
  • 一、二维图形变化之基本知识 本章涉及向量、世界坐标系、用户坐标系、窗口与视区、齐次坐标、二维变换 。需要掌握的知识点有: 向量、矩阵以及它们的运算 坐标系的概念和坐标系之间的变换齐次坐标的概念二维...
  • 一、三维物体基本几何变换 主要讨论如下几个问题 :如何对三维图形进行方向、尺寸和形状方面的变换 ?三维物体如何在二维输出设备上输出 ?通过三维图形变换,可由简单图形得到复杂图形,三维图形变换则分为三维...
  • 真实图形学(光照模型)

    万次阅读 多人点赞 2018-04-30 11:54:14
    真实感图形学,简单地说,就是希望用计算机生成像照相机拍的照片一样逼真的图形图像 。要实现这个目标,需要三部曲: 第一步:建立三维场景(建模); 第二步:消隐解决物体深度的显示及确定物体之内的相互关系;...
  • 不规则物体形状匹配综述

    千次阅读 2015-08-13 23:03:25
    物体识别是计算机视觉应用的一项基本任务。识别通常基于目标物体的灰度信息、颜色信息或形状信息。物体识别的目的就是要找到一...根据匹配对象的不同,可以将不规则物体的形状匹配分为基于区域的匹配方法和基于轮廓的匹
  • 接上文 计算机图形学 学习笔记(六):消隐算法:Z-buffer,区间扫描线,Warnock,光栅图形学小结在图形学中,有两大基本工具:向量分析,图形变换。本文将重点讲解向量和二维图形的变换。5.1 向量基础知识我们所...
  • 图形学简介

    千次阅读 2011-10-29 11:26:42
    一、什么是计算机图形学  计算机图形学(Computer Graphics,简称CG)是一种使用数学算法将二维或三维图形转化为计算机显示器的栅格形式的科学。简单地说,计算机图形学的主要研究内容就是研究如何在计算机中表示...
  • esri-leaflet入门教程(5)-...但如果要做一列的地图交互操作或者动态渲染等,那就必须使用地图区域跳转、查询结果渲染、动态添加图形等多种交互手段。而这些交互手段基本上离开一些非服务类型的数据加载,我们可以将
  • opencv11-计算不规则图像的质心

    千次阅读 2017-08-11 16:31:00
    不规则区域的矩,表示一个归一化的灰度级图像函数理解为一个二维随机变量的概率密度。 这个随机变量的属性可以用统计特征-矩(moments)来描述。通过假设非零的像素值表示区域,矩可以用于二值或灰度级的区域...
  • 计算机图形

    千次阅读 2018-10-16 19:06:24
    本文转载自:http://blog.csdn.net/hcbbt/article/details/42779341 计算机图形学 复习笔记 ...第一章 计算机图形学综述 研究内容 图形的概念:计算机图形学的研究对象 能在人的视觉系统中产生视觉印象...
  • 的方式将问题转化为矩形排样,但是对于大尺寸不规则图形,边角空间有很大的浪费,利用率不高。 网格划分:将object和shapes划分成网格,并使用0-1矩阵来描述空间被占用的情况,再进行优化。划分粒度对结果影响较大...
  • 第五章 基本图形生成算法如何在指定的输出设备上根据坐标描述构造基本二维几何图形(点、直线、圆、椭圆、多边形域、字符串及其相关属性)。 图形生成的概念图形的生成:是在指定的输出设备上,根据坐标描述构造...
  • 平面图形任意变形问题的解决方案

    千次阅读 2005-10-10 10:05:00
    http://61.186.252.131/expert/topic/886/886049.xml?temp=.9779779可惜没有写出源代码,但我相信此解决...MSN(Email): a3news#hotmail.com相关问题:在C#用GDI+实现图形图像的任意变形效果? ---------------------
  • 入门图形学:图形学原理(三)

    千次阅读 2018-05-06 21:32:32
    之前我们了解了计算机图形显示所需要的两个重要硬件(显示器和GPU),现在我们就来学习下到底GPU是怎么应用数据处理好并输出给显示器进行图形显示的。 目前我们只能浅层次的了解图形显示的这个过程,就跟工厂...
  •   2019-01-22 15:32:10 ...由于高度复杂但信息丰富的图形结构,图形上的机器学习一直以来都是一项艰巨的任务。本文是关于如何使用图形卷积网络(GCN)进行图形深度学习的系列文章中的第二篇。...
  • 我的专业是计算机辅助设计(CAD),算是一半机械一半软件,《计算机图形学》是必修课,也是我最喜欢的课程。热衷于用代码摆平一切的我几乎将这本教科书上的每种算法都实现了一遍,这种重复劳动虽然意义不大,但是...
  • * 裁剪名称都可以在ENVI5.1新版界面右边栏的toolbox中搜索得到 第一种方法:利用Resize Data...第二种方法:利用Subset Data via ROIs进行规则或不规则裁剪。 (在envi5.1可以直接用矢量数据对栅格影像进行裁剪,而不
  • 3D图形渲染管线

    万次阅读 2010-03-25 21:34:00
    图形渲染管线的各个阶段到底做了些什么,总是甚清楚,每次翻书查阅,但是过了一阵遇到还是翻书,这次看Cg教程里写的不错,特地摘下来,以备查阅。 -by shenzi/2010.3.25 3D图形渲染管线 什么是渲染...
  • 光栅图形学算法——裁剪算法

    千次阅读 2017-07-15 00:05:24
    使用计算机处理图形信息时,计算机内部存储的图形往往比较大,而屏幕...最简单的裁剪方法是各种图形扫描转换为点之后,再判断点是否在窗口内。 点的裁剪        对于任意一点P(x,y),若满足下列两队不等式:
  • GuiPing图形化网络测试

    千次阅读 2016-05-15 13:18:25
    (1)进行连续ping时无法查看最大值、最小值、平均值参数; (2)具有图表功能,无法分析某段较长时间内的网络稳定性; 所以作者根据一些特定的需求,以易用性为主,设计了此免费的图形化软件,其特点如下: (1...
  • 计算机图形学发展史与现状

    万次阅读 2014-10-09 12:28:45
    图形学也称计算机图形学,它是研究图形的输入、模型(图形对象)的构造和表示、图形数据库管理、图形数据通信、图形的操作、图形数据的分析,以及如何以图形信息为媒介实现人机交互作用的方法、技术和应用的一门学科。...
  • 什么是计算机图形学?

    千次阅读 2016-06-06 12:49:54
    什么是计算机图形学? 刘利刚 中国科技大学 ...   ...【注】 由于时常有本科学生来向...本文仅仅为笔者对计算机图形学浅薄的理解,涉及对概念的定义,是非学术性的。因此,笔者尽量尝试用通俗的语言介绍一下计算机图
  • visio中自己绘制的图形填充颜色

    千次阅读 2020-04-19 00:27:43
    在使用visio画图时经常需要根据自己需求绘制不规则图形,关于这类图形的颜色填充说明如下: (1)准备工作 检查visio软件中是否有“开发工具”选项,填充过程中需要用到, 如果没有的话需要如下步骤添加上 “文件”...
  • 【例题】下面的六个图形分为两类,使每一类图形都有各目的共同特征或规律,分类正确的一项∶() A.①②④,③⑤⑥ B.①②⑤,③④⑥ D.①③⑥,②④⑤ C.①③④,②⑤⑥ 解析:观察图形可知①③⑥中直线与曲线的...
  • 实现 全选 、 全选 、 删除功能.rar │ │ Listview,Gridview空数据处理.zip │ │ listview下拉刷新加载更多.zip │ │ ListView停止滚动开启下载图片.zip │ │ Listview分页加载数据.rar │ │ ...
  • 求交算法是计算机图形学的核心算法,也是体现速度和稳定性的重要标志,高效并且稳定的求交算法是任何一个CAD软件都必需要重点关注的。求交包含两层概念,一个是判断是否相交,另一个是求出交点。直线(段)的求交...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 77,865
精华内容 31,146
关键字:

怎么把不规则图形等分